|
@@ -370,6 +370,40 @@ class LoweringState(object):
|
|
return tree_ir.LoadLocalInstruction(
|
|
return tree_ir.LoadLocalInstruction(
|
|
self.local_name_map.get_local_name(value.variable.node_id))
|
|
self.local_name_map.get_local_name(value.variable.node_id))
|
|
|
|
|
|
|
|
+ def lower_declare_global(self, value):
|
|
|
|
+ """Lowers a 'declare-global' value."""
|
|
|
|
+ #
|
|
|
|
+ # global_var, = yield [("CN", [])]
|
|
|
|
+ # _globals, = yield [("RD", [task_root, "globals"])]
|
|
|
|
+ # yield [("CD", [_globals, var_name, global_var])]
|
|
|
|
+ #
|
|
|
|
+ task_root = bytecode_to_tree.retrieve_task_root()
|
|
|
|
+ global_var = tree_ir.StoreLocalInstruction(None, tree_ir.CreateNodeInstruction())
|
|
|
|
+ return tree_ir.create_block(
|
|
|
|
+ global_var.create_store(
|
|
|
|
+ tree_ir.CreateNodeInstruction()),
|
|
|
|
+ tree_ir.CreateDictionaryEdgeInstruction(
|
|
|
|
+ tree_ir.ReadDictionaryValueInstruction(
|
|
|
|
+ task_root.create_load(),
|
|
|
|
+ tree_ir.LiteralInstruction('globals')),
|
|
|
|
+ tree_ir.LiteralInstruction(
|
|
|
|
+ value.variable.name),
|
|
|
|
+ global_var.create_load()),
|
|
|
|
+ global_var.create_load())
|
|
|
|
+
|
|
|
|
+ def lower_resolve_global(self, value):
|
|
|
|
+ """Lowers a 'resolve-global' value."""
|
|
|
|
+ #
|
|
|
|
+ # _globals, = yield [("RD", [task_root, "globals"])]
|
|
|
|
+ # global_var, = yield [("RD", [_globals, var_name])]
|
|
|
|
+ #
|
|
|
|
+ task_root = bytecode_to_tree.retrieve_task_root()
|
|
|
|
+ return tree_ir.ReadDictionaryValueInstruction(
|
|
|
|
+ tree_ir.ReadDictionaryValueInstruction(
|
|
|
|
+ task_root.create_load(),
|
|
|
|
+ tree_ir.LiteralInstruction('globals')),
|
|
|
|
+ tree_ir.LiteralInstruction(value.variable.name))
|
|
|
|
+
|
|
def lower_alloc_root_node(self, value):
|
|
def lower_alloc_root_node(self, value):
|
|
"""Lowers an 'alloc-root-node' value."""
|
|
"""Lowers an 'alloc-root-node' value."""
|
|
local_name = tree_ir.VariableName(self.__get_root_node_name(value))
|
|
local_name = tree_ir.VariableName(self.__get_root_node_name(value))
|
|
@@ -431,6 +465,8 @@ class LoweringState(object):
|
|
cfg_ir.CheckLocalExists : lower_check_local_exists,
|
|
cfg_ir.CheckLocalExists : lower_check_local_exists,
|
|
cfg_ir.DeclareLocal : lower_declare_local,
|
|
cfg_ir.DeclareLocal : lower_declare_local,
|
|
cfg_ir.ResolveLocal : lower_resolve_local,
|
|
cfg_ir.ResolveLocal : lower_resolve_local,
|
|
|
|
+ cfg_ir.DeclareGlobal : lower_declare_global,
|
|
|
|
+ cfg_ir.ResolveGlobal : lower_resolve_global,
|
|
cfg_ir.AllocateRootNode : lower_alloc_root_node,
|
|
cfg_ir.AllocateRootNode : lower_alloc_root_node,
|
|
cfg_ir.DeallocateRootNode : lower_free_root_node,
|
|
cfg_ir.DeallocateRootNode : lower_free_root_node,
|
|
cfg_ir.LoadPointer : lower_load_pointer,
|
|
cfg_ir.LoadPointer : lower_load_pointer,
|