lang: Have IRMetadta reference classes
This commit is contained in:
parent
074be7fa4a
commit
d2726005da
1 changed files with 24 additions and 4 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue