Bladeren bron

Fixed MvK execution of break and continue

Yentl Van Tendeloo 8 jaren geleden
bovenliggende
commit
da4297e7f0
1 gewijzigde bestanden met toevoegingen van 45 en 22 verwijderingen
  1. 45 22
      kernel/modelverse_kernel/legacy.py

+ 45 - 22
kernel/modelverse_kernel/legacy.py

@@ -14,7 +14,6 @@ else:
 
 class ModelverseKernel(object):
     def __init__(self, root):
-        print("INIT")
         self.root = root
         self.primitives = {}
         self.compiled = {}
@@ -78,7 +77,7 @@ class ModelverseKernel(object):
                 elif inst_v is None:
                     raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info[username], inst_v, self.phase_v))
                 else:
-                    print("%-30s(%s) -- %s" % (inst_v["value"], self.phase_v, username))
+                    #print("%-30s(%s) -- %s" % (inst_v["value"], self.phase_v, username))
                     gen = getattr(self, "%s_%s" % (inst_v["value"], self.phase_v))(user_root)
             elif inst_v is None:
                 raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info[username], inst_v, self.phase_v))
@@ -196,37 +195,61 @@ class ModelverseKernel(object):
     #############################################
     def continue_init(self, user_root):
         user_frame, =       yield [("RD", [user_root, "frame"])]
-        phase_link, ip_link = \
-                            yield [("RDE", [user_frame, "phase"]),
-                                   ("RDE", [user_frame, "IP"])
-                                  ]
         inst, =             yield [("RD", [user_frame, "IP"])]
-        while_inst, new_phase = \
-                            yield [("RD", [inst, "while"]),
+        while_inst, =       yield [("RD", [inst, "while"])]
+        old_evalstack_link, old_phase_link, evalstack_roots = \
+                            yield [("RDE", [user_frame, "evalstack"]),
+                                   ("RDE", [user_frame, "phase"]),
+                                   ("RRD", [while_inst, "inst"]),
+                                  ]
+
+        if len(evalstack_roots) == 1:
+            evalstack_root = evalstack_roots[0]
+        else:
+            raise Exception("Could not process continue statement!")
+
+        prev_evalstack_roots, old_evalstack_phase_link = \
+                            yield [("RRD", [evalstack_root, "prev"]),
+                                   ("RDE", [evalstack_root, "phase"]),
+                                  ]
+
+        if len(prev_evalstack_roots) == 1:
+            prev_evalstack_root = prev_evalstack_roots[0]
+        else:
+            raise Exception("Could not process continue statement!")
+
+        new_evalstack_root, new_phase_while, new_phase_inst, prev_evalstack_root_link = \
+                            yield [("CN", []),
+                                   ("CNV", ["init"]),
                                    ("CNV", ["finish"]),
+                                   ("RDE", [prev_evalstack_root, "prev"]),
                                   ]
-        _, _, _, _ =        yield [("CD", [user_frame, "phase", new_phase]),
-                                   ("CD", [user_frame, "IP", while_inst]),
-                                   ("DE", [phase_link]),
-                                   ("DE", [ip_link]),
+
+        _, _, _, _, _, _, _, _  = \
+                            yield [("CD", [user_frame, "evalstack", new_evalstack_root]),
+                                   ("CD", [new_evalstack_root, "prev", evalstack_root]),
+                                   ("CD", [user_frame, "phase", new_phase_inst]),
+                                   ("CD", [evalstack_root, "phase", new_phase_while]),
+                                   ("DE", [old_evalstack_link]),
+                                   ("DE", [prev_evalstack_root_link]),
+                                   ("DE", [old_phase_link]),
+                                   ("DE", [old_evalstack_phase_link]),
                                   ]
 
     def break_init(self, user_root):
-        print("New break!")
-        raise Exception()
         user_frame, =       yield [("RD", [user_root, "frame"])]
         inst, =             yield [("RD", [user_frame, "IP"])]
         while_inst, =       yield [("RD", [inst, "while"])]
         old_evalstack_link, old_phase_link, evalstack_roots = \
-                            yield [("RD", [user_frame, "evalstack"]),
-                                   ("RDE", [inst, "phase"]),
+                            yield [("RDE", [user_frame, "evalstack"]),
+                                   ("RDE", [user_frame, "phase"]),
                                    ("RRD", [while_inst, "inst"]),
                                   ]
 
         if len(evalstack_roots) == 1:
             evalstack_root = evalstack_roots[0]
         else:
-            raise Exception("Could not process continue statement!")
+            raise Exception("Could not process break statement!")
 
         prev_evalstack_roots, old_evalstack_phase_link = \
                             yield [("RRD", [evalstack_root, "prev"]),
@@ -236,20 +259,20 @@ class ModelverseKernel(object):
         if len(prev_evalstack_roots) == 1:
             prev_evalstack_root = prev_evalstack_roots[0]
         else:
-            raise Exception("Could not process continue statement!")
+            raise Exception("Could not process break statement!")
 
         new_evalstack_root, new_phase_while, new_phase_inst, prev_evalstack_root_link = \
                             yield [("CN", []),
                                    ("CNV", ["finish"]),
                                    ("CNV", ["finish"]),
-                                   ("CDE", [prev_evalstack_root, "prev"]),
+                                   ("RDE", [prev_evalstack_root, "prev"]),
                                   ]
 
         _, _, _, _, _, _, _, _  = \
                             yield [("CD", [user_frame, "evalstack", new_evalstack_root]),
-                                   ("CD", [new_evalstack_root, "prev", prev_evalstack_root]),
-                                   ("CD", [inst, "phase", new_phase_inst]),
-                                   ("CD", [prev_evalstack_root, "phase", new_phase_while]),
+                                   ("CD", [new_evalstack_root, "prev", evalstack_root]),
+                                   ("CD", [user_frame, "phase", new_phase_inst]),
+                                   ("CD", [evalstack_root, "phase", new_phase_while]),
                                    ("DE", [old_evalstack_link]),
                                    ("DE", [prev_evalstack_root_link]),
                                    ("DE", [old_phase_link]),