vm.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include "pocketpy/interpreter/vm.h"
  2. #include "pocketpy/common/memorypool.h"
  3. #include "pocketpy/common/sstream.h"
  4. #include "pocketpy/pocketpy.h"
  5. static unsigned char* pk_default_import_file(const char* path){
  6. return NULL;
  7. }
  8. static void pk_default_stdout(const char* fmt, ...){
  9. va_list args;
  10. va_start(args, fmt);
  11. vfprintf(stdout, fmt, args);
  12. va_end(args);
  13. fflush(stdout);
  14. }
  15. static void pk_default_stderr(const char* fmt, ...){
  16. va_list args;
  17. va_start(args, fmt);
  18. vfprintf(stderr, fmt, args);
  19. va_end(args);
  20. fflush(stderr);
  21. }
  22. void pk_TypeInfo__ctor(pk_TypeInfo *self, py_Name name, py_Type base, PyObject* obj, const py_TValue* module, bool subclass_enabled){
  23. memset(self, 0, sizeof(pk_TypeInfo));
  24. self->name = name;
  25. self->base = base;
  26. self->self = PyVar__fromobj(obj);
  27. self->module = module ? *module : PY_NULL;
  28. self->subclass_enabled = subclass_enabled;
  29. c11_vector__ctor(&self->annotated_fields, sizeof(py_Name));
  30. }
  31. void pk_TypeInfo__dtor(pk_TypeInfo *self){
  32. c11_vector__dtor(&self->annotated_fields);
  33. }
  34. void pk_VM__ctor(pk_VM* self){
  35. self->top_frame = NULL;
  36. pk_NameDict__ctor(&self->modules);
  37. c11_vector__ctor(&self->types, sizeof(pk_TypeInfo));
  38. self->StopIteration = PY_NULL;
  39. self->builtins = PY_NULL;
  40. self->main = PY_NULL;
  41. self->_ceval_on_step = NULL;
  42. self->_import_file = pk_default_import_file;
  43. self->_stdout = pk_default_stdout;
  44. self->_stderr = pk_default_stderr;
  45. self->last_error = NULL;
  46. self->last_retval = PY_NULL;
  47. self->__curr_class = PY_NULL;
  48. self->__cached_object_new = PY_NULL;
  49. self->__dynamic_func_decl = NULL;
  50. pk_ManagedHeap__ctor(&self->heap, self);
  51. ValueStack__ctor(&self->stack);
  52. self->True = (py_TValue){.type=tp_bool, .is_ptr=true, .extra=1,
  53. ._obj=pk_ManagedHeap__gcnew(&self->heap, tp_bool, 0, 0),
  54. };
  55. self->False = (py_TValue){.type=tp_bool, .is_ptr=true, .extra=0,
  56. ._obj=pk_ManagedHeap__gcnew(&self->heap, tp_bool, 0, 0),
  57. };
  58. self->None = (py_TValue){.type=tp_none_type, .is_ptr=true,
  59. ._obj=pk_ManagedHeap__gcnew(&self->heap, tp_none_type, 0, 0),
  60. };
  61. self->NotImplemented = (py_TValue){.type=tp_not_implemented_type, .is_ptr=true,
  62. ._obj=pk_ManagedHeap__gcnew(&self->heap, tp_not_implemented_type, 0, 0),
  63. };
  64. self->Ellipsis = (py_TValue){.type=tp_ellipsis, .is_ptr=true,
  65. ._obj=pk_ManagedHeap__gcnew(&self->heap, tp_ellipsis, 0, 0),
  66. };
  67. /* Init Builtin Types */
  68. // 0: unused
  69. pk_TypeInfo__ctor(c11_vector__emplace(&self->types), 0, 0, NULL, NULL, false);
  70. #define validate(t, expr) if(t != (expr)) abort()
  71. validate(tp_object, pk_VM__new_type(self, "object", 0, NULL, true));
  72. validate(tp_type, pk_VM__new_type(self, "type", 1, NULL, false));
  73. validate(tp_int, pk_VM__new_type(self, "int", tp_object, NULL, false));
  74. validate(tp_float, pk_VM__new_type(self, "float", tp_object, NULL, false));
  75. validate(tp_bool, pk_VM__new_type(self, "bool", tp_object, NULL, false));
  76. validate(tp_str, pk_VM__new_type(self, "str", tp_object, NULL, false));
  77. validate(tp_list, pk_VM__new_type(self, "list", tp_object, NULL, false));
  78. validate(tp_tuple, pk_VM__new_type(self, "tuple", tp_object, NULL, false));
  79. validate(tp_slice, pk_VM__new_type(self, "slice", tp_object, NULL, false));
  80. validate(tp_range, pk_VM__new_type(self, "range", tp_object, NULL, false));
  81. validate(tp_module, pk_VM__new_type(self, "module", tp_object, NULL, false));
  82. validate(tp_function, pk_VM__new_type(self, "function", tp_object, NULL, false));
  83. validate(tp_nativefunc, pk_VM__new_type(self, "nativefunc", tp_object, NULL, false));
  84. validate(tp_bound_method, pk_VM__new_type(self, "bound_method", tp_object, NULL, false));
  85. validate(tp_super, pk_VM__new_type(self, "super", tp_object, NULL, false));
  86. validate(tp_exception, pk_VM__new_type(self, "Exception", tp_object, NULL, true));
  87. validate(tp_bytes, pk_VM__new_type(self, "bytes", tp_object, NULL, false));
  88. validate(tp_mappingproxy, pk_VM__new_type(self, "mappingproxy", tp_object, NULL, false));
  89. validate(tp_dict, pk_VM__new_type(self, "dict", tp_object, NULL, true));
  90. validate(tp_property, pk_VM__new_type(self, "property", tp_object, NULL, false));
  91. validate(tp_star_wrapper, pk_VM__new_type(self, "star_wrapper", tp_object, NULL, false));
  92. validate(tp_staticmethod, pk_VM__new_type(self, "staticmethod", tp_object, NULL, false));
  93. validate(tp_classmethod, pk_VM__new_type(self, "classmethod", tp_object, NULL, false));
  94. validate(tp_none_type, pk_VM__new_type(self, "NoneType", tp_object, NULL, false));
  95. validate(tp_not_implemented_type, pk_VM__new_type(self, "NotImplementedType", tp_object, NULL, false));
  96. validate(tp_ellipsis, pk_VM__new_type(self, "ellipsis", tp_object, NULL, false));
  97. validate(tp_op_call, pk_VM__new_type(self, "__op_call", tp_object, NULL, false));
  98. validate(tp_op_yield, pk_VM__new_type(self, "__op_yield", tp_object, NULL, false));
  99. validate(tp_syntax_error, pk_VM__new_type(self, "SyntaxError", tp_exception, NULL, false));
  100. validate(tp_stop_iteration, pk_VM__new_type(self, "StopIteration", tp_exception, NULL, false));
  101. #undef validate
  102. self->StopIteration = c11__at(pk_TypeInfo, &self->types, tp_stop_iteration)->self;
  103. self->builtins = *py_newmodule("builtins", NULL);
  104. /* Setup Public Builtin Types */
  105. py_Type public_types[] = {
  106. tp_object, tp_type,
  107. tp_int, tp_float, tp_bool, tp_str,
  108. tp_list, tp_tuple,
  109. tp_slice, tp_range,
  110. tp_bytes, tp_dict, tp_property,
  111. tp_exception, tp_stop_iteration, tp_syntax_error
  112. };
  113. for(int i=0; i<PK_ARRAY_COUNT(public_types); i++){
  114. py_Type t = public_types[i];
  115. pk_TypeInfo* ti = c11__at(pk_TypeInfo, &self->types, t);
  116. py_setdict(&self->builtins, ti->name, &ti->self);
  117. }
  118. py_setdict(&self->builtins, py_name("NotImplemented"), &self->NotImplemented);
  119. /* Do Buildin Bindings*/
  120. pk_VM__init_builtins(self);
  121. self->main = *py_newmodule("__main__", NULL);
  122. }
  123. void pk_VM__dtor(pk_VM* self){
  124. if(self->__dynamic_func_decl){
  125. PK_DECREF(self->__dynamic_func_decl);
  126. }
  127. // destroy all objects
  128. pk_ManagedHeap__dtor(&self->heap);
  129. // clear frames
  130. // ...
  131. pk_NameDict__dtor(&self->modules);
  132. c11_vector__dtor(&self->types);
  133. ValueStack__clear(&self->stack);
  134. }
  135. void pk_VM__push_frame(pk_VM* self, Frame* frame){
  136. frame->f_back = self->top_frame;
  137. self->top_frame = frame;
  138. }
  139. void pk_VM__pop_frame(pk_VM* self){
  140. assert(self->top_frame);
  141. Frame* frame = self->top_frame;
  142. // reset stack pointer
  143. self->stack.sp = frame->p0;
  144. // pop frame and delete
  145. self->top_frame = frame->f_back;
  146. Frame__delete(frame);
  147. }
  148. py_Type pk_VM__new_type(pk_VM* self, const char* name, py_Type base, const py_TValue* module, bool subclass_enabled){
  149. py_Type type = self->types.count;
  150. pk_TypeInfo* ti = c11_vector__emplace(&self->types);
  151. PyObject* typeobj = pk_ManagedHeap__gcnew(&self->heap, tp_type, -1, sizeof(py_Type));
  152. py_Type* value = PyObject__value(typeobj);
  153. *value = type;
  154. pk_TypeInfo__ctor(ti, py_name(name), base, typeobj, module, subclass_enabled);
  155. return type;
  156. }
  157. /****************************************/
  158. void PyObject__delete(PyObject *self){
  159. pk_TypeInfo* ti = c11__at(pk_TypeInfo, &pk_current_vm->types, self->type);
  160. if(ti->dtor) ti->dtor(PyObject__value(self));
  161. if(self->slots == -1) pk_NameDict__dtor(PyObject__dict(self));
  162. if(self->gc_is_large){
  163. free(self);
  164. }else{
  165. PoolObject_dealloc(self);
  166. }
  167. }
  168. void pk_ManagedHeap__mark(pk_ManagedHeap* self){
  169. // for(int i=0; i<self->no_gc.count; i++){
  170. // PyObject* obj = c11__getitem(PyObject*, &self->no_gc, i);
  171. // vm->__obj_gc_mark(obj);
  172. // }
  173. // vm->callstack.apply([vm](Frame& frame) {
  174. // frame._gc_mark(vm);
  175. // });
  176. // vm->obj_gc_mark(vm->__last_exception);
  177. // vm->obj_gc_mark(vm->__curr_class);
  178. // vm->obj_gc_mark(vm->__c.error);
  179. // vm->__stack_gc_mark(vm->s_data.begin(), vm->s_data.end());
  180. // if(self->_gc_marker_ex) self->_gc_marker_ex((pkpy_VM*)vm);
  181. }