runtime.py 2.8 KB

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