diff --git a/lang/compile.py b/lang/compile.py index 895700b..7aae44b 100755 --- a/lang/compile.py +++ b/lang/compile.py @@ -475,13 +475,14 @@ 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 @@ 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 @@ 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 @@ 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