|
@@ -159,6 +159,21 @@ class ModelverseKernel(object):
|
|
|
yield [("CALL", [gen])]
|
|
|
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):
|
|
|
"""Gets a generator for the given instruction in the given phase,
|
|
|
for the specified task root."""
|
|
@@ -248,10 +263,10 @@ class ModelverseKernel(object):
|
|
|
str_value, = yield [("RV", [value])]
|
|
|
if str_value:
|
|
|
# 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
|
|
|
- print("Resolving global: " + str(str_value))
|
|
|
else:
|
|
|
# Is a local
|
|
|
instruction = "var_%s" % value
|
|
@@ -267,10 +282,11 @@ class ModelverseKernel(object):
|
|
|
if prev_var:
|
|
|
# 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!
|
|
|
- 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":
|
|
|
func_name, = yield [("RD", [inst, "func"])]
|
|
@@ -297,7 +313,7 @@ class ModelverseKernel(object):
|
|
|
value = "func_result_" + str(ModelverseKernel.counter)
|
|
|
ModelverseKernel.counter += 1
|
|
|
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:
|
|
|
# No indent, meaning that we use it inline
|
|
@@ -375,15 +391,7 @@ class ModelverseKernel(object):
|
|
|
|
|
|
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
|
|
|
task_frame, = yield [("RD", [task_root, "frame"])]
|
|
|
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]
|
|
|
|
|
|
parameters = dict(list(zip(dict_keys, dict_values)))
|
|
|
+ parameters.update(params)
|
|
|
|
|
|
parameters["root"] = self.root
|
|
|
parameters["task_root"] = task_root
|