vm.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "pocketpy/objects/sourcedata.h"
  2. #include "pocketpy/pocketpy.h"
  3. #include "pocketpy/common/utils.h"
  4. #include "pocketpy/objects/object.h"
  5. #include "pocketpy/interpreter/vm.h"
  6. #include "pocketpy/compiler/compiler.h"
  7. pk_VM* pk_current_vm;
  8. static pk_VM pk_default_vm;
  9. void py_initialize() {
  10. pk_MemoryPools__initialize();
  11. pk_StrName__initialize();
  12. pk_current_vm = &pk_default_vm;
  13. pk_VM__ctor(&pk_default_vm);
  14. }
  15. void py_finalize() {
  16. pk_VM__dtor(&pk_default_vm);
  17. pk_current_vm = NULL;
  18. pk_StrName__finalize();
  19. pk_MemoryPools__finalize();
  20. }
  21. int py_exec(const char* source) { PK_UNREACHABLE(); }
  22. int py_eval(const char* source) {
  23. CodeObject co;
  24. pk_SourceData_ src = pk_SourceData__rcnew(source, "main.py", EVAL_MODE, false);
  25. Error* err = pk_compile(src, &co);
  26. if(err) {
  27. PK_DECREF(src);
  28. return -1;
  29. }
  30. pk_VM* vm = pk_current_vm;
  31. Frame* frame = Frame__new(&co, &vm->main, NULL, vm->stack.sp, vm->stack.sp, &co);
  32. pk_VM__push_frame(vm, frame);
  33. pk_FrameResult res = pk_VM__run_top_frame(vm);
  34. CodeObject__dtor(&co);
  35. PK_DECREF(src);
  36. if(res == RES_ERROR) return vm->last_error->type;
  37. if(res == RES_RETURN) return 0;
  38. PK_UNREACHABLE();
  39. }
  40. bool py_call(py_Ref f, int argc, py_Ref argv) { return -1; }
  41. bool py_callmethod(py_Ref self, py_Name name, int argc, py_Ref argv) { return -1; }
  42. bool pk_vectorcall(int argc, int kwargc, bool op_call) { return -1; }
  43. py_Ref py_lastretval() { return &pk_current_vm->last_retval; }
  44. bool py_getunboundmethod(const py_Ref self,
  45. py_Name name,
  46. bool fallback,
  47. py_Ref out,
  48. py_Ref out_self) {
  49. return -1;
  50. }
  51. pk_TypeInfo* pk_tpinfo(const py_Ref self) {
  52. pk_VM* vm = pk_current_vm;
  53. return c11__at(pk_TypeInfo, &vm->types, self->type);
  54. }
  55. py_Ref py_tpfindmagic(py_Type t, py_Name name) {
  56. assert(name < 64);
  57. pk_TypeInfo* types = (pk_TypeInfo*)pk_current_vm->types.data;
  58. do {
  59. py_Ref f = &types[t].magic[name];
  60. if(!py_isnull(f)) return f;
  61. t = types[t].base;
  62. } while(t);
  63. return NULL;
  64. }
  65. py_Ref py_tpmagic(py_Type type, py_Name name) {
  66. assert(name < 64);
  67. pk_VM* vm = pk_current_vm;
  68. return &c11__at(pk_TypeInfo, &vm->types, type)->magic[name];
  69. }
  70. py_Ref py_tpobject(py_Type type) {
  71. pk_VM* vm = pk_current_vm;
  72. return &c11__at(pk_TypeInfo, &vm->types, type)->self;
  73. }
  74. bool py_callmagic(py_Name name, int argc, py_Ref argv) {
  75. assert(argc >= 1);
  76. py_Ref tmp = py_tpfindmagic(argv->type, name);
  77. if(!tmp) return TypeError(name);
  78. if(tmp->type == tp_nativefunc) { return tmp->_cfunc(argc, argv, &pk_current_vm->last_retval); }
  79. return py_call(tmp, argc, argv);
  80. }