Sfoglia il codice sorgente

Fixed resolving of globals in JIT

Yentl Van Tendeloo 7 anni fa
parent
commit
05bc4c6d3a
2 ha cambiato i file con 27 aggiunte e 18 eliminazioni
  1. 26 17
      kernel/modelverse_kernel/main.py
  2. 1 1
      wrappers/modelverse_SCCD.py

+ 26 - 17
kernel/modelverse_kernel/main.py

@@ -159,6 +159,21 @@ class ModelverseKernel(object):
             yield [("CALL", [gen])]
             yield [("CALL", [gen])]
             yield [("END_TRY", [])]
             yield [("END_TRY", [])]
 
 
+    def execute_jit_internal(self, task_root, inst, taskname, params):
+        print("EXEC INTERNAL")
+        gen = self.execute_jit(task_root, inst, taskname, params)
+        print("Got generator: " + str(gen))
+
+        def handle_jit_failed(exception):
+            # Try again, but this time without the JIT.
+            gen = self.get_inst_phase_generator(inst_v, self.phase_v, task_root)
+            yield [("TAIL_CALL", [gen])]
+
+        yield [("TRY", [])]
+        yield [("CATCH", [jit.JitCompilationFailedException, handle_jit_failed])]
+        yield [("CALL", [gen])]
+        yield [("END_TRY", [])]
+
     def get_inst_phase_generator(self, inst_v, phase_v, task_root):
     def get_inst_phase_generator(self, inst_v, phase_v, task_root):
         """Gets a generator for the given instruction in the given phase,
         """Gets a generator for the given instruction in the given phase,
            for the specified task root."""
            for the specified task root."""
@@ -248,10 +263,10 @@ class ModelverseKernel(object):
             str_value, = yield [("RV", [value])]
             str_value, = yield [("RV", [value])]
             if str_value:
             if str_value:
                 # Is a global
                 # Is a global
-                prev = "  " * nested_indent + "_globs, = yield [('RD', [kwargs['root'], '__globals'])]\n" + \
-                       "  " * nested_indent + "%s, = yield [('RD', [_globs, '%s'])]\n" % (str_value, str_value)
+                prev = "  " * nested_indent + "_globs, = yield [('RD', [kwargs['task_root'], 'globals'])]\n" + \
+                       "  " * nested_indent + "%s, = yield [('RD', [_globs, '%s'])]\n" % (str_value, str_value) + \
+                       "  " * nested_indent + "%s, = yield [('RD', [%s, 'var'])]\n" % (str_value, str_value)
                 instruction = str_value
                 instruction = str_value
-                print("Resolving global: " + str(str_value))
             else:
             else:
                 # Is a local
                 # Is a local
                 instruction = "var_%s" % value
                 instruction = "var_%s" % value
@@ -267,10 +282,11 @@ class ModelverseKernel(object):
             if prev_var:
             if prev_var:
                 # Got something to do before the variable is usable, so this is a global!
                 # Got something to do before the variable is usable, so this is a global!
                 # Therefore we actually do the operation in the Modelverse as well!
                 # Therefore we actually do the operation in the Modelverse as well!
-                prev = "  " * nested_indent + "_globs = yield [('RD', [kwargs['root'], '__globals'])]\n" + \
-                       "  " * nested_indent + "_old_edge = yield [('RDE', [_globs, '%s'])]\n" % (instruction_var) + \
-                       "  " * nested_indent + "yield [('DE', [_old_edge])]\n" + \
-                       "  " * nested_indent + "yield [('CD', [_globs, '%s', %s])]\n" % (instruction_var, instruction_val)
+                prev = "  " * nested_indent + "_globs, = yield [('RD', [kwargs['task_root'], 'globals'])]\n" + \
+                       "  " * nested_indent + "_var, = yield [('RD', [_globs, '%s'])]\n" % instruction_var + \
+                       "  " * nested_indent + "_old_edge, = yield [('RDE', [_var, 'var'])]\n" + \
+                       "  " * nested_indent + "yield [('CD', [_var, 'var', %s])]\n" % instruction_var + \
+                       "  " * nested_indent + "yield [('DE', [_old_edge])]\n"
 
 
         elif inst_type["value"] == "call":
         elif inst_type["value"] == "call":
             func_name, = yield [("RD", [inst, "func"])]
             func_name, = yield [("RD", [inst, "func"])]
@@ -297,7 +313,7 @@ class ModelverseKernel(object):
                 value = "func_result_" + str(ModelverseKernel.counter)
                 value = "func_result_" + str(ModelverseKernel.counter)
                 ModelverseKernel.counter += 1
                 ModelverseKernel.counter += 1
                 param_list = "{" + ", ".join(["'%s': %s" % (k, v) for k, v in param_list.items()]) + "}"
                 param_list = "{" + ", ".join(["'%s': %s" % (k, v) for k, v in param_list.items()]) + "}"
-                actual_computation = "%s, = yield [('CALL_KWARGS', [%s, dict(%s.items() + kwargs.items())])]\n" % (value, func_name, param_list)
+                actual_computation = "%s, = yield [('CALL_ARGS', [kwargs['mvk'].execute_jit_internal, (kwargs['task_root'], %s, kwargs['taskname'], %s)])]\n" % (value, func_name, param_list)
 
 
                 if indent == 0:
                 if indent == 0:
                     # No indent, meaning that we use it inline
                     # No indent, meaning that we use it inline
@@ -375,15 +391,7 @@ class ModelverseKernel(object):
 
 
         raise primitive_functions.PrimitiveFinished(compiled_func)
         raise primitive_functions.PrimitiveFinished(compiled_func)
 
 
-        """
-        try:
-            raise primitive_functions.PrimitiveFinished(compiled_func)
-        except Exception as e:
-            print("Exception: " + str(e))
-            raise jit.JitCompilationFailedException("FAIL")
-        """
-
-    def execute_jit(self, task_root, inst, taskname):
+    def execute_jit(self, task_root, inst, taskname, params = {}):
         # execute_jit
         # execute_jit
         task_frame, =    yield [("RD", [task_root, "frame"])]
         task_frame, =    yield [("RD", [task_root, "frame"])]
         symbols, =       yield [("RD", [task_frame, "symbols"])]
         symbols, =       yield [("RD", [task_frame, "symbols"])]
@@ -394,6 +402,7 @@ class ModelverseKernel(object):
         dict_values = yield [("RD", [i, "value"]) for i in dict_values_elem]
         dict_values = yield [("RD", [i, "value"]) for i in dict_values_elem]
 
 
         parameters = dict(list(zip(dict_keys, dict_values)))
         parameters = dict(list(zip(dict_keys, dict_values)))
+        parameters.update(params)
 
 
         parameters["root"] = self.root
         parameters["root"] = self.root
         parameters["task_root"] = task_root
         parameters["task_root"] = task_root

+ 1 - 1
wrappers/modelverse_SCCD.py

@@ -1,7 +1,7 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Mon Apr  9 11:16:51 2018
+Date:   Mon Apr  9 11:49:33 2018
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server