main.py 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. import modelverse_kernel.primitives as primitive_functions
  2. import modelverse_kernel.compiled as compiled_functions
  3. import modelverse_jit.jit as jit
  4. import modelverse_jit.intrinsics as jit_intrinsics
  5. import sys
  6. import time
  7. if sys.version > '3': # pragma: no cover
  8. string_types = (str,)
  9. else:
  10. string_types = (str, unicode)
  11. class ModelverseKernel(object):
  12. def __init__(self, root):
  13. self.root = root
  14. self.returnvalue = None
  15. self.success = True
  16. self.generators = {}
  17. self.allow_compiled = True
  18. #self.allow_compiled = False
  19. # `self.jit` handles most JIT-related functionality.
  20. self.jit = jit.ModelverseJit()
  21. if self.allow_compiled:
  22. self.jit.compiled_function_lookup = lambda func_name: \
  23. getattr(compiled_functions, func_name, None)
  24. jit_intrinsics.register_intrinsics(self.jit)
  25. # To disable the JIT, uncomment the line below:
  26. # self.jit.set_jit_enabled(False)
  27. self.debug_info = "(no debug information found)"
  28. def execute_yields(self, username, operation, params, reply):
  29. try:
  30. self.success = True
  31. if username not in self.generators:
  32. self.generators[username] = {}
  33. if operation not in self.generators[username]:
  34. # Create the generator for the function to execute
  35. self.generators[username][operation] = getattr(self, operation)(username, *params)
  36. if reply is not None:
  37. return self.generators[username][operation].send(reply)
  38. else:
  39. return self.generators[username][operation].next()
  40. except StopIteration:
  41. # Done, so remove the generator
  42. del self.generators[username][operation]
  43. return None
  44. except:
  45. print("Unknown error @ %s" % self.debug_info)
  46. raise
  47. def execute_rule(self, username):
  48. user_root, = yield [("RD", [self.root, username])]
  49. user_frame, = yield [("RD", [user_root, "frame"])]
  50. inst, phase = yield [("RD", [user_frame, "IP"]),
  51. ("RD", [user_frame, "phase"]),
  52. ]
  53. self.new_debug, phase_v, inst_v = \
  54. yield [("RD", [inst, "__debug"]),
  55. ("RV", [phase]),
  56. ("RV", [inst]),
  57. ]
  58. if self.new_debug is not None:
  59. self.debug_info, = yield [("RV", [self.new_debug])]
  60. if phase_v == "finish":
  61. gen = self.helper_init(user_root)
  62. elif inst is None:
  63. raise Exception("Instruction pointer could not be found!")
  64. elif isinstance(phase_v, string_types):
  65. if phase_v == "init" and self.jit.is_jittable_entry_point(inst):
  66. #print("%-30s(%s)" % ("COMPILED " + str(self.jit.jitted_entry_points[inst]), phase_v))
  67. gen = self.execute_jit(user_root, inst, username)
  68. elif inst_v is None:
  69. raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info, inst_v, phase_v))
  70. else:
  71. gen = self.get_inst_phase_generator(inst_v, phase_v, user_root)
  72. elif inst_v is None:
  73. raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info, inst_v, phase_v))
  74. elif inst_v["value"] == "call":
  75. #print("%-30s(%s)" % ("call", "param"))
  76. gen = self.call_param(user_root)
  77. else:
  78. raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info, inst_v, phase_v))
  79. try:
  80. inp = None
  81. while 1:
  82. inp = yield gen.send(inp)
  83. except StopIteration:
  84. pass
  85. except jit.JitCompilationFailedException as e:
  86. # Try again, but this time without the JIT.
  87. # print(e.message)
  88. gen = self.get_inst_phase_generator(inst_v, phase_v, user_root)
  89. try:
  90. inp = None
  91. while 1:
  92. inp = yield gen.send(inp)
  93. except StopIteration:
  94. pass
  95. def get_inst_phase_generator(self, inst_v, phase_v, user_root):
  96. """Gets a generator for the given instruction in the given phase,
  97. for the specified user root."""
  98. #print("%-30s(%s) -- %s" % (inst_v["value"], phase_v, username))
  99. return getattr(self, "%s_%s" % (inst_v["value"], phase_v))(user_root)
  100. ##########################
  101. ### Process primitives ###
  102. ##########################
  103. def load_primitives(self, username):
  104. hierarchy, = yield [("RD", [self.root, "__hierarchy"])]
  105. primitives, = yield [("RD", [hierarchy, "primitives"])]
  106. keys, = yield [("RDK", [primitives])]
  107. function_names = yield [("RV", [f]) for f in keys]
  108. signatures = yield [("RDN", [primitives, f]) for f in keys]
  109. bodies = yield [("RD", [f, "body"]) for f in signatures]
  110. for i in range(len(keys)):
  111. self.jit.register_compiled(
  112. bodies[i],
  113. getattr(primitive_functions, function_names[i]),
  114. function_names[i])
  115. def execute_jit(self, user_root, inst, username):
  116. # execute_jit
  117. user_frame, = yield [("RD", [user_root, "frame"])]
  118. symbols, = yield [("RD", [user_frame, "symbols"])]
  119. all_links, = yield [("RO", [symbols])]
  120. containers = yield [("RE", [v]) for v in all_links]
  121. outgoings = yield [("RO", [v]) for v in all_links]
  122. dict_values = yield [("RD", [v[1], "value"]) for v in containers]
  123. formals_1 = yield [("RE", [v[0]]) for v in outgoings]
  124. dict_keys_ref = yield [("RD", [v[1], "name"]) for v in formals_1]
  125. dict_keys = yield [("RV", [v]) for v in dict_keys_ref]
  126. parameters = dict(zip(dict_keys, dict_values))
  127. parameters["root"] = self.root
  128. parameters["user_root"] = user_root
  129. parameters["username"] = username
  130. parameters["mvk"] = self
  131. # Have the JIT compile the function.
  132. try:
  133. jit_gen = self.jit.jit_compile(user_root, inst)
  134. inp = None
  135. while 1:
  136. inp = yield jit_gen.send(inp)
  137. except primitive_functions.PrimitiveFinished as e:
  138. compiled_func = e.result
  139. # Run the compiled function.
  140. try:
  141. prim = compiled_func(**parameters)
  142. inp = None
  143. while 1:
  144. inp = yield prim.send(inp)
  145. except StopIteration:
  146. # Execution has ended without return value, so we have no idea what to do
  147. raise Exception("%s: primitive finished without returning a value!" % (self.debug_info))
  148. except primitive_functions.PrimitiveFinished as e:
  149. # Execution has ended with a returnvalue, so read it out from the exception being thrown
  150. result = e.result
  151. #if result is None:
  152. # raise Exception("Primitive raised exception: value of None for operation %s with parameters %s" % (compiled_func, str(parameters)))
  153. # Clean up the current stack, as if a return happened
  154. old_frame, = yield [("RD", [user_frame, "prev"])]
  155. lnk, = yield [("RDE", [old_frame, "returnvalue"])]
  156. _, _, _, _ = yield [("CD", [old_frame, "returnvalue", result]),
  157. ("CD", [user_root, "frame", old_frame]),
  158. ("DE", [lnk]),
  159. ("DN", [user_frame]),
  160. ]
  161. ########################################
  162. ### Execute input and output methods ###
  163. ########################################
  164. def get_output(self, username):
  165. user_root, = yield [("RD", [self.root, username])]
  166. first_output, = yield [("RD", [user_root, "output"])]
  167. next_output, rv = yield [("RD", [first_output, "next"]),
  168. ("RD", [first_output, "value"]),
  169. ]
  170. if next_output is None:
  171. self.success = False
  172. self.returnvalue = None
  173. else:
  174. rv_value, = yield [("RV", [rv])]
  175. _, _ = yield [("CD", [user_root, "output", next_output]),
  176. ("DN", [first_output]),
  177. ]
  178. self.returnvalue = rv_value
  179. def set_input(self, username, value):
  180. user_root, = yield [("RD", [self.root, username])]
  181. old_input, link = yield [("RD", [user_root, "last_input"]),
  182. ("RDE", [user_root, "last_input"]),
  183. ]
  184. new_input, = yield [("CN", [])]
  185. _, _ = yield [("CD", [user_root, "last_input", new_input]),
  186. ("CD", [old_input, "next", new_input]),
  187. ]
  188. new_value, = yield [("CNV", [value])]
  189. _, _ = yield [("CD", [old_input, "value", new_value]),
  190. ("DE", [link])
  191. ]
  192. self.returnvalue = {"id": 100, "value": "success"}
  193. #############################################
  194. ### Transformation rules for instructions ###
  195. #############################################
  196. def break_init(self, user_root):
  197. user_frame, = yield [("RD", [user_root, "frame"])]
  198. phase_link, ip_link = \
  199. yield [("RDE", [user_frame, "phase"]),
  200. ("RDE", [user_frame, "IP"])
  201. ]
  202. inst, = yield [("RD", [user_frame, "IP"])]
  203. while_inst, new_phase = \
  204. yield [("RD", [inst, "while"]),
  205. ("CNV", ["finish"]),
  206. ]
  207. _, _, _, _ = yield [("CD", [user_frame, "phase", new_phase]),
  208. ("CD", [user_frame, "IP", while_inst]),
  209. ("DE", [phase_link]),
  210. ("DE", [ip_link]),
  211. ]
  212. def continue_init(self, user_root):
  213. user_frame, = yield [("RD", [user_root, "frame"])]
  214. ip_link, inst = yield [("RDE", [user_frame, "IP"]),
  215. ("RD", [user_frame, "IP"]),
  216. ]
  217. while_inst, = yield [("RD", [inst, "while"])]
  218. _, _ = yield [("CD", [user_frame, "IP", while_inst]),
  219. ("DE", [ip_link]),
  220. ]
  221. def if_init(self, user_root):
  222. user_frame, = yield [("RD", [user_root, "frame"])]
  223. evalstack, evalstack_link = \
  224. yield [("RD", [user_frame, "evalstack"]),
  225. ("RDE", [user_frame, "evalstack"]),
  226. ]
  227. inst, ip_link = yield [("RD", [user_frame, "IP"]),
  228. ("RDE", [user_frame, "IP"]),
  229. ]
  230. cond, = yield [("RD", [inst, "cond"])]
  231. new_evalstack, new_phase = \
  232. yield [("CN", []),
  233. ("CNV", ["cond"]),
  234. ]
  235. _, _, _, _, _, _, _ = \
  236. yield [("CD", [user_frame, "evalstack", new_evalstack]),
  237. ("CD", [new_evalstack, "prev", evalstack]),
  238. ("CD", [user_frame, "IP", cond]),
  239. ("CD", [evalstack, "inst", inst]),
  240. ("CD", [evalstack, "phase", new_phase]),
  241. ("DE", [evalstack_link]),
  242. ("DE", [ip_link]),
  243. ]
  244. def if_cond(self, user_root):
  245. user_frame, = yield [("RD", [user_root, "frame"])]
  246. returnvalue, inst = yield [("RD", [user_frame, "returnvalue"]),
  247. ("RD", [user_frame, "IP"]),
  248. ]
  249. returnvalue_v, = yield [("RV", [returnvalue])]
  250. _else, = yield [("RD", [inst, "else"])]
  251. if returnvalue_v:
  252. phase_link, evalstack, evalstack_link, ip_link, _then, new_evalstack, evalstack_phase, new_phase = \
  253. yield [("RDE", [user_frame, "phase"]),
  254. ("RD", [user_frame, "evalstack"]),
  255. ("RDE", [user_frame, "evalstack"]),
  256. ("RDE", [user_frame, "IP"]),
  257. ("RD", [inst, "then"]),
  258. ("CN", []),
  259. ("CNV", ["finish"]),
  260. ("CNV", ["init"]),
  261. ]
  262. _, _, _, _, _, _, _, _, _ = \
  263. yield [("CD", [user_frame, "evalstack", new_evalstack]),
  264. ("CD", [user_frame, "IP", _then]),
  265. ("CD", [new_evalstack, "prev", evalstack]),
  266. ("CD", [evalstack, "inst", inst]),
  267. ("CD", [evalstack, "phase", evalstack_phase]),
  268. ("CD", [user_frame, "phase", new_phase]),
  269. ("DE", [evalstack_link]),
  270. ("DE", [ip_link]),
  271. ("DE", [phase_link]),
  272. ]
  273. elif _else is None:
  274. phase_link, new_phase = \
  275. yield [("RDE", [user_frame, "phase"]),
  276. ("CNV", ["finish"]),
  277. ]
  278. _, _ = yield [("CD", [user_frame, "phase", new_phase]),
  279. ("DE", [phase_link]),
  280. ]
  281. else:
  282. phase_link, evalstack, evalstack_link, ip_link = \
  283. yield [("RDE", [user_frame, "phase"]),
  284. ("RD", [user_frame, "evalstack"]),
  285. ("RDE", [user_frame, "evalstack"]),
  286. ("RDE", [user_frame, "IP"]),
  287. ]
  288. new_evalstack, new_phase, evalstack_phase = \
  289. yield [("CN", []),
  290. ("CNV", ["init"]),
  291. ("CNV", ["finish"]),
  292. ]
  293. _, _, _, _, _, _, _, _, _ = \
  294. yield [("CD", [user_frame, "evalstack", new_evalstack]),
  295. ("CD", [user_frame, "IP", _else]),
  296. ("CD", [new_evalstack, "prev", evalstack]),
  297. ("CD", [evalstack, "inst", inst]),
  298. ("CD", [evalstack, "phase", evalstack_phase]),
  299. ("CD", [user_frame, "phase", new_phase]),
  300. ("DE", [evalstack_link]),
  301. ("DE", [ip_link]),
  302. ("DE", [phase_link]),
  303. ]
  304. def while_init(self, user_root):
  305. user_frame, = yield [("RD", [user_root, "frame"])]
  306. evalstack, evalstack_link, ip_link, inst = \
  307. yield [("RD", [user_frame, "evalstack"]),
  308. ("RDE", [user_frame, "evalstack"]),
  309. ("RDE", [user_frame, "IP"]),
  310. ("RD", [user_frame, "IP"]),
  311. ]
  312. cond, new_evalstack, new_phase = \
  313. yield [("RD", [inst, "cond"]),
  314. ("CN", []),
  315. ("CNV", ["cond"]),
  316. ]
  317. _, _, _, _, _, _, _ = \
  318. yield [("CD", [user_frame, "evalstack", new_evalstack]),
  319. ("CD", [new_evalstack, "prev", evalstack]),
  320. ("CD", [user_frame, "IP", cond]),
  321. ("CD", [evalstack, "phase", new_phase]),
  322. ("CD", [evalstack, "inst", inst]),
  323. ("DE", [evalstack_link]),
  324. ("DE", [ip_link]),
  325. ]
  326. def while_cond(self, user_root):
  327. user_frame, = yield [("RD", [user_root, "frame"])]
  328. returnvalue, = yield [("RD", [user_frame, "returnvalue"])]
  329. returnvalue_v, = yield [("RV", [returnvalue])]
  330. if returnvalue_v:
  331. phase_link, evalstack, evalstack_link, ip_link, inst = \
  332. yield [("RDE", [user_frame, "phase"]),
  333. ("RD", [user_frame, "evalstack"]),
  334. ("RDE", [user_frame, "evalstack"]),
  335. ("RDE", [user_frame, "IP"]),
  336. ("RD", [user_frame, "IP"]),
  337. ]
  338. body, = yield [("RD", [inst, "body"])]
  339. new_evalstack, new_phase, evalstack_phase = \
  340. yield [("CN", []),
  341. ("CNV", ["init"]),
  342. ("CNV", ["init"]),
  343. ]
  344. _, _, _, _, _, _, _, _, _ = \
  345. yield [("CD", [user_frame, "IP", body]),
  346. ("CD", [user_frame, "phase", new_phase]),
  347. ("CD", [user_frame, "evalstack", new_evalstack]),
  348. ("CD", [new_evalstack, "prev", evalstack]),
  349. ("CD", [evalstack, "inst", inst]),
  350. ("CD", [evalstack, "phase", evalstack_phase]),
  351. ("DE", [evalstack_link]),
  352. ("DE", [ip_link]),
  353. ("DE", [phase_link]),
  354. ]
  355. else:
  356. phase_link, new_phase = \
  357. yield [("RDE", [user_frame, "phase"]),
  358. ("CNV", ["finish"]),
  359. ]
  360. _, _ = yield [("CD", [user_frame, "phase", new_phase]),
  361. ("DE", [phase_link])
  362. ]
  363. def access_init(self, user_root):
  364. user_frame, = yield [("RD", [user_root, "frame"])]
  365. evalstack, evalstack_link, inst, ip_link = \
  366. yield [("RD", [user_frame, "evalstack"]),
  367. ("RDE", [user_frame, "evalstack"]),
  368. ("RD", [user_frame, "IP"]),
  369. ("RDE", [user_frame, "IP"]),
  370. ]
  371. var, new_evalstack, new_phase = \
  372. yield [("RD", [inst, "var"]),
  373. ("CN", []),
  374. ("CNV", ["eval"]),
  375. ]
  376. _, _, _, _, _, _, _ = \
  377. yield [("CD", [user_frame, "IP", var]),
  378. ("CD", [user_frame, "evalstack", new_evalstack]),
  379. ("CD", [new_evalstack, "prev", evalstack]),
  380. ("CD", [evalstack, "inst", inst]),
  381. ("CD", [evalstack, "phase", new_phase]),
  382. ("DE", [evalstack_link]),
  383. ("DE", [ip_link]),
  384. ]
  385. def access_eval(self, user_root):
  386. user_frame, = yield [("RD", [user_root, "frame"])]
  387. phase_link, returnvalue_link, returnvalue = \
  388. yield [("RDE", [user_frame, "phase"]),
  389. ("RDE", [user_frame, "returnvalue"]),
  390. ("RD", [user_frame, "returnvalue"]),
  391. ]
  392. value, new_phase = yield [("RD", [returnvalue, "value"]),
  393. ("CNV", ["finish"]),
  394. ]
  395. _, _, _, _ = yield [("CD", [user_frame, "phase", new_phase]),
  396. ("CD", [user_frame, "returnvalue", value]),
  397. ("DE", [phase_link]),
  398. ("DE", [returnvalue_link]),
  399. ]
  400. def resolve_init(self, user_root):
  401. user_frame, = yield [("RD", [user_root, "frame"])]
  402. symbols, evalstack, evalstack_link, ip_link, inst = \
  403. yield [("RD", [user_frame, "symbols"]),
  404. ("RD", [user_frame, "evalstack"]),
  405. ("RDE", [user_frame, "evalstack"]),
  406. ("RDE", [user_frame, "IP"]),
  407. ("RD", [user_frame, "IP"]),
  408. ]
  409. var, = yield [("RD", [inst, "var"])]
  410. variable, = yield [("RDN", [symbols, var])]
  411. if variable is None:
  412. phase_link, returnvalue_link, _globals, var_name = \
  413. yield [("RDE", [user_frame, "phase"]),
  414. ("RDE", [user_frame, "returnvalue"]),
  415. ("RD", [user_root, "globals"]),
  416. ("RV", [var]),
  417. ]
  418. variable, new_phase = \
  419. yield [("RD", [_globals, var_name]),
  420. ("CNV", ["finish"]),
  421. ]
  422. if variable is None:
  423. raise Exception("%s: not found as global: %s" % (self.debug_info, var_name))
  424. # Resolved a global, so this is a string
  425. # Potentially, this might even be a function that we have precompiled already!
  426. # So check whether this is the case or not
  427. if self.allow_compiled:
  428. compiled_function = getattr(compiled_functions, var_name, None)
  429. if compiled_function is not None:
  430. # We have a compiled function ready!
  431. # Now we have to bind the ID to the compiled functions
  432. # For this, we read out the body of the resolved data
  433. compiler_val, = yield [("RD", [variable, "value"])]
  434. compiler_body, = yield [("RD", [compiler_val, "body"])]
  435. self.jit.register_compiled(compiler_body, compiled_function, var_name)
  436. else:
  437. phase_link, returnvalue_link, new_phase = \
  438. yield [("RDE", [user_frame, "phase"]),
  439. ("RDE", [user_frame, "returnvalue"]),
  440. ("CNV", ["finish"]),
  441. ]
  442. _, _, _, _ = yield [("CD", [user_frame, "phase", new_phase]),
  443. ("CD", [user_frame, "returnvalue", variable]),
  444. ("DE", [phase_link]),
  445. ("DE", [returnvalue_link]),
  446. ]
  447. def assign_init(self, user_root):
  448. user_frame, = yield [("RD", [user_root, "frame"])]
  449. evalstack, evalstack_link, ip_link, inst = \
  450. yield [("RD", [user_frame, "evalstack"]),
  451. ("RDE", [user_frame, "evalstack"]),
  452. ("RDE", [user_frame, "IP"]),
  453. ("RD", [user_frame, "IP"]),
  454. ]
  455. var, new_evalstack, new_phase = \
  456. yield [("RD", [inst, "var"]),
  457. ("CN", []),
  458. ("CNV", ["value"]),
  459. ]
  460. _, _, _, _, _, _, _ = \
  461. yield [("CD", [user_frame, "IP", var]),
  462. ("CD", [user_frame, "evalstack", new_evalstack]),
  463. ("CD", [new_evalstack, "prev", evalstack]),
  464. ("CD", [evalstack, "inst", inst]),
  465. ("CD", [evalstack, "phase", new_phase]),
  466. ("DE", [evalstack_link]),
  467. ("DE", [ip_link]),
  468. ]
  469. def assign_value(self, user_root):
  470. user_frame, = yield [("RD", [user_root, "frame"])]
  471. phase_link, evalstack, returnvalue, evalstack_link, ip_link, inst = \
  472. yield [("RDE", [user_frame, "phase"]),
  473. ("RD", [user_frame, "evalstack"]),
  474. ("RD", [user_frame, "returnvalue"]),
  475. ("RDE", [user_frame, "evalstack"]),
  476. ("RDE", [user_frame, "IP"]),
  477. ("RD", [user_frame, "IP"]),
  478. ]
  479. value, new_evalstack, new_phase, evalstack_phase = \
  480. yield [("RD", [inst, "value"]),
  481. ("CN", []),
  482. ("CNV", ["init"]),
  483. ("CNV", ["assign"]),
  484. ]
  485. _, _, _, _, _, _, _, _, _, _ = \
  486. yield [("CD", [user_frame, "variable", returnvalue]),
  487. ("CD", [user_frame, "phase", new_phase]),
  488. ("CD", [user_frame, "evalstack", new_evalstack]),
  489. ("CD", [new_evalstack, "prev", evalstack]),
  490. ("CD", [evalstack, "inst", inst]),
  491. ("CD", [evalstack, "phase", evalstack_phase]),
  492. ("CD", [user_frame, "IP", value]),
  493. ("DE", [evalstack_link]),
  494. ("DE", [phase_link]),
  495. ("DE", [ip_link]),
  496. ]
  497. def assign_assign(self, user_root):
  498. user_frame, = yield [("RD", [user_root, "frame"])]
  499. phase_link, returnvalue, variable_link, variable = \
  500. yield [("RDE", [user_frame, "phase"]),
  501. ("RD", [user_frame, "returnvalue"]),
  502. ("RDE", [user_frame, "variable"]),
  503. ("RD", [user_frame, "variable"]),
  504. ]
  505. value_link, new_phase = \
  506. yield [("RDE", [variable, "value"]),
  507. ("CNV", ["finish"]),
  508. ]
  509. _, _, _, _, _ = yield [("CD", [user_frame, "phase", new_phase]),
  510. ("CD", [variable, "value", returnvalue]),
  511. ("DE", [variable_link]),
  512. ("DE", [value_link]),
  513. ("DE", [phase_link]),
  514. ]
  515. def return_init(self, user_root):
  516. user_frame, = yield [("RD", [user_root, "frame"])]
  517. inst, = yield [("RD", [user_frame, "IP"])]
  518. value, = yield [("RD", [inst, "value"])]
  519. if value is None:
  520. prev_frame, = yield [("RD", [user_frame, "prev"])]
  521. _, _ = yield [("CD", [user_root, "frame", prev_frame]),
  522. ("DN", [user_frame]),
  523. ]
  524. else:
  525. evalstack, evalstack_link, ip_link, new_evalstack, evalstack_phase = \
  526. yield [("RD", [user_frame, "evalstack"]),
  527. ("RDE", [user_frame, "evalstack"]),
  528. ("RDE", [user_frame, "IP"]),
  529. ("CN", []),
  530. ("CNV", ["eval"]),
  531. ]
  532. _, _, _, _, _, _, _ = \
  533. yield [("CD", [user_frame, "evalstack", new_evalstack]),
  534. ("CD", [new_evalstack, "prev", evalstack]),
  535. ("CD", [evalstack, "inst", inst]),
  536. ("CD", [evalstack, "phase", evalstack_phase]),
  537. ("CD", [user_frame, "IP", value]),
  538. ("DE", [evalstack_link]),
  539. ("DE", [ip_link]),
  540. ]
  541. def return_eval(self, user_root):
  542. user_frame, = yield [("RD", [user_root, "frame"])]
  543. prev_frame, = yield [("RD", [user_frame, "prev"])]
  544. returnvalue, old_returnvalue_link = \
  545. yield [("RD", [user_frame, "returnvalue"]),
  546. ("RDE", [prev_frame, "returnvalue"]),
  547. ]
  548. _, _, _, _ = yield [("CD", [user_root, "frame", prev_frame]),
  549. ("CD", [prev_frame, "returnvalue", returnvalue]),
  550. ("DE", [old_returnvalue_link]),
  551. ("DN", [user_frame]),
  552. ]
  553. def constant_init(self, user_root):
  554. user_frame, = yield [("RD", [user_root, "frame"])]
  555. phase_link, returnvalue_link, inst = \
  556. yield [("RDE", [user_frame, "phase"]),
  557. ("RDE", [user_frame, "returnvalue"]),
  558. ("RD", [user_frame, "IP"]),
  559. ]
  560. node, new_phase = yield [("RD", [inst, "node"]),
  561. ("CNV", ["finish"]),
  562. ]
  563. _, _, _, _ = yield [("CD", [user_frame, "phase", new_phase]),
  564. ("CD", [user_frame, "returnvalue", node]),
  565. ("DE", [returnvalue_link]),
  566. ("DE", [phase_link]),
  567. ]
  568. def helper_init(self, user_root):
  569. user_frame, = yield [("RD", [user_root, "frame"])]
  570. inst, = yield [("RD", [user_frame, "IP"])]
  571. next, = yield [("RD", [inst, "next"])]
  572. if next is None:
  573. ip_link, phase_link, evalstack_top = \
  574. yield [("RDE", [user_frame, "IP"]),
  575. ("RDE", [user_frame, "phase"]),
  576. ("RD", [user_frame, "evalstack"]),
  577. ]
  578. evalstack, = yield [("RD", [evalstack_top, "prev"])]
  579. evalstack_inst, evalstack_phase, evalstack_inst_link, evalstack_phase_link = \
  580. yield [("RD", [evalstack, "inst"]),
  581. ("RD", [evalstack, "phase"]),
  582. ("RDE", [evalstack, "inst"]),
  583. ("RDE", [evalstack, "phase"]),
  584. ]
  585. _, _, _, _, _, _, _, _ = \
  586. yield [("CD", [user_frame, "evalstack", evalstack]),
  587. ("CD", [user_frame, "IP", evalstack_inst]),
  588. ("CD", [user_frame, "phase", evalstack_phase]),
  589. ("DE", [ip_link]),
  590. ("DE", [phase_link]),
  591. ("DE", [evalstack_inst_link]),
  592. ("DE", [evalstack_phase_link]),
  593. ("DN", [evalstack_top]),
  594. ]
  595. else:
  596. ip_link, phase_link, new_phase = \
  597. yield [("RDE", [user_frame, "IP"]),
  598. ("RDE", [user_frame, "phase"]),
  599. ("CNV", ["init"]),
  600. ]
  601. _, _, _, _ = yield [("CD", [user_frame, "IP", next]),
  602. ("CD", [user_frame, "phase", new_phase]),
  603. ("DE", [ip_link]),
  604. ("DE", [phase_link]),
  605. ]
  606. def call_init(self, user_root):
  607. user_frame, = yield [("RD", [user_root, "frame"])]
  608. symbols, evalstack, evalstack_link, ip_link, inst = \
  609. yield [("RD", [user_frame, "symbols"]),
  610. ("RD", [user_frame, "evalstack"]),
  611. ("RDE", [user_frame, "evalstack"]),
  612. ("RDE", [user_frame, "IP"]),
  613. ("RD", [user_frame, "IP"]),
  614. ]
  615. func, params = yield [("RD", [inst, "func"]),
  616. ("RD", [inst, "params"]),
  617. ]
  618. if params is None:
  619. new_evalstack, evalstack_phase = \
  620. yield [("CN", []),
  621. ("CNV", ["call"]),
  622. ]
  623. _, _, _, _, _, _, _ = \
  624. yield [("CD", [user_frame, "evalstack", new_evalstack]),
  625. ("CD", [new_evalstack, "prev", evalstack]),
  626. ("CD", [evalstack, "inst", inst]),
  627. ("CD", [evalstack, "phase", evalstack_phase]),
  628. ("CD", [user_frame, "IP", func]),
  629. ("DE", [evalstack_link]),
  630. ("DE", [ip_link]),
  631. ]
  632. else:
  633. new_evalstack,= yield [("CN", [])]
  634. _, _, _, _, _, _, _ = \
  635. yield [("CD", [user_frame, "evalstack", new_evalstack]),
  636. ("CD", [new_evalstack, "prev", evalstack]),
  637. ("CD", [evalstack, "inst", inst]),
  638. ("CD", [evalstack, "phase", params]),
  639. ("CD", [user_frame, "IP", func]),
  640. ("DE", [evalstack_link]),
  641. ("DE", [ip_link]),
  642. ]
  643. def call_call(self, user_root):
  644. user_frame, = yield [("RD", [user_root, "frame"])]
  645. inst, = yield [("RD", [user_frame, "IP"])]
  646. param, = yield [("RD", [inst, "last_param"])]
  647. if param is None:
  648. returnvalue, = yield [("RD", [user_frame, "returnvalue"])]
  649. body, = yield [("RD", [returnvalue, "body"])]
  650. self.jit.mark_entry_point(body)
  651. phase_link, frame_link, prev_phase, new_phase, new_frame, new_evalstack, new_symbols, new_returnvalue = \
  652. yield [("RDE", [user_frame, "phase"]),
  653. ("RDE", [user_root, "frame"]),
  654. ("CNV", ["finish"]),
  655. ("CNV", ["init"]),
  656. ("CN", []),
  657. ("CN", []),
  658. ("CN", []),
  659. ("CN", []),
  660. ]
  661. _, _, _, _, _, _, _, _, _, _, _ = \
  662. yield [("CD", [user_root, "frame", new_frame]),
  663. ("CD", [new_frame, "evalstack", new_evalstack]),
  664. ("CD", [new_frame, "symbols", new_symbols]),
  665. ("CD", [new_frame, "returnvalue", new_returnvalue]),
  666. ("CD", [new_frame, "caller", inst]),
  667. ("CD", [new_frame, "phase", new_phase]),
  668. ("CD", [new_frame, "IP", body]),
  669. ("CD", [new_frame, "prev", user_frame]),
  670. ("CD", [user_frame, "phase", prev_phase]),
  671. ("DE", [phase_link]),
  672. ("DE", [frame_link]),
  673. ]
  674. else:
  675. newer_frames, invoking_frames = \
  676. yield [("RRD", [user_frame, "prev"]),
  677. ("RRD", [inst, "caller"]),
  678. ]
  679. new_frame = self.find_overlapping(newer_frames, invoking_frames)
  680. phase_link, frame_link, new_symbols, new_IP = \
  681. yield [("RDE", [user_frame, "phase"]),
  682. ("RDE", [user_root, "frame"]),
  683. ("RD", [new_frame, "symbols"]),
  684. ("RD", [new_frame, "IP"]),
  685. ]
  686. signature, = yield [("RRD", [new_IP, "body"])]
  687. signature = signature[0]
  688. sig_params, last_param = \
  689. yield [("RD", [signature, "params"]),
  690. ("RD", [inst, "last_param"]),
  691. ]
  692. body, = yield [("RD", [new_IP, "body"])]
  693. self.jit.mark_entry_point(body)
  694. name, = yield [("RD", [last_param, "name"])]
  695. name_value, = yield [("RV", [name])]
  696. returnvalue, formal_parameter, new_phase, variable = \
  697. yield [("RD", [user_frame, "returnvalue"]),
  698. ("RD", [sig_params, name_value]),
  699. ("CNV", ["finish"]),
  700. ("CN", []),
  701. ]
  702. _, _, _, t1 = yield [("CD", [user_root, "frame", new_frame]),
  703. ("CD", [user_frame, "phase", new_phase]),
  704. ("CD", [variable, "value", returnvalue]),
  705. ("CE", [new_symbols, variable]),
  706. ]
  707. _, _, _ = yield [("CE", [t1, formal_parameter]),
  708. ("DE", [frame_link]),
  709. ("DE", [phase_link]),
  710. ]
  711. def find_overlapping(self, a, b):
  712. newer_frames = set(a)
  713. invoking_frames = set(b)
  714. matches = list(newer_frames.intersection(invoking_frames))
  715. if len(matches) == 1:
  716. return matches[0]
  717. elif len(matches) > 1:
  718. raise Exception("%s: error: multiple overlapping elements" % self.debug_info)
  719. else:
  720. raise Exception("%s: error: could not find any overlap" % self.debug_info)
  721. def call_param(self, user_root):
  722. user_frame, = yield [("RD", [user_root, "frame"])]
  723. inst, phase = yield [("RD", [user_frame, "IP"]),
  724. ("RD", [user_frame, "phase"]),
  725. ]
  726. params, last_param = \
  727. yield [("RD", [inst, "params"]),
  728. ("RD", [inst, "last_param"]),
  729. ]
  730. next_param, = yield [("RD", [params, "next_param"])]
  731. if params == phase:
  732. phase_link, ip_link, returnvalue, param_value, evalstack, evalstack_link = \
  733. yield [("RDE", [user_frame, "phase"]),
  734. ("RDE", [user_frame, "IP"]),
  735. ("RD", [user_frame, "returnvalue"]),
  736. ("RD", [params, "value"]),
  737. ("RD", [user_frame, "evalstack"]),
  738. ("RDE", [user_frame, "evalstack"]),
  739. ]
  740. body, = yield [("RD", [returnvalue, "body"])]
  741. new_frame, prev_evalstack, new_phase, prev_phase, new_evalstack, new_symbols, new_returnvalue = \
  742. yield [("CN", []),
  743. ("CN", []),
  744. ("CNV", ["init"]),
  745. ("CNV", ["init"]),
  746. ("CN", []),
  747. ("CN", []),
  748. ("CN", []),
  749. ]
  750. _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ = \
  751. yield [("CD", [new_frame, "evalstack", new_evalstack]),
  752. ("CD", [new_frame, "symbols", new_symbols]),
  753. ("CD", [new_frame, "returnvalue", new_returnvalue]),
  754. ("CD", [new_frame, "caller", inst]),
  755. ("CD", [new_frame, "phase", new_phase]),
  756. ("CD", [new_frame, "IP", body]),
  757. ("CD", [new_frame, "prev", user_frame]),
  758. ("CD", [user_frame, "phase", prev_phase]),
  759. ("CD", [user_frame, "IP", param_value]),
  760. ("CD", [prev_evalstack, "prev", evalstack]),
  761. ("CD", [evalstack, "inst", inst]),
  762. ("CD", [user_frame, "evalstack", prev_evalstack]),
  763. ("DE", [evalstack_link]),
  764. ("DE", [ip_link]),
  765. ("DE", [phase_link]),
  766. ]
  767. if next_param is not None:
  768. _ = yield [("CD", [evalstack, "phase", next_param])]
  769. else:
  770. evalstack_phase, = \
  771. yield [("CNV", ["call"])]
  772. _ = yield [("CD", [evalstack, "phase", evalstack_phase])]
  773. else:
  774. frame_link, phase_link, newer_frames, invoking_frames = \
  775. yield [("RDE", [user_root, "frame"]),
  776. ("RDE", [user_frame, "phase"]),
  777. ("RRD", [user_frame, "prev"]),
  778. ("RRD", [inst, "caller"]),
  779. ]
  780. new_frame = self.find_overlapping(newer_frames, invoking_frames)
  781. ip_link, evalstack, evalstack_link, new_symbols, new_IP = \
  782. yield [("RDE", [user_frame, "IP"]),
  783. ("RD", [user_frame, "evalstack"]),
  784. ("RDE", [user_frame, "evalstack"]),
  785. ("RD", [new_frame, "symbols"]),
  786. ("RD", [new_frame, "IP"]),
  787. ]
  788. signature, = yield [("RRD", [new_IP, "body"])]
  789. signature = signature[0]
  790. sig_params, = yield [("RD", [signature, "params"])]
  791. if last_param == phase:
  792. prev_param, = \
  793. yield [("RRD", [last_param, "next_param"])]
  794. prev_param = prev_param[0]
  795. name, = yield [("RD", [prev_param, "name"])]
  796. name_value, = \
  797. yield [("RV", [name])]
  798. evalstack_phase, = \
  799. yield [("CNV", ["call"])]
  800. _ = yield [("CD", [evalstack, "phase", evalstack_phase])]
  801. formal_parameter, param_value = \
  802. yield [("RD", [sig_params, name_value]),
  803. ("RD", [last_param, "value"]),
  804. ]
  805. else:
  806. param_b, = yield [("RD", [user_frame, "phase"])]
  807. param_c, param_a = \
  808. yield [("RD", [param_b, "next_param"]),
  809. ("RRD", [param_b, "next_param"]),
  810. ]
  811. param_a = param_a[0]
  812. name, param_value = \
  813. yield [("RD", [param_a, "name"]),
  814. ("RD", [param_b, "value"]),
  815. ]
  816. name_value, = \
  817. yield [("RV", [name])]
  818. formal_parameter, _ = \
  819. yield [("RD", [sig_params, name_value]),
  820. ("CD", [evalstack, "phase", param_c]),
  821. ]
  822. new_phase, new_evalstack, variable, returnvalue = \
  823. yield [("CNV", ["init"]),
  824. ("CN", []),
  825. ("CN", []),
  826. ("RD", [user_frame, "returnvalue"]),
  827. ]
  828. _, _, _, _, _, _ = \
  829. yield [("CD", [user_frame, "evalstack", new_evalstack]),
  830. ("CD", [new_evalstack, "prev", evalstack]),
  831. ("CD", [evalstack, "inst", inst]),
  832. ("CD", [user_frame, "phase", new_phase]),
  833. ("CD", [user_frame, "IP", param_value]),
  834. ("CD", [variable, "value", returnvalue]),
  835. ]
  836. t1, = yield [("CE", [new_symbols, variable])]
  837. _, _, _, _ = \
  838. yield [("CE", [t1, formal_parameter]),
  839. ("DE", [phase_link]),
  840. ("DE", [ip_link]),
  841. ("DE", [evalstack_link]),
  842. ]
  843. def input_init(self, user_root):
  844. user_frame, = yield [("RD", [user_root, "frame"])]
  845. returnvalue_link, _input = \
  846. yield [("RDE", [user_frame, "returnvalue"]),
  847. ("RD", [user_root, "input"]),
  848. ]
  849. value, next, phase_link = \
  850. yield [("RD", [_input, "value"]),
  851. ("RD", [_input, "next"]),
  852. ("RDE", [user_frame, "phase"]),
  853. ]
  854. if value is not None:
  855. v = yield [("RV", [value])]
  856. _, _, finish = \
  857. yield [("CD", [user_frame, "returnvalue", value]),
  858. ("CD", [user_root, "input", next]),
  859. ("CNV", ["finish"]),
  860. ]
  861. _, _, _, _ = \
  862. yield [("CD", [user_frame, "phase", finish]),
  863. ("DN", [_input]),
  864. ("DE", [returnvalue_link]),
  865. ("DE", [phase_link]),
  866. ]
  867. self.input_value = value
  868. else:
  869. # No input yet, so just wait and don't advance IP or phase
  870. self.input_value = None
  871. self.success = False
  872. def output_init(self, user_root):
  873. user_frame, = yield [("RD", [user_root, "frame"])]
  874. evalstack, evalstack_link, ip_link, inst = \
  875. yield [("RD", [user_frame, "evalstack"]),
  876. ("RDE", [user_frame, "evalstack"]),
  877. ("RDE", [user_frame, "IP"]),
  878. ("RD", [user_frame, "IP"]),
  879. ]
  880. value, new_evalstack, evalstack_phase = \
  881. yield [("RD", [inst, "value"]),
  882. ("CN", []),
  883. ("CNV", ["output"]),
  884. ]
  885. _, _, _, _, _, _, _ = \
  886. yield [("CD", [user_frame, "evalstack", new_evalstack]),
  887. ("CD", [new_evalstack, "prev", evalstack]),
  888. ("CD", [evalstack, "inst", inst]),
  889. ("CD", [evalstack, "phase", evalstack_phase]),
  890. ("CD", [user_frame, "IP", value]),
  891. ("DE", [evalstack_link]),
  892. ("DE", [ip_link]),
  893. ]
  894. def output_output(self, user_root):
  895. user_frame, = yield [("RD", [user_root, "frame"])]
  896. returnvalue_link, returnvalue, last_output, phase_link, last_output_link, new_last_output, finish = \
  897. yield [("RDE", [user_frame, "returnvalue"]),
  898. ("RD", [user_frame, "returnvalue"]),
  899. ("RD", [user_root, "last_output"]),
  900. ("RDE", [user_frame, "phase"]),
  901. ("RDE", [user_root, "last_output"]),
  902. ("CN", []),
  903. ("CNV", ["finish"]),
  904. ]
  905. _, _, _, _, _, _ = \
  906. yield [("CD", [last_output, "value", returnvalue]),
  907. ("CD", [last_output, "next", new_last_output]),
  908. ("CD", [user_root, "last_output", new_last_output]),
  909. ("CD", [user_frame, "phase", finish]),
  910. ("DE", [last_output_link]),
  911. ("DE", [phase_link]),
  912. ]
  913. def declare_init(self, user_root):
  914. user_frame, = yield [("RD", [user_root, "frame"])]
  915. inst, = yield [("RD", [user_frame, "IP"])]
  916. new_var, symbols, phase_link, empty_node, new_phase = \
  917. yield [("RD", [inst, "var"]),
  918. ("RD", [user_frame, "symbols"]),
  919. ("RDE", [user_frame, "phase"]),
  920. ("CN", []),
  921. ("CNV", ["finish"]),
  922. ]
  923. exists, = yield [("RDN", [symbols, new_var])]
  924. if exists is None:
  925. new_edge, = yield [("CE", [symbols, empty_node])]
  926. _ = yield [("CE", [new_edge, new_var])]
  927. _, _ = yield [("CD", [user_frame, "phase", new_phase]),
  928. ("DE", [phase_link]),
  929. ]
  930. def global_init(self, user_root):
  931. user_frame, = yield [("RD", [user_root, "frame"])]
  932. inst, = yield [("RD", [user_frame, "IP"])]
  933. new_var, global_symbols, phase_link, empty_node, new_phase = \
  934. yield [("RD", [inst, "var"]),
  935. ("RD", [user_root, "globals"]),
  936. ("RDE", [user_frame, "phase"]),
  937. ("CN", []),
  938. ("CNV", ["finish"]),
  939. ]
  940. value, = yield [("RV", [new_var])]
  941. exists, = yield [("RD", [global_symbols, value])]
  942. if exists is None:
  943. yield [("CD", [global_symbols, value, empty_node])]
  944. _, _ = yield [("CD", [user_frame, "phase", new_phase]),
  945. ("DE", [phase_link])
  946. ]