runtime.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import modelverse_kernel.primitives as primitive_functions
  2. def interpret_function(function_id, named_arguments, **kwargs):
  3. """Makes the interpreter run the function with the given id with the specified
  4. argument dictionary."""
  5. user_root = kwargs['user_root']
  6. user_frame, = yield [("RD", [user_root, "frame"])]
  7. inst, = yield [("RD", [user_frame, "IP"])]
  8. body_id, = yield [("RD", [function_id, "body"])]
  9. # Create a new stack frame.
  10. frame_link, new_phase, new_frame, new_evalstack, new_symbols, \
  11. new_returnvalue, intrinsic_return = \
  12. yield [("RDE", [user_root, "frame"]),
  13. ("CNV", ["init"]),
  14. ("CN", []),
  15. ("CN", []),
  16. ("CN", []),
  17. ("CN", []),
  18. ("CN", [])
  19. ]
  20. _, _, _, _, _, _, _, _, _, _ = \
  21. yield [("CD", [user_root, "frame", new_frame]),
  22. ("CD", [new_frame, "evalstack", new_evalstack]),
  23. ("CD", [new_frame, "symbols", new_symbols]),
  24. ("CD", [new_frame, "returnvalue", new_returnvalue]),
  25. ("CD", [new_frame, "caller", inst]),
  26. ("CD", [new_frame, "phase", new_phase]),
  27. ("CD", [new_frame, "IP", body_id]),
  28. ("CD", [new_frame, "prev", user_frame]),
  29. ("CD", [
  30. new_frame,
  31. primitive_functions.PRIMITIVE_RETURN_KEY,
  32. intrinsic_return]),
  33. ("DE", [frame_link])
  34. ]
  35. # Put the parameters in the new stack frame's symbol table.
  36. kernel = kwargs['mvk']
  37. try:
  38. gen = kernel.jit.jit_parameters(body_id)
  39. inp = None
  40. while 1:
  41. inp = yield gen.send(inp)
  42. except primitive_functions.PrimitiveFinished as ex:
  43. parameter_vars, parameter_names = ex.result
  44. parameter_dict = dict(zip(parameter_names, parameter_vars))
  45. for (key, value) in named_arguments.items():
  46. param_var = parameter_dict[key]
  47. variable, = yield [("CN", [])]
  48. yield [("CD", [variable, "value", value])]
  49. symbol_edge, = yield [("CE", [new_symbols, variable])]
  50. yield [("CE", [symbol_edge, param_var])]
  51. username = kwargs['username']
  52. while 1:
  53. try:
  54. gen = kernel.execute_rule(username)
  55. inp = None
  56. while 1:
  57. inp = yield gen.send(inp)
  58. except StopIteration:
  59. # An instruction has been completed. Forward it.
  60. yield None
  61. # Let primitive_functions.PrimitiveFinished bubble up.