Browse Source

Make the kernel try and find function names for the JIT

jonathanvdc 8 years ago
parent
commit
a04d32cca5
1 changed files with 21 additions and 1 deletions
  1. 21 1
      kernel/modelverse_kernel/main.py

+ 21 - 1
kernel/modelverse_kernel/main.py

@@ -19,6 +19,11 @@ class ModelverseKernel(object):
         self.allow_compiled = True
         #self.allow_compiled = False
 
+        # suggested_function_names maps body ids to suggested function names.
+        # You tell the kernel to stop caring about getting the function names
+        # right by setting this to `None`.
+        self.suggested_function_names = {}
+
         # `self.jit` handles most JIT-related functionality.
         self.jit = jit.ModelverseJit()
         if self.allow_compiled:
@@ -143,9 +148,15 @@ class ModelverseKernel(object):
         parameters["username"] = username
         parameters["mvk"] = self
 
+        # Try to retrieve the suggested name.
+        if self.suggested_function_names is not None and inst in self.suggested_function_names:
+            suggested_name = self.suggested_function_names[inst]
+        else:
+            suggested_name = None
+
         # Have the JIT compile the function.
         try:
-            jit_gen = self.jit.jit_compile(user_root, inst)
+            jit_gen = self.jit.jit_compile(user_root, inst, suggested_name)
             inp = None
             while 1:
                 inp = yield jit_gen.send(inp)
@@ -468,6 +479,15 @@ class ModelverseKernel(object):
                     compiler_body, = yield [("RD", [compiler_val, "body"])]
                     self.jit.register_compiled(compiler_body, compiled_function, var_name)
 
+            # If we're dealing with a function, then we might want to figure out what its body id
+            # is now so we can suggest a name to the JIT later.
+            if self.suggested_function_names is not None:
+                compiler_val, =  yield [("RD", [variable, "value"])]
+                if compiler_val is not None:
+                    compiler_body, = yield [("RD", [compiler_val, "body"])]
+                    if compiler_body is not None:
+                        self.suggested_function_names[compiler_body] = var_name
+
         else:
             phase_link, returnvalue_link, new_phase = \
                             yield [("RDE", [user_frame, "phase"]),