Explorar o código

Update to use RETURN instead of PrimitiveFinished, but broke everything

Yentl Van Tendeloo %!s(int64=7) %!d(string=hai) anos
pai
achega
c91d6b31a0

+ 74 - 37
kernel/modelverse_kernel/compiled.py

@@ -49,7 +49,8 @@ def get_superclasses(a, b, **remainder):
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
     yield [("CD", [result, i, result]) for i in found]
     yield [("CD", [result, i, result]) for i in found]
 
 
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def reverseKeyLookupMulti(a, b, **remainder):
 def reverseKeyLookupMulti(a, b, **remainder):
     if "value" not in b:
     if "value" not in b:
@@ -70,7 +71,8 @@ def reverseKeyLookupMulti(a, b, **remainder):
     edges = yield [("CE", [result, result]) for value in values]
     edges = yield [("CE", [result, result]) for value in values]
     yield [("CE", [edge, value[1]]) for edge, value in zip(edges, values)]
     yield [("CE", [edge, value[1]]) for edge, value in zip(edges, values)]
 
 
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def reverseKeyLookup(a, b, **remainder):
 def reverseKeyLookup(a, b, **remainder):
     edges_out, edges_in = yield [("RO", [a['id']]), ("RI", [b['id']])]
     edges_out, edges_in = yield [("RO", [a['id']]), ("RI", [b['id']])]
@@ -82,9 +84,11 @@ def reverseKeyLookup(a, b, **remainder):
         # Select one option randomly
         # Select one option randomly
         out_edge = out_edges.pop()
         out_edge = out_edges.pop()
         e, = yield [("RE", [out_edge])]
         e, = yield [("RE", [out_edge])]
-        raise PrimitiveFinished({'id': e[1]})
+        #raise PrimitiveFinished({'id': e[1]})
+        yield [("RETURN", [{'id': e[1]}])]
     else:
     else:
-        raise PrimitiveFinished({'value': ""})
+        #raise PrimitiveFinished({'value': ""})
+        yield [("RETURN", [{'value': ""}])]
 
 
 def instantiated_name(a, b, **remainder):
 def instantiated_name(a, b, **remainder):
     if "id" not in a:
     if "id" not in a:
@@ -93,30 +97,36 @@ def instantiated_name(a, b, **remainder):
         b['value'], = yield [("RV", [b["id"]])]
         b['value'], = yield [("RV", [b["id"]])]
 
 
     if b['value'] == "":
     if b['value'] == "":
-        raise PrimitiveFinished({'value': "__" + str(a['id'])})
+        #raise PrimitiveFinished({'value': "__" + str(a['id'])})
+        yield [("RETURN", [{'value': "__" + str(a['id'])}])]
     else:
     else:
-        raise PrimitiveFinished(b)
+        #raise PrimitiveFinished(b)
+        yield [("RETURN", [b])]
 
 
 def set_merge(a, b, **remainder):
 def set_merge(a, b, **remainder):
     keys, =         yield [("RDK", [b['id']])]
     keys, =         yield [("RDK", [b['id']])]
     edges =         yield [("CE", [a['id'], a['id']]) for key in keys]
     edges =         yield [("CE", [a['id'], a['id']]) for key in keys]
     _ =             yield [("CE", [edge, key]) for edge, key in zip(edges, keys)]
     _ =             yield [("CE", [edge, key]) for edge, key in zip(edges, keys)]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def has_value(a, **remainder):
 def has_value(a, **remainder):
     if "value" not in a:
     if "value" not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if a['value'] is None:
     if a['value'] is None:
-        raise PrimitiveFinished({'value': False})
+        #raise PrimitiveFinished({'value': False})
+        yield [("RETURN", [{'value': False}])]
     else:
     else:
-        raise PrimitiveFinished({'value': True})
+        #raise PrimitiveFinished({'value': True})
+        yield [("RETURN", [{'value': True}])]
 
 
 def make_reverse_dictionary(a, **remainder):
 def make_reverse_dictionary(a, **remainder):
     reverse, = yield [("CN", [])]
     reverse, = yield [("CN", [])]
     key_nodes, = yield [("RDK", [a['id']])]
     key_nodes, = yield [("RDK", [a['id']])]
     values = yield [("RDN", [a['id'], i]) for i in key_nodes]
     values = yield [("RDN", [a['id'], i]) for i in key_nodes]
     yield [("CD", [reverse, str(v), k]) for k, v in zip(key_nodes, values)]
     yield [("CD", [reverse, str(v), k]) for k, v in zip(key_nodes, values)]
-    raise PrimitiveFinished({'id': reverse})
+    #raise PrimitiveFinished({'id': reverse})
+    yield [("RETURN", [{'id': reverse}])]
 
 
 def dict_eq(a, b, **remainder):
 def dict_eq(a, b, **remainder):
     key_nodes, = yield [("RDK", [a['id']])]
     key_nodes, = yield [("RDK", [a['id']])]
@@ -131,7 +141,8 @@ def dict_eq(a, b, **remainder):
     values = yield [("RV", [i]) for i in values]
     values = yield [("RV", [i]) for i in values]
     b_dict = dict(list(zip(key_values, values)))
     b_dict = dict(list(zip(key_values, values)))
 
 
-    raise PrimitiveFinished({'value': a_dict == b_dict})
+    #raise PrimitiveFinished({'value': a_dict == b_dict})
+    yield [("RETURN", [{'value': a_dict == b_dict}])]
 
 
 def string_substr(a, b, c, **remainder):
 def string_substr(a, b, c, **remainder):
     if "value" not in a:
     if "value" not in a:
@@ -146,51 +157,60 @@ def string_substr(a, b, c, **remainder):
     except:
     except:
         new_value = ""
         new_value = ""
     
     
-    raise PrimitiveFinished({'value': new_value})
+    #raise PrimitiveFinished({'value': new_value})
+    yield [("RETURN", [{'value': new_value}])]
 
 
 def integer_gt(a, b, **remainder):
 def integer_gt(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] > b['value']})
+    #raise PrimitiveFinished({'value': a['value'] > b['value']})
+    yield [("RETURN", [{'value': a['value'] > b['value']}])]
 
 
 def integer_neg(a, **remainder):
 def integer_neg(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': -a['value']})
+    #raise PrimitiveFinished({'value': -a['value']})
+    yield [("RETURN", [{'value': -a['value']}])]
 
 
 def float_gt(a, b, **remainder):
 def float_gt(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] > b['value']})
+    #raise PrimitiveFinished({'value': a['value'] > b['value']})
+    yield [("RETURN", [{'value': a['value'] > b['value']}])]
 
 
 def float_neg(a, **remainder):
 def float_neg(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': -a['value']})
+    #raise PrimitiveFinished({'value': -a['value']})
+    yield [("RETURN", [{'value': -a['value']}])]
 
 
 def value_neq(a, b, **remainder):
 def value_neq(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] != b['value']})
+    #raise PrimitiveFinished({'value': a['value'] != b['value']})
+    yield [("RETURN", [{'value': a['value'] != b['value']}])]
 
 
 def element_neq(a, b, **remainder):
 def element_neq(a, b, **remainder):
     if 'id' not in a or 'id' not in b:
     if 'id' not in a or 'id' not in b:
-        raise PrimitiveFinished({'value': False})
+        #raise PrimitiveFinished({'value': False})
+        yield [("RETURN", [{'value': False}])]
     else:
     else:
-        raise PrimitiveFinished({'value': a['id'] != b['id']})
+        #raise PrimitiveFinished({'value': a['id'] != b['id']})
+        yield [("RETURN", [{'value': a['value'] != b['value']}])]
 
 
 def list_append(a, b, **remainder):
 def list_append(a, b, **remainder):
     if "id" not in b:
     if "id" not in b:
         b['id'], = yield [("CNV", [b['value']])]
         b['id'], = yield [("CNV", [b['value']])]
     a_outgoing, = yield [("RO", [a['id']])]
     a_outgoing, = yield [("RO", [a['id']])]
     _ = yield [("CD", [a['id'], len(a_outgoing), b['id']])]
     _ = yield [("CD", [a['id'], len(a_outgoing), b['id']])]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def list_read(a, b, **remainder):
 def list_read(a, b, **remainder):
     if 'value' not in b:
     if 'value' not in b:
@@ -198,12 +218,14 @@ def list_read(a, b, **remainder):
     result, = yield [("RD", [a['id'], b['value']])]
     result, = yield [("RD", [a['id'], b['value']])]
     if result is None:
     if result is None:
         raise Exception("List read out of bounds: %s" % b['value'])
         raise Exception("List read out of bounds: %s" % b['value'])
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def list_len(a, **remainder):
 def list_len(a, **remainder):
     outgoings, = yield [("RO", [a['id']])]
     outgoings, = yield [("RO", [a['id']])]
     result, = yield [("CNV", [len(outgoings)])]
     result, = yield [("CNV", [len(outgoings)])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def dict_add(a, b, c, **remainder):
 def dict_add(a, b, c, **remainder):
     if 'id' not in b:
     if 'id' not in b:
@@ -212,11 +234,13 @@ def dict_add(a, b, c, **remainder):
         c['id'], = yield [("CNV", [c['value']])]
         c['id'], = yield [("CNV", [c['value']])]
     new_edge, = yield [("CE", [a['id'], c['id']])]
     new_edge, = yield [("CE", [a['id'], c['id']])]
     yield [("CE", [new_edge, b['id']])]
     yield [("CE", [new_edge, b['id']])]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def dict_len(a, **remainder):
 def dict_len(a, **remainder):
     outgoings, = yield [("RO", [a['id']])]
     outgoings, = yield [("RO", [a['id']])]
-    raise PrimitiveFinished({'value': len(outgoings)})
+    #raise PrimitiveFinished({'value': len(outgoings)})
+    yield [("RETURN", [{'value': len(outgoing)}])]
 
 
 def set_add(a, b, **remainder):
 def set_add(a, b, **remainder):
     if 'value' not in b:
     if 'value' not in b:
@@ -224,7 +248,8 @@ def set_add(a, b, **remainder):
     is_in, =    yield [("RD", [a['id'], b['value']])]
     is_in, =    yield [("RD", [a['id'], b['value']])]
     if not is_in:
     if not is_in:
         _, =    yield [("CD", [a['id'], b['value'], a['id']])]
         _, =    yield [("CD", [a['id'], b['value'], a['id']])]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def set_add_node(a, b, **remainder):
 def set_add_node(a, b, **remainder):
     if 'id' not in b:
     if 'id' not in b:
@@ -233,7 +258,8 @@ def set_add_node(a, b, **remainder):
     if not is_in:
     if not is_in:
         edge, = yield [("CE", [a['id'], a['id']])]
         edge, = yield [("CE", [a['id'], a['id']])]
         _, =    yield [("CE", [edge, b['id']])]
         _, =    yield [("CE", [edge, b['id']])]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def set_pop(a, **remainder):
 def set_pop(a, **remainder):
     outgoing, = yield [("RO", [a['id']])]
     outgoing, = yield [("RO", [a['id']])]
@@ -242,23 +268,28 @@ def set_pop(a, **remainder):
         new_outgoing, = yield [("RO", [outgoing])]
         new_outgoing, = yield [("RO", [outgoing])]
         new_outgoing = new_outgoing[0]
         new_outgoing = new_outgoing[0]
         edge, _ = yield [("RE", [new_outgoing]), ("DE", [outgoing])]
         edge, _ = yield [("RE", [new_outgoing]), ("DE", [outgoing])]
-        raise PrimitiveFinished({'id': edge[1]})
+        #raise PrimitiveFinished({'id': edge[1]})
+        yield [("RETURN", [{'id': edge[1]}])]
     else:
     else:
         raise Exception("POP from empty set")
         raise Exception("POP from empty set")
         print("Pop from empty set!")
         print("Pop from empty set!")
-        raise PrimitiveFinished({'id': remainder["root"]})
+        #raise PrimitiveFinished({'id': remainder["root"]})
+        yield [("RETURN", [{'id': remainder["root"]}])]
 
 
 def set_create(**remainder):
 def set_create(**remainder):
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def list_create(**remainder):
 def list_create(**remainder):
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def dict_create(**remainder):
 def dict_create(**remainder):
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def create_tuple(a, b, **remainder):
 def create_tuple(a, b, **remainder):
     if "id" not in a:
     if "id" not in a:
@@ -270,7 +301,8 @@ def create_tuple(a, b, **remainder):
     _, _ =    yield [("CD", [result, 0, a['id']]),
     _, _ =    yield [("CD", [result, 0, a['id']]),
                      ("CD", [result, 1, b['id']]),
                      ("CD", [result, 1, b['id']]),
                     ]
                     ]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def set_overlap(a, b, **remainder):
 def set_overlap(a, b, **remainder):
     a_keys, b_keys, res = yield [("RDK", [a['id']]), ("RDK", [b['id']]), ("CN", [])]
     a_keys, b_keys, res = yield [("RDK", [a['id']]), ("RDK", [b['id']]), ("CN", [])]
@@ -280,7 +312,8 @@ def set_overlap(a, b, **remainder):
     result = set(a_values) & set(b_values)
     result = set(a_values) & set(b_values)
     yield [("CD", [res, value, res]) for value in result]
     yield [("CD", [res, value, res]) for value in result]
 
 
-    raise PrimitiveFinished({'id': res})
+    #raise PrimitiveFinished({'id': res})
+    yield [("RETURN", [{'id': res}])]
 
 
 def list_pop_final(a, **remainder):
 def list_pop_final(a, **remainder):
     lst, = yield [("RO", [a['id']])]
     lst, = yield [("RO", [a['id']])]
@@ -288,7 +321,8 @@ def list_pop_final(a, **remainder):
     result, result_edge = yield [("RD", [a['id'], length - 1]),
     result, result_edge = yield [("RD", [a['id'], length - 1]),
                                  ("RDE", [a['id'], length -1])]
                                  ("RDE", [a['id'], length -1])]
     _, = yield [("DE", [result_edge])]
     _, = yield [("DE", [result_edge])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def instantiate_node(a, b, c, **remainder):
 def instantiate_node(a, b, c, **remainder):
     if "value" not in c:
     if "value" not in c:
@@ -312,7 +346,8 @@ def instantiate_node(a, b, c, **remainder):
     yield [("CD", [dict_entry, name, node])]
     yield [("CD", [dict_entry, name, node])]
     yield [("CD", [typing, name, b['id']])]
     yield [("CD", [typing, name, b['id']])]
 
 
-    raise PrimitiveFinished(name_node)
+    #raise PrimitiveFinished(name_node)
+    yield [("RETURN", [name_node])]
 
 
 def list_insert(a, b, c, **remainder):
 def list_insert(a, b, c, **remainder):
     if "id" not in b:
     if "id" not in b:
@@ -330,7 +365,8 @@ def list_insert(a, b, c, **remainder):
     yield [("CD", [a['id'], c['value'], b['id']])] + \
     yield [("CD", [a['id'], c['value'], b['id']])] + \
           [("CD", [a['id'], c['value'] + 1 + index, value]) for index, value in enumerate(values)] + \
           [("CD", [a['id'], c['value'] + 1 + index, value]) for index, value in enumerate(values)] + \
           [("DE", [i]) for i in edges]
           [("DE", [i]) for i in edges]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def list_delete(a, b, **remainder):
 def list_delete(a, b, **remainder):
     if "value" not in b:
     if "value" not in b:
@@ -345,4 +381,5 @@ def list_delete(a, b, **remainder):
 
 
     yield [("CD", [a['id'], b['value'] + index, value]) for index, value in enumerate(values[1:])] + \
     yield [("CD", [a['id'], b['value'] + index, value]) for index, value in enumerate(values[1:])] + \
           [("DE", [i]) for i in edges]
           [("DE", [i]) for i in edges]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]

+ 2 - 1
kernel/modelverse_kernel/jit.py

@@ -155,7 +155,8 @@ class ModelverseJit(object):
                 param_names = [i[0] for i in lst]
                 param_names = [i[0] for i in lst]
                 self.jitted_parameters[body_id] = (param_vars, param_names, is_mutable)
                 self.jitted_parameters[body_id] = (param_vars, param_names, is_mutable)
 
 
-        raise primitive_functions.PrimitiveFinished(self.jitted_parameters[body_id])
+        #raise primitive_functions.PrimitiveFinished(self.jitted_parameters[body_id])
+        yield [("RETURN", [self.jitted_parameters[body_id]])]
 
 
     def check_jittable(self, body_id, suggested_name=None):
     def check_jittable(self, body_id, suggested_name=None):
         """Checks if the function with the given body id is obviously non-jittable. If it's
         """Checks if the function with the given body id is obviously non-jittable. If it's

+ 14 - 8
kernel/modelverse_kernel/main.py

@@ -169,9 +169,11 @@ class ModelverseKernel(object):
             value, = yield [("RD", [inst, "value"])]
             value, = yield [("RD", [inst, "value"])]
             if value:
             if value:
                 (prev_value, instruction_value), = yield [("CALL_ARGS", [self.print_instruction, (value, 0, indent)])]
                 (prev_value, instruction_value), = yield [("CALL_ARGS", [self.print_instruction, (value, 0, indent)])]
-                instruction = prev_value + "  " * indent + "raise PrimitiveFinished(%s)\n" % instruction_value
+                #instruction = prev_value + "  " * indent + "raise PrimitiveFinished(%s)\n" % instruction_value
+                instruction = prev_value + "  " * indent + "yield [('RETURN', [%s])]\n" % instruction_value
             else:
             else:
-                instruction = "  " * indent + "raise PrimitiveFinished(None)\n"
+                #instruction = "  " * indent + "raise PrimitiveFinished(None)\n"
+                instruction = "  " * indent + "yield [('RETURN', [None])]\n"
 
 
         elif inst_type["value"] == "declare":
         elif inst_type["value"] == "declare":
             instruction = ""
             instruction = ""
@@ -318,7 +320,8 @@ class ModelverseKernel(object):
         else:
         else:
             next_inst = ""
             next_inst = ""
 
 
-        raise primitive_functions.PrimitiveFinished((prev, instruction + next_inst))
+        #raise primitive_functions.PrimitiveFinished((prev, instruction + next_inst))
+        yield [('RETURN', [(prev, instruction + next_inst)])]
 
 
     def read_function(self, inst, suggested_name):
     def read_function(self, inst, suggested_name):
         initial_instruction = inst
         initial_instruction = inst
@@ -347,7 +350,8 @@ class ModelverseKernel(object):
         with open('/tmp/junk/%s' % suggested_name, 'w') as f:
         with open('/tmp/junk/%s' % suggested_name, 'w') as f:
             f.write(func)
             f.write(func)
 
 
-        raise primitive_functions.PrimitiveFinished(func)
+        #raise primitive_functions.PrimitiveFinished(func)
+        yield [("RETURN", [func])]
 
 
     def jit_compile(self, task_root, inst):
     def jit_compile(self, task_root, inst):
         # Try to retrieve the suggested name.
         # Try to retrieve the suggested name.
@@ -359,8 +363,8 @@ class ModelverseKernel(object):
             raise ValueError('body_id cannot be None: ' + str(suggested_name))
             raise ValueError('body_id cannot be None: ' + str(suggested_name))
 
 
         elif inst in self.jit.jitted_entry_points:
         elif inst in self.jit.jitted_entry_points:
-            raise primitive_functions.PrimitiveFinished(
-                self.jit.jit_globals[self.jit.jitted_entry_points[inst]])
+            #raise primitive_functions.PrimitiveFinished(self.jit.jit_globals[self.jit.jitted_entry_points[inst]])
+            yield [("RETURN", [self.jit.jit_globals[self.jit.jitted_entry_points[inst]]])]
         else:
         else:
             compiled_func = self.jit.lookup_compiled_body(inst)
             compiled_func = self.jit.lookup_compiled_body(inst)
 
 
@@ -373,7 +377,8 @@ class ModelverseKernel(object):
                 compiled_func = self.jit.jit_globals[suggested_name]
                 compiled_func = self.jit.jit_globals[suggested_name]
                 self.jit.register_compiled(inst, compiled_func, suggested_name)
                 self.jit.register_compiled(inst, compiled_func, suggested_name)
 
 
-            raise primitive_functions.PrimitiveFinished(compiled_func)
+            #raise primitive_functions.PrimitiveFinished(compiled_func)
+            yield [("RETURN", [compiled_func])]
 
 
     def execute_jit(self, task_root, inst, taskname, params = {}, store=False, resolve=True):
     def execute_jit(self, task_root, inst, taskname, params = {}, store=False, resolve=True):
         # execute_jit
         # execute_jit
@@ -457,7 +462,8 @@ class ModelverseKernel(object):
                                       ]
                                       ]
 
 
         else:
         else:
-            raise primitive_functions.PrimitiveFinished(result)
+            #raise primitive_functions.PrimitiveFinished(result)
+            yield [("RETURN", [result])]
 
 
     ########################################
     ########################################
     ### Execute input and output methods ###
     ### Execute input and output methods ###

+ 134 - 67
kernel/modelverse_kernel/primitives.py

@@ -46,96 +46,110 @@ def integer_subtraction(a, b, **remainder):
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] - b['value']})
+    #raise PrimitiveFinished({'value': a['value'] - b['value']})
+    yield [("RETURN", [{'value': a['value'] - b['value']}])]
 
 
 def integer_addition(a, b, **remainder):
 def integer_addition(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] + b['value']})
+    #raise PrimitiveFinished({'value': a['value'] + b['value']})
+    yield [("RETURN", [{'value': a['value'] + b['value']}])]
 
 
 def integer_multiplication(a, b, **remainder):
 def integer_multiplication(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] * b['value']})
+    #raise PrimitiveFinished({'value': a['value'] * b['value']})
+    yield [("RETURN", [{'value': a['value'] * b['value']}])]
 
 
 def integer_division(a, b, **remainder):
 def integer_division(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': int(a['value']) // b['value']})
+    #raise PrimitiveFinished({'value': int(a['value']) // b['value']})
+    yield [("RETURN", [{'value': int(a['value']) // b['value']}])]
 
 
 def integer_lt(a, b, **remainder):
 def integer_lt(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] < b['value']})
+    #raise PrimitiveFinished({'value': a['value'] < b['value']})
+    yield [("RETURN", [{'value': a['value'] < b['value']}])]
 
 
 def bool_and(a, b, **remainder):
 def bool_and(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] and b['value']})
+    #raise PrimitiveFinished({'value': a['value'] and b['value']})
+    yield [("RETURN", [{'value': a['value'] and b['value']}])]
 
 
 def bool_or(a, b, **remainder):
 def bool_or(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] or b['value']})
+    #raise PrimitiveFinished({'value': a['value'] or b['value']})
+    yield [("RETURN", [{'value': a['value'] or b['value']}])]
 
 
 def bool_not(a, **remainder):
 def bool_not(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': not a['value']})
+    #raise PrimitiveFinished({'value': not a['value']})
+    yield [("RETURN", [{'value': not a['value']}])]
 
 
 def float_subtraction(a, b, **remainder):
 def float_subtraction(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] - b['value']})
+    #raise PrimitiveFinished({'value': a['value'] - b['value']})
+    yield [("RETURN", [{'value': a['value'] - b['value']}])]
 
 
 def float_addition(a, b, **remainder):
 def float_addition(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] + b['value']})
+    #raise PrimitiveFinished({'value': a['value'] + b['value']})
+    yield [("RETURN", [{'value': a['value'] + b['value']}])]
 
 
 def float_multiplication(a, b, **remainder):
 def float_multiplication(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] * b['value']})
+    #raise PrimitiveFinished({'value': a['value'] * b['value']})
+    yield [("RETURN", [{'value': a['value'] * b['value']}])]
 
 
 def float_division(a, b, **remainder):
 def float_division(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': float(a['value']) / float(b['value'])})
+    #raise PrimitiveFinished({'value': float(a['value']) / float(b['value'])})
+    yield [("RETURN", [{'value': float(a['value']) / b['value']}])]
 
 
 def float_lt(a, b, **remainder):
 def float_lt(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] < b['value']})
+    #raise PrimitiveFinished({'value': a['value'] < b['value']})
+    yield [("RETURN", [{'value': a['value'] < b['value']}])]
 
 
 def string_join(a, b, **remainder):
 def string_join(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': str(a['value']) + str(b['value'])})
+    #raise PrimitiveFinished({'value': str(a['value']) + str(b['value'])})
+    yield [("RETURN", [{'value': str(a['value']) + str(b['value'])}])]
 
 
 def string_split(a, b, **remainder):
 def string_split(a, b, **remainder):
     # TODO make non-primitive, though compiled
     # TODO make non-primitive, though compiled
@@ -147,26 +161,30 @@ def string_split(a, b, **remainder):
     elems = yield [("CN", [])] + [("CNV", [v]) for v in result]
     elems = yield [("CN", [])] + [("CNV", [v]) for v in result]
     new_val = elems[0]
     new_val = elems[0]
     yield [("CD", [new_val, i, v]) for i, v in enumerate(elems[1:])]
     yield [("CD", [new_val, i, v]) for i, v in enumerate(elems[1:])]
-    raise PrimitiveFinished({'id': new_val})
+    #raise PrimitiveFinished({'id': new_val})
+    yield [("RETURN", [{'id': new_val}])]
 
 
 def string_get(a, b, **remainder):
 def string_get(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'][b['value']]})
+    #raise PrimitiveFinished({'value': a['value'][b['value']]})
+    yield [("RETURN", [{'value': a['value'][b['value']]}])]
 
 
 def string_len(a, **remainder):
 def string_len(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': len(a['value'])})
+    #raise PrimitiveFinished({'value': len(a['value'])})
+    yield [("RETURN", [{'value': len(a['value'])}])]
 
 
 def value_eq(a, b, **remainder):
 def value_eq(a, b, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if 'value' not in b:
     if 'value' not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
-    raise PrimitiveFinished({'value': a['value'] == b['value']})
+    #raise PrimitiveFinished({'value': a['value'] == b['value']})
+    yield [("RETURN", [{'value': a['value'] == b['value']}])]
 
 
 def element_eq(a, b, **remainder):
 def element_eq(a, b, **remainder):
     if "id" not in a:
     if "id" not in a:
@@ -175,44 +193,53 @@ def element_eq(a, b, **remainder):
     if "id" not in b:
     if "id" not in b:
         #print("MATERIALIZING B element_eq")
         #print("MATERIALIZING B element_eq")
         b['id'], = yield [("CNV", [b['value']])]
         b['id'], = yield [("CNV", [b['value']])]
-    raise PrimitiveFinished({'value': a['id'] == b['id']})
+    #raise PrimitiveFinished({'value': a['id'] == b['id']})
+    yield [("RETURN", [{'value': a['id'] == b['id']}])]
 
 
 def cast_string(a, **remainder):
 def cast_string(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if isinstance(a['value'], dict):
     if isinstance(a['value'], dict):
-        raise PrimitiveFinished({'value': str(a['value']['value'])})
+        #raise PrimitiveFinished({'value': str(a['value']['value'])})
+        yield [("RETURN", [{'value': str(a['value']['value'])}])]
     else:
     else:
-        raise PrimitiveFinished({'value': str(a['value'])})
+        #raise PrimitiveFinished({'value': str(a['value'])})
+        yield [("RETURN", [{'value': str(a['value'])}])]
 
 
 def cast_float(a, **remainder):
 def cast_float(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': float(a['value'])})
+    #raise PrimitiveFinished({'value': float(a['value'])})
+    yield [("RETURN", [{'value': float(a['value'])}])]
 
 
 def cast_boolean(a, **remainder):
 def cast_boolean(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': bool(a['value'])})
+    #raise PrimitiveFinished({'value': bool(a['value'])})
+    yield [("RETURN", [{'value': bool(a['value'])}])]
 
 
 def cast_integer(a, **remainder):
 def cast_integer(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': int(a['value'])})
+    #raise PrimitiveFinished({'value': int(a['value'])})
+    yield [("RETURN", [{'value': int(a['value'])}])]
 
 
 def cast_value(a, **remainder):
 def cast_value(a, **remainder):
     if 'value' not in a:
     if 'value' not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     if isinstance(a['value'], dict):
     if isinstance(a['value'], dict):
-        raise PrimitiveFinished({'value': str(a['value']['value'])})
+        #raise PrimitiveFinished({'value': str(a['value']['value'])})
+        yield [("RETURN", [{'value': str(a['value']['value'])}])]
     else:
     else:
-        raise PrimitiveFinished({'value': json.dumps(a['value'])})
+        #raise PrimitiveFinished({'value': json.dumps(a['value'])})
+        yield [("RETURN", [{'value': json.dumps(a['value'])}])]
 
 
 def cast_id(a, **remainder):
 def cast_id(a, **remainder):
     if "id" not in a:
     if "id" not in a:
         #print("MATERIALIZING A cast_id")
         #print("MATERIALIZING A cast_id")
         a['id'], = yield [("CNV", [a['value']])]
         a['id'], = yield [("CNV", [a['value']])]
-    raise PrimitiveFinished({'value': str(a['id'])})
+    #raise PrimitiveFinished({'value': str(a['id'])})
+    yield [("RETURN", [{'value': str(a['id'])}])]
 
 
 def dict_add_fast(a, b, c, **remainder):
 def dict_add_fast(a, b, c, **remainder):
     # TODO deprecate, as dict_add is now also efficient
     # TODO deprecate, as dict_add is now also efficient
@@ -223,7 +250,8 @@ def dict_add_fast(a, b, c, **remainder):
         c['id'], = yield [("CNV", [c['value']])]
         c['id'], = yield [("CNV", [c['value']])]
 
 
     yield [("CD", [a['id'], b['value'], c['id']])]
     yield [("CD", [a['id'], b['value'], c['id']])]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def dict_delete(a, b, **remainder):
 def dict_delete(a, b, **remainder):
     if "value" not in b:
     if "value" not in b:
@@ -237,89 +265,107 @@ def dict_delete(a, b, **remainder):
         print("Keys: " + str(keys))
         print("Keys: " + str(keys))
         raise Exception()
         raise Exception()
     yield [("DE", [edge])]
     yield [("DE", [edge])]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def dict_delete_node(a, b, **remainder):
 def dict_delete_node(a, b, **remainder):
     edge, = yield [("RDNE", [a['id'], b['id']])]
     edge, = yield [("RDNE", [a['id'], b['id']])]
     if edge is None:
     if edge is None:
         print("Failed dict_delete_node!")
         print("Failed dict_delete_node!")
     yield [("DE", [edge])]
     yield [("DE", [edge])]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def dict_read(a, b, **remainder):
 def dict_read(a, b, **remainder):
     if "value" not in b:
     if "value" not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
     result, = yield [("RD", [a['id'], b['value']])]
     result, = yield [("RD", [a['id'], b['value']])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def dict_read_edge(a, b, **remainder):
 def dict_read_edge(a, b, **remainder):
     if "value" not in b:
     if "value" not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
     result, = yield [("RDE", [a['id'], b['value']])]
     result, = yield [("RDE", [a['id'], b['value']])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def dict_read_node(a, b, **remainder):
 def dict_read_node(a, b, **remainder):
     result, = yield [("RDN", [a['id'], b['id']])]
     result, = yield [("RDN", [a['id'], b['id']])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def dict_in(a, b, **remainder):
 def dict_in(a, b, **remainder):
     if "value" not in b:
     if "value" not in b:
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
     value, = yield [("RD", [a['id'], b['value']])]
     value, = yield [("RD", [a['id'], b['value']])]
-    raise PrimitiveFinished({'value': value is not None})
+    #raise PrimitiveFinished({'value': value is not None})
+    yield [("RETURN", [{'value': value is not None}])]
 
 
 def dict_in_node(a, b, **remainder):
 def dict_in_node(a, b, **remainder):
     if "id" not in b:
     if "id" not in b:
         # Not even allocated the node, so it is certain not to be in the dictionary
         # Not even allocated the node, so it is certain not to be in the dictionary
-        raise PrimitiveFinished({'value': False})
+        #raise PrimitiveFinished({'value': False})
+        yield [("RETURN", [{'value': False}])]
     value, = yield [("RDN", [a['id'], b['id']])]
     value, = yield [("RDN", [a['id'], b['id']])]
-    raise PrimitiveFinished({'value': value is not None})
+    #raise PrimitiveFinished({'value': value is not None})
+    yield [("RETURN", [{'value': value is not None}])]
 
 
 def dict_keys(a, **remainder):
 def dict_keys(a, **remainder):
     keys, result = yield [("RDK", [a['id']]), ("CN", [])]
     keys, result = yield [("RDK", [a['id']]), ("CN", [])]
     edges = yield [("CE", [result, result]) for _ in keys]
     edges = yield [("CE", [result, result]) for _ in keys]
     _ = yield [("CE", [edge, key]) for edge, key in zip(edges, keys)]
     _ = yield [("CE", [edge, key]) for edge, key in zip(edges, keys)]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def is_physical_int(a, **remainder):
 def is_physical_int(a, **remainder):
     if "value" not in a:
     if "value" not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     try:
     try:
-        raise PrimitiveFinished({'value': isinstance(a['value'], int) or isinstance(a['value'], long)})
+        #raise PrimitiveFinished({'value': isinstance(a['value'], int) or isinstance(a['value'], long)})
+        yield [("RETURN", [{'value': isinstance(a['value'], int) or isinstance(a['value'], long)}])]
     except NameError:
     except NameError:
-        raise PrimitiveFinished({'value': isinstance(a['value'], int)})
+        #raise PrimitiveFinished({'value': isinstance(a['value'], int)})
+        yield [("RETURN", [{'value': isinstance(a['value'], int)}])]
 
 
 def is_physical_string(a, **remainder):
 def is_physical_string(a, **remainder):
     if "value" not in a:
     if "value" not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     try:
     try:
-        raise PrimitiveFinished({'value': isinstance(a['value'], str) or isinstance(a['value'], unicode)})
+        #raise PrimitiveFinished({'value': isinstance(a['value'], str) or isinstance(a['value'], unicode)})
+        yield [("RETURN", [{'value': isinstance(a['value'], str) or isinstance(a['value'], unicode)}])]
     except NameError:
     except NameError:
-        raise PrimitiveFinished({'value': isinstance(a['value'], str)})
+        #raise PrimitiveFinished({'value': isinstance(a['value'], str)})
+        yield [("RETURN", [{'value': isinstance(a['value'], str)}])]
 
 
 def is_physical_float(a, **remainder):
 def is_physical_float(a, **remainder):
     if "value" not in a:
     if "value" not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': isinstance(a['value'], float)})
+    #raise PrimitiveFinished({'value': isinstance(a['value'], float)})
+    yield [("RETURN", [{'value': isinstance(a['value'], float)}])]
 
 
 def is_physical_boolean(a, **remainder):
 def is_physical_boolean(a, **remainder):
     if "value" not in a:
     if "value" not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': isinstance(a['value'], bool)})
+    #raise PrimitiveFinished({'value': isinstance(a['value'], bool)})
+    yield [("RETURN", [{'value': isinstance(a['value'], bool)}])]
 
 
 def is_physical_action(a, **remainder):
 def is_physical_action(a, **remainder):
     if "value" not in a:
     if "value" not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': isinstance(a['value'], dict) and a['value']["value"] in ["if", "while", "assign", "call", "break", "continue", "return", "resolve", "access", "constant", "global", "declare"]})
+    #raise PrimitiveFinished({'value': isinstance(a['value'], dict) and a['value']["value"] in ["if", "while", "assign", "call", "break", "continue", "return", "resolve", "access", "constant", "global", "declare"]})
+    yield [("RETURN", [{'value': isinstance(a['value'], dict) and a['value']["value"] in ["if", "while", "assign", "call", "break", "continue", "return", "resolve", "access", "constant", "global", "declare"]}])]
 
 
 def is_physical_none(a, **remainder):
 def is_physical_none(a, **remainder):
     if "value" not in a:
     if "value" not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': isinstance(a['value'], dict) and a['value']["value"] == "none"})
+    #raise PrimitiveFinished({'value': isinstance(a['value'], dict) and a['value']["value"] == "none"})
+    yield [("RETURN", [{'value': isinstance(a['value'], dict) and a['value']["value"] == "none"}])]
 
 
 def create_node(**remainder):
 def create_node(**remainder):
     result, = yield [("CN", [])]
     result, = yield [("CN", [])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def create_edge(a, b, **remainder):
 def create_edge(a, b, **remainder):
     if "id" not in a:
     if "id" not in a:
@@ -329,18 +375,21 @@ def create_edge(a, b, **remainder):
         #print("MATERIALIZING B create_edge")
         #print("MATERIALIZING B create_edge")
         b['id'], = yield [("CNV", [b['value']])]
         b['id'], = yield [("CNV", [b['value']])]
     result, = yield [("CE", [a['id'], b['id']])]
     result, = yield [("CE", [a['id'], b['id']])]
-    raise PrimitiveFinished({'id': result})
+    #raise PrimitiveFinished({'id': result})
+    yield [("RETURN", [{'id': result}])]
 
 
 def create_value(a, **remainder):
 def create_value(a, **remainder):
     if "value" not in a:
     if "value" not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
-    raise PrimitiveFinished({'value': a['value']})
+    #raise PrimitiveFinished({'value': a['value']})
+    yield [("RETURN", [{'value': a['value']}])]
 
 
 def read_nr_out(a, **remainder):
 def read_nr_out(a, **remainder):
     if "id" not in a:
     if "id" not in a:
         a['id'], = yield [("CNV", [a['value']])]
         a['id'], = yield [("CNV", [a['value']])]
     outgoing, = yield [("RO", [a['id']])]
     outgoing, = yield [("RO", [a['id']])]
-    raise PrimitiveFinished({'value': len(outgoing)})
+    #raise PrimitiveFinished({'value': len(outgoing)})
+    yield [("RETURN", [{'value': len(outgoing)}])]
 
 
 def read_out(a, b, root, **remainder):
 def read_out(a, b, root, **remainder):
     if "id" not in a:
     if "id" not in a:
@@ -349,13 +398,15 @@ def read_out(a, b, root, **remainder):
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
 
 
     outgoing, = yield [("RO", [a['id']])]
     outgoing, = yield [("RO", [a['id']])]
-    raise PrimitiveFinished({'id': sorted(outgoing)[b['value']] if len(outgoing) > b['value'] else root})
+    #raise PrimitiveFinished({'id': sorted(outgoing)[b['value']] if len(outgoing) > b['value'] else root})
+    yield [("RETURN", [{'id': sorted(outgoing)[b['value']] if len(outgoing) > b['value'] else root}])]
 
 
 def read_nr_in(a, **remainder):
 def read_nr_in(a, **remainder):
     if "id" not in a:
     if "id" not in a:
         a['id'], = yield [("CNV", [a['value']])]
         a['id'], = yield [("CNV", [a['value']])]
     incoming, = yield [("RI", [a['id']])]
     incoming, = yield [("RI", [a['id']])]
-    raise PrimitiveFinished({'value': len(incoming)})
+    #raise PrimitiveFinished({'value': len(incoming)})
+    yield [("RETURN", [{'value': len(incoming)}])]
 
 
 def read_in(a, b, root, **remainder):
 def read_in(a, b, root, **remainder):
     if "id" not in a:
     if "id" not in a:
@@ -364,50 +415,62 @@ def read_in(a, b, root, **remainder):
         b['value'], = yield [("RV", [b['id']])]
         b['value'], = yield [("RV", [b['id']])]
 
 
     incoming, = yield [("RI", [a['id']])]
     incoming, = yield [("RI", [a['id']])]
-    raise PrimitiveFinished({'id': sorted(incoming)[b['value']] if len(incoming) > b['value'] else root})
+    #raise PrimitiveFinished({'id': sorted(incoming)[b['value']] if len(incoming) > b['value'] else root})
+    yield [("RETURN", [{'id': sorted(outgoing)[b['value']] if len(incoming) > b['value'] else root}])]
 
 
 def read_edge_src(a, **remainder):
 def read_edge_src(a, **remainder):
     result, = yield [("RE", [a['id']])]
     result, = yield [("RE", [a['id']])]
-    raise PrimitiveFinished({'id': result[0]})
+    #raise PrimitiveFinished({'id': result[0]})
+    yield [("RETURN", [{'id': result[0]}])]
 
 
 def read_edge_dst(a, **remainder):
 def read_edge_dst(a, **remainder):
     result, = yield [("RE", [a['id']])]
     result, = yield [("RE", [a['id']])]
-    raise PrimitiveFinished({'id': result[1]})
+    #raise PrimitiveFinished({'id': result[1]})
+    yield [("RETURN", [{'id': result[1]}])]
 
 
 def delete_element(a, **remainder):
 def delete_element(a, **remainder):
     if "id" not in a:
     if "id" not in a:
-        raise PrimitiveFinished({'value': False})
+        #raise PrimitiveFinished({'value': False})
+        yield [("RETURN", [{'value': False}])]
 
 
     edge, = yield [("RE", [a['id']])]
     edge, = yield [("RE", [a['id']])]
     if edge[0] is None:
     if edge[0] is None:
         # Not an edge:
         # Not an edge:
         yield [("DN", [a['id']])]
         yield [("DN", [a['id']])]
-        raise PrimitiveFinished({'value': False})
+        #raise PrimitiveFinished({'value': False})
+        yield [("RETURN", [{'value': False}])]
     else:
     else:
         yield [("DE", [a['id']])]
         yield [("DE", [a['id']])]
-        raise PrimitiveFinished({'value': True})
+        #raise PrimitiveFinished({'value': True})
+        yield [("RETURN", [{'value': True}])]
 
 
 def read_root(root, **remainder):
 def read_root(root, **remainder):
-    raise PrimitiveFinished({'id': root})
+    #raise PrimitiveFinished({'id': root})
+    yield [("RETURN", [{'id': root}])]
 
 
 def is_edge(a, **remainder):
 def is_edge(a, **remainder):
     if "id" not in a:
     if "id" not in a:
-        raise PrimitiveFinished({'value': False})
+        #raise PrimitiveFinished({'value': False})
+        yield [("RETURN", [{'value': False}])]
 
 
     edge, = yield [("RE", [a['id']])]
     edge, = yield [("RE", [a['id']])]
-    raise PrimitiveFinished({'value': edge[0] is not None})
+    #raise PrimitiveFinished({'value': edge[0] is not None})
+    yield [("RETURN", [{'value': edge[0] is not None}])]
 
 
 def log(a, **remainder):
 def log(a, **remainder):
     if "value" not in a:
     if "value" not in a:
         a['value'], = yield [("RV", [a['id']])]
         a['value'], = yield [("RV", [a['id']])]
     print("== LOG == " + str(a['value']))
     print("== LOG == " + str(a['value']))
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def read_taskroot(task_root, **remainder):
 def read_taskroot(task_root, **remainder):
-    raise PrimitiveFinished({'id': task_root})
+    #raise PrimitiveFinished({'id': task_root})
+    yield [("RETURN", [{'id': task_root}])]
 
 
 def time(**remainder):
 def time(**remainder):
-    raise PrimitiveFinished({'value': python_time.time()})
+    #raise PrimitiveFinished({'value': python_time.time()})
+    yield [("RETURN", [{'value': python_time.time()}])]
 
 
 def hash(a, **remainder):
 def hash(a, **remainder):
     if "value" not in a:
     if "value" not in a:
@@ -418,7 +481,8 @@ def hash(a, **remainder):
         value = hashlib.sha512(a['value']).hexdigest()
         value = hashlib.sha512(a['value']).hexdigest()
     except TypeError:
     except TypeError:
         value = hashlib.sha512(a['value'].encode()).hexdigest()
         value = hashlib.sha512(a['value'].encode()).hexdigest()
-    raise PrimitiveFinished({'value': value})
+    #raise PrimitiveFinished({'value': value})
+    yield [("RETURN", [{'value': value}])]
 
 
 def __sleep(a, b, **remainder):
 def __sleep(a, b, **remainder):
     if "value" not in a:
     if "value" not in a:
@@ -428,10 +492,13 @@ def __sleep(a, b, **remainder):
     timeout = a['value']
     timeout = a['value']
     interruptable = b['value']
     interruptable = b['value']
     yield [("SLEEP", [timeout, interruptable])]
     yield [("SLEEP", [timeout, interruptable])]
-    raise PrimitiveFinished(a)
+    #raise PrimitiveFinished(a)
+    yield [("RETURN", [a])]
 
 
 def is_error(a, **remainder):
 def is_error(a, **remainder):
     if a['id'] is None:
     if a['id'] is None:
-        raise PrimitiveFinished({'value': True})
+        #raise PrimitiveFinished({'value': True})
+        yield [("RETURN", [{'value': True}])]
     else:
     else:
-        raise PrimitiveFinished({'value': False})
+        #raise PrimitiveFinished({'value': False})
+        yield [("RETURN", [{'value': False}])]

+ 21 - 8
kernel/modelverse_kernel/request_handler.py

@@ -9,15 +9,19 @@ class RequestHandler(object):
         self.handlers = {"CALL": lambda i: i[0],
         self.handlers = {"CALL": lambda i: i[0],
                          "CALL_ARGS": lambda i: i[0](*(i[1])),
                          "CALL_ARGS": lambda i: i[0](*(i[1])),
                          "CALL_KWARGS": lambda i: i[0](**(i[1])),
                          "CALL_KWARGS": lambda i: i[0](**(i[1])),
+                         "RETURN": self.execute_return,
                          "SLEEP": self.execute_sleep}
                          "SLEEP": self.execute_sleep}
 
 
     def push_generator(self, gen):
     def push_generator(self, gen):
         self.generator_stack.append(gen)
         self.generator_stack.append(gen)
 
 
     def handle_request(self, reply):
     def handle_request(self, reply):
+        self.reply = reply
         while self.generator_stack:
         while self.generator_stack:
             try:
             try:
-                requests = self.generator_stack[-1].send(reply)
+                print("Stack: " + str(self.generator_stack))
+                requests = self.generator_stack[-1].send(self.reply)
+                print("Requests: " + str(requests))
 
 
                 # Generated new request, so process
                 # Generated new request, so process
                 if requests and requests[0][0] in self.handlers:
                 if requests and requests[0][0] in self.handlers:
@@ -26,25 +30,34 @@ class RequestHandler(object):
                     # This next command potentially raises a finished message already, meaning that we should stop already
                     # This next command potentially raises a finished message already, meaning that we should stop already
                     # We avoid an extra try/except block by putting the None on the stack already
                     # We avoid an extra try/except block by putting the None on the stack already
                     self.generator_stack[-1] = self.handlers[requests[0][0]](requests[0][1])
                     self.generator_stack[-1] = self.handlers[requests[0][0]](requests[0][1])
-                    reply = None
+                    self.reply = None
                 else:
                 else:
                     # MvS request, so forward that instead
                     # MvS request, so forward that instead
                     return requests
                     return requests
 
 
-            except primitive_functions.PrimitiveFinished as ex:
-                # Exception, so finished execution of this generator, passing on ex.result to the caller
-                del self.generator_stack[-1]
-                reply = [ex.result]
-
             except StopIteration:
             except StopIteration:
                 # Exception, so finished execution of this generator, passing on None to the caller
                 # Exception, so finished execution of this generator, passing on None to the caller
+                print("STOPITER")
                 del self.generator_stack[-1]
                 del self.generator_stack[-1]
-                reply = [None]
+                self.reply = [None]
                 
                 
             except primitive_functions.SleepKernel:
             except primitive_functions.SleepKernel:
                 # Processing sleep, so pop its generator and reraise
                 # Processing sleep, so pop its generator and reraise
                 del self.generator_stack[-1]
                 del self.generator_stack[-1]
                 raise
                 raise
 
 
+            except primitive_functions.PrimitiveFinished as ex:
+                # Exception, so finished execution of this generator, passing on ex.result to the caller
+                del self.generator_stack[-1]
+                self.reply = [ex.result]
+                print("SHOULD NOT HAPPEN")
+
     def execute_sleep(self, request_args):
     def execute_sleep(self, request_args):
         raise primitive_functions.SleepKernel(request_args[0], request_args[1])
         raise primitive_functions.SleepKernel(request_args[0], request_args[1])
+
+    def execute_return(self, request_args):
+        print("RETURNING")
+        print(self.generator_stack)
+        del self.generator_stack[-1]
+        self.reply = request_args[0]
+        print(self.generator_stack)

+ 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:   Fri Apr 27 15:11:46 2018
+Date:   Fri Apr 27 16:59:23 2018
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server