Browse Source

Implement global resolution, declaration in CFG->tree lowering

jonathanvdc 8 years ago
parent
commit
ae71d56566
1 changed files with 36 additions and 0 deletions
  1. 36 0
      kernel/modelverse_jit/cfg_to_tree.py

+ 36 - 0
kernel/modelverse_jit/cfg_to_tree.py

@@ -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,