lang: Have IRMetadta reference classes

This commit is contained in:
Jookia 2024-04-10 08:59:56 +10:00
parent 074be7fa4a
commit d2726005da

View file

@ -475,13 +475,14 @@ class IRJumpAlways():
return 'IRJumpAlways(name=%s)' % (self.name)
class IRMetadata():
def __init__(self, id, name, uses):
def __init__(self, id, name, uses, classes_):
self.id = id
self.name = name
self.uses = uses
self.classes_ = classes_
def __repr__(self):
return 'IRMetadata(id=%s, name=%s, uses=%s)' % (self.id, self.name, self.uses)
return 'IRMetadata(id=%s, name=%s, uses=%s, classes=%s)' % (self.id, self.name, self.uses, self.classes_)
class IRClass():
def __init__(self, name, functions):
@ -627,7 +628,7 @@ def generate_ir_function(ast):
return IRFunction(public, class_, name, ast.args, ir)
def generate_ir_metadata(ast):
return IRMetadata(ast.id, ast.name, ast.uses)
return IRMetadata(ast.id, ast.name, ast.uses, [])
def generate_ir(ast):
ir = []
@ -715,6 +716,21 @@ def assign_classes(ir):
new_ir = update_classes(old_ir, mapped_classes)
return new_ir
def update_metadata(old_ir):
ir = []
classes_ = []
old = None
for node in old_ir:
if isinstance(node, IRClass):
classes_.append(node)
if isinstance(node, IRMetadata):
old = node
continue
ir.append(node)
metadata = IRMetadata(old.id, old.name, old.uses, classes_)
ir.append(metadata)
return ir
## Register allocation
# Register allocation here is very simple: Each variable gets one stack slot
@ -1071,7 +1087,11 @@ def compile(code, id):
if ir_class is None:
print("Failed to generate classes")
return None
ir_reg = registers_allocate(module_args, ir_class)
ir_meta = update_metadata(ir_class)
if ir_meta is None:
print("Failed to generate metadata")
return None
ir_reg = registers_allocate(module_args, ir_meta)
if ir_reg is None:
print("Failed to allocate registers")
return None