main.py 52 KB

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