Update metaprogram to automatically update changes

This commit is contained in:
Krzosa Karol
2022-06-22 23:42:33 +02:00
parent a36747bc9c
commit 05504cbf11
2 changed files with 122 additions and 80 deletions

View File

@@ -1,8 +1,4 @@
result = """
//
// Generated using code_generating_script.py
//
"""
result = ""
sizes = ["64", "32", "16", "8"]
types = ["S64", "U64", "F64"]
@@ -20,10 +16,45 @@ def should_skip(T, op):
and op != "GT" and op != "LT" and op != "GTE" and op != "LTE":
return True
def update_file(filename, comment_name, data_to_write):
begin = f"""//
// *Begin* of {comment_name} generated using code_generating_script.py
//
"""
end = f"""
//
// *End* of {comment_name} generated using code_generating_script.py
//"""
with open(filename, 'r+') as file:
data = file.read()
file.seek(0)
begin_index = data.find(begin)
end_index = data.find(end)
if begin_index == -1 or end_index == -1:
print(f"Error: Couldn't find comment: {comment_name}")
exit(0)
end_index += len(end)
with open('backup', 'a') as backup:
backup.write(f"\n*** FILE = {filename} NAME = {comment_name} ***")
backup.write(f"\n*** FILE = {filename} NAME = {comment_name} ***")
backup.write(f"\n*** FILE = {filename} NAME = {comment_name} ***")
backup.write(data)
a_part = data[0:begin_index]
b_part = data[begin_index:end_index]
c_part = data[end_index:-1]
data_to_write = begin + data_to_write + end
file.write(a_part + data_to_write + c_part)
file.truncate()
#
# Generate enum
#
if False:
enum_members = []
enum_members.append("BC_END_OF_INSTRUCTIONS")
@@ -31,6 +62,7 @@ if False:
enum_members.append("BC_PUSH_STACK")
enum_members.append("BC_LOAD_CONSTANT")
enum_members.append("BC_STORE_CONSTANT")
enum_members.append("BC_CALL")
load_store = ["LOAD_FROM_MEMORY", "STORE_TO_MEMORY"]
for op in load_store:
@@ -42,7 +74,6 @@ if False:
if should_skip(T, op):
continue
enum_members.append(f"BC_{op}_{T}")
result += "\n"
result += "enum Operation: U16{\n"
for i in enum_members:
@@ -53,6 +84,7 @@ if False:
for i in enum_members:
result += f" \"{i}\",\n"
result += "};\n"
update_file("bytecode_interpreter.cpp", "enum", result)
#
# Generate switch cases
@@ -71,9 +103,9 @@ if True:
if symbol == "~":
result += f"""
case BC_{op_name}_{T}:{{
{T} left = ({T})b->registers[instr->a].{t};
{T} left = ({T})b->registers[instr->index_a].{t};
{T} result = {symbol}left;
{T} *dst = b->registers[instr->dst].pointer_{t};
{T} *dst = b->registers[instr->index_c].pointer_{t};
*dst = result;
bc_log("{symbol} [{sign}] = [{sign}]", left, result);
}}break;
@@ -85,25 +117,21 @@ if True:
# Binary operation
result += f"""
case BC_{op_name}_{T}:{{
{T} left = b->registers[instr->a].{t};
{T} right = b->registers[instr->b].{t};
{T} left = b->registers[instr->index_a].{t};
{T} right = b->registers[instr->index_b].{t};
{T} result = left {symbol} right;
b->registers[instr->dst].{t} = result;
bc_log("r%s + r%s = r%s => [{sign}] {symbol} [{sign}] = [{sign}]", instr->a, instr->b, instr->dst, left, right, result);
b->registers[instr->index_c].{t} = result;
bc_log("r%s + r%s = r%s => [{sign}] {symbol} [{sign}] = [{sign}]", instr->index_a, instr->index_b, instr->index_c, left, right, result);
}}break;
"""
################################
result += """
//
// **End** of generated using code_generating_script.py
//
"""
update_file("bytecode_interpreter.cpp", "switch_cases", result)
#
# Copy to **WINDOWS** clipboard
#
import subprocess
subprocess.run("clip", universal_newlines=True, input=result)
# #
# # Copy backup to **WINDOWS** clipboard
# #
# import subprocess
# subprocess.run("clip", universal_newlines=True, input=data)