Update metaprogram to automatically update changes
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user