Procházet zdrojové kódy

Merge branch 'master' into core_interface and implement get_superclasses

Yentl Van Tendeloo před 8 roky
rodič
revize
eb89a2a864

+ 1 - 1
kernel/modelverse_jit/tree_ir.py

@@ -30,7 +30,7 @@
 
 import modelverse_jit.source_map as source_map
 
-PROFILING = True
+PROFILING = False
 
 NOP_LITERAL = None
 """A literal that results in a nop during which execution may be interrupted

+ 41 - 6
kernel/modelverse_kernel/compiled.py

@@ -204,13 +204,48 @@ def set_overlap(a, b, **remainder):
 
 def get_superclasses(a, b, **remainder):
     model, name = a, b
-    model_dict, name_value =    yield [("RD", [a, "model"]), 
-                                       ("RV", [b])]
-    elem, =                     yield [("RD", [model_dict, name_value])]
+    model_dict, tm_dict, name_value = yield [("RD", [a, "model"]), 
+                                             ("RD", [a, "type_mapping"]),
+                                             ("RV", [b])]
 
-    worklist = set([elem])
+    worklist = set([name_value])
     found = set([])
 
     while worklist:
-        elem = worklist.pop()
-        found.add(elem)
+        name = worklist.pop()
+        if name in found:
+            continue
+        elem, = yield [("RD", [model_dict, name])]
+        found.add(name)
+
+        # Iterate over all outgoing links
+        outgoing, = yield [("RO", [elem])]
+        outgoing = set(outgoing)
+        while (outgoing):
+            link = outgoing.pop()
+
+            # If the link is typed by "Inheritance", we add its destination
+            link_name_node, = yield [("CALL_ARGS", [reverseKeyLookup, [model_dict, link]])]
+            link_name, = yield [("RV", [link_name_node])]
+            t_edge, = yield [("RD", [tm_dict, link_name])]
+            t_edge, = yield [("RV", [t_edge])]
+            if t_edge == "Inheritance":
+                edge, = yield [("RE", [link])]
+                src, dst = edge
+                # Look up dst's name and add it
+                dst_name, = yield [("CALL_ARGS", [reverseKeyLookup, [model_dict, dst]])]
+                dst_name_value, = yield [("RV", [dst_name])]
+                worklist.add(dst_name_value)
+
+    result, = yield [("CN", [])]
+    yield [("CD", [result, i, result]) for i in found]
+
+    raise PrimitiveFinished(result)
+
+def list_pop_final(a, **remainder):
+    lst, = yield [("RO", [a])]
+    length = len(lst)
+    result, result_edge = yield [("RD", [a, length - 1]),
+                                 ("RDE", [a, length -1])]
+    _, = yield [("DE", [result_edge])]
+    raise PrimitiveFinished(result)