فهرست منبع

Allow the input to be JITed as well through a specific function call. It looks ugly, but it works, as shown by the construct_const compiled variant.

Yentl Van Tendeloo 8 سال پیش
والد
کامیت
3aee97f890
3فایلهای تغییر یافته به همراه38 افزوده شده و 1 حذف شده
  1. 1 1
      integration/utils.py
  2. 34 0
      kernel/modelverse_kernel/compiled.py
  3. 3 0
      kernel/modelverse_kernel/main.py

+ 1 - 1
integration/utils.py

@@ -127,7 +127,7 @@ def run_file(files, parameters, expected, mode):
                 compile_file(address, mod_filename, filename, mode, proc)
 
             # After the first file, which can be whatever we want, we just have to compile dependencies, all of which are PO for efficiency
-            mode = "PO"
+            #mode = "PO"
 
         if parallel_push:
             for t in threads:

+ 34 - 0
kernel/modelverse_kernel/compiled.py

@@ -418,3 +418,37 @@ def check_symbols(a, b, c, **remainder):
 
     result, = yield [("CNV", ["OK"])]
     raise PrimitiveFinished(result)
+
+def construct_const(**remainder):
+    v, = yield [("CNV", [{"value": "constant"}])]
+
+    # Get input: keep trying until we get something
+    try:
+        gen = __get_input(remainder)
+        inp = None
+        while 1:
+            inp = yield gen.send(inp)
+    except PrimitiveFinished as e:
+        inp = e.result
+
+    yield [("CD", [v, "node", inp])]
+
+    raise PrimitiveFinished(v)
+
+def __get_input(parameters):
+    mvk = parameters["mvk"]
+    user_root = parameters["user_root"]
+    while 1:
+        try:
+            gen = mvk.input_init(user_root)
+            inp = None
+            while 1:
+                inp = yield gen.send(inp)
+        except StopIteration:
+            # Finished
+            if mvk.success:
+                # Got some input, so we can access it
+                raise PrimitiveFinished(mvk.input_value)
+            else:
+                # No input, so yield None but don't stop
+                yield None

+ 3 - 0
kernel/modelverse_kernel/main.py

@@ -113,6 +113,7 @@ class ModelverseKernel(object):
         parameters["root"] = self.root
         parameters["user_root"] = user_root
         parameters["username"] = username
+        parameters["mvk"] = self
 
         # prim is a generator itself!
         try:
@@ -885,8 +886,10 @@ class ModelverseKernel(object):
                                ("DE", [returnvalue_link]),
                                ("DE", [phase_link]),
                               ]
+            self.input_value = value
         else:
             # No input yet, so just wait and don't advance IP or phase
+            self.input_value = None
             self.success = False
 
     def output_init(self, user_root):