|
@@ -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]),
|