vm.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. #include "pocketpy/interpreter/vm.h"
  2. #include "pocketpy/common/memorypool.h"
  3. #include "pocketpy/common/utils.h"
  4. #include "pocketpy/interpreter/generator.h"
  5. #include "pocketpy/interpreter/modules.h"
  6. #include "pocketpy/interpreter/typeinfo.h"
  7. #include "pocketpy/objects/base.h"
  8. #include "pocketpy/interpreter/types.h"
  9. #include "pocketpy/common/_generated.h"
  10. #include "pocketpy/objects/exception.h"
  11. #include "pocketpy/pocketpy.h"
  12. #include <stdbool.h>
  13. #include <assert.h>
  14. static char* pk_default_importfile(const char* path, int* data_size) {
  15. #if PK_ENABLE_OS
  16. FILE* f = fopen(path, "rb");
  17. if(f == NULL) return NULL;
  18. fseek(f, 0, SEEK_END);
  19. long size = ftell(f);
  20. fseek(f, 0, SEEK_SET);
  21. char* buffer = PK_MALLOC(size + 1);
  22. size = fread(buffer, 1, size, f);
  23. buffer[size] = 0;
  24. fclose(f);
  25. if(data_size) *data_size = (int)size;
  26. return buffer;
  27. #else
  28. return NULL;
  29. #endif
  30. }
  31. static void pk_default_print(const char* data) { printf("%s", data); }
  32. static void pk_default_flush() { fflush(stdout); }
  33. static int pk_default_getchr() { return getchar(); }
  34. void py_profiler_begin() {
  35. LineProfiler* lp = &pk_current_vm->line_profiler;
  36. TraceInfo* trace_info = &pk_current_vm->trace_info;
  37. if(trace_info->func == NULL) py_sys_settrace(LineProfiler_tracefunc, true);
  38. c11__rtassert(trace_info->func == LineProfiler_tracefunc);
  39. LineProfiler__begin(lp);
  40. }
  41. void py_profiler_end() {
  42. LineProfiler* lp = &pk_current_vm->line_profiler;
  43. LineProfiler__end(lp);
  44. }
  45. void py_profiler_reset() {
  46. LineProfiler* lp = &pk_current_vm->line_profiler;
  47. LineProfiler__reset(lp);
  48. }
  49. char* py_profiler_report() {
  50. LineProfiler* lp = &pk_current_vm->line_profiler;
  51. if(lp->enabled) LineProfiler__end(lp);
  52. c11_string* s = LineProfiler__get_report(lp);
  53. char* s_dup = c11_strdup(s->data);
  54. c11_string__delete(s);
  55. return s_dup;
  56. }
  57. void LineProfiler_tracefunc(py_Frame* frame, enum py_TraceEvent event) {
  58. LineProfiler* lp = &pk_current_vm->line_profiler;
  59. if(lp->enabled) LineProfiler__tracefunc_internal(lp, frame, event);
  60. }
  61. static int BinTree__cmp_cstr(void* lhs, void* rhs) {
  62. const char* l = (const char*)lhs;
  63. const char* r = (const char*)rhs;
  64. return strcmp(l, r);
  65. }
  66. void VM__ctor(VM* self) {
  67. self->top_frame = NULL;
  68. const static BinTreeConfig modules_config = {
  69. .f_cmp = BinTree__cmp_cstr,
  70. .need_free_key = false,
  71. };
  72. BinTree__ctor(&self->modules, "", py_NIL(), &modules_config);
  73. c11_vector__ctor(&self->types, sizeof(TypePointer));
  74. self->builtins = NULL;
  75. self->main = NULL;
  76. self->callbacks.importfile = pk_default_importfile;
  77. self->callbacks.lazyimport = NULL;
  78. self->callbacks.print = pk_default_print;
  79. self->callbacks.flush = pk_default_flush;
  80. self->callbacks.getchr = pk_default_getchr;
  81. self->last_retval = *py_NIL();
  82. self->unhandled_exc = *py_NIL();
  83. self->type_version = 1; // 0 means "never resolved" in py_TypeInfo
  84. self->recursion_depth = 0;
  85. self->max_recursion_depth = 1000;
  86. memset(self->reg, 0, sizeof(self->reg));
  87. self->ctx = NULL;
  88. self->curr_class = NULL;
  89. self->curr_function = NULL;
  90. memset(&self->trace_info, 0, sizeof(TraceInfo));
  91. memset(&self->watchdog_info, 0, sizeof(WatchdogInfo));
  92. LineProfiler__ctor(&self->line_profiler);
  93. FixedMemoryPool__ctor(&self->pool_frame, sizeof(py_Frame), 32);
  94. ManagedHeap__ctor(&self->heap);
  95. self->stack.sp = self->stack.begin;
  96. self->stack.end = self->stack.begin + PK_VM_STACK_SIZE;
  97. CachedNames__ctor(&self->cached_names);
  98. /* Init Builtin Types */
  99. // 0: unused
  100. TypePointer* placeholder = c11_vector__emplace(&self->types);
  101. placeholder->ti = NULL;
  102. placeholder->dtor = NULL;
  103. #define validate(t, expr) \
  104. if(t != (expr)) abort()
  105. validate(tp_object, pk_newtype("object", tp_nil, NULL, NULL, true, false));
  106. validate(tp_type, pk_newtype("type", tp_object, NULL, NULL, false, true));
  107. pk_object__register();
  108. validate(tp_int, pk_newtype("int", tp_object, NULL, NULL, false, true));
  109. validate(tp_float, pk_newtype("float", tp_object, NULL, NULL, false, true));
  110. validate(tp_bool, pk_newtype("bool", tp_object, NULL, NULL, false, true));
  111. pk_number__register();
  112. validate(tp_str, pk_str__register());
  113. validate(tp_str_iterator, pk_str_iterator__register());
  114. validate(tp_list, pk_list__register());
  115. validate(tp_tuple, pk_tuple__register());
  116. validate(tp_list_iterator, pk_list_iterator__register());
  117. validate(tp_tuple_iterator, pk_tuple_iterator__register());
  118. validate(tp_slice, pk_slice__register());
  119. validate(tp_range, pk_range__register());
  120. validate(tp_range_iterator, pk_range_iterator__register());
  121. validate(tp_module, pk_module__register());
  122. validate(tp_function, pk_function__register());
  123. validate(tp_nativefunc, pk_nativefunc__register());
  124. validate(tp_boundmethod, pk_boundmethod__register());
  125. validate(tp_super, pk_super__register());
  126. validate(tp_BaseException, pk_BaseException__register());
  127. validate(tp_Exception, pk_Exception__register());
  128. validate(tp_bytes, pk_bytes__register());
  129. validate(tp_bytes_iterator, pk_bytes_iterator__register());
  130. validate(tp_namedict, pk_namedict__register());
  131. validate(tp_locals, pk_newtype("locals", tp_object, NULL, NULL, false, true));
  132. validate(tp_code, pk_code__register());
  133. validate(tp_dict, pk_dict__register());
  134. validate(tp_dict_iterator, pk_dict_items__register());
  135. validate(tp_property, pk_property__register());
  136. validate(tp_star_wrapper, pk_newtype("star_wrapper", tp_object, NULL, NULL, false, true));
  137. validate(tp_staticmethod, pk_staticmethod__register());
  138. validate(tp_classmethod, pk_classmethod__register());
  139. validate(tp_NoneType, pk_newtype("NoneType", tp_object, NULL, NULL, false, true));
  140. validate(tp_NotImplementedType,
  141. pk_newtype("NotImplementedType", tp_object, NULL, NULL, false, true));
  142. validate(tp_ellipsis, pk_newtype("ellipsis", tp_object, NULL, NULL, false, true));
  143. validate(tp_generator, pk_generator__register());
  144. self->builtins = pk_builtins__register();
  145. // inject some builtin exceptions
  146. #define INJECT_BUILTIN_EXC(name, TBase) \
  147. do { \
  148. py_Type type = pk_newtype(#name, TBase, self->builtins, NULL, false, true); \
  149. py_setdict(self->builtins, py_name(#name), py_tpobject(type)); \
  150. validate(tp_##name, type); \
  151. } while(0)
  152. INJECT_BUILTIN_EXC(SystemExit, tp_BaseException);
  153. INJECT_BUILTIN_EXC(KeyboardInterrupt, tp_BaseException);
  154. validate(tp_StopIteration, pk_StopIteration__register());
  155. py_setdict(self->builtins, py_name("StopIteration"), py_tpobject(tp_StopIteration));
  156. INJECT_BUILTIN_EXC(SyntaxError, tp_Exception);
  157. INJECT_BUILTIN_EXC(RecursionError, tp_Exception);
  158. INJECT_BUILTIN_EXC(OSError, tp_Exception);
  159. INJECT_BUILTIN_EXC(PermissionError, tp_Exception);
  160. INJECT_BUILTIN_EXC(NotImplementedError, tp_Exception);
  161. INJECT_BUILTIN_EXC(TypeError, tp_Exception);
  162. INJECT_BUILTIN_EXC(IndexError, tp_Exception);
  163. INJECT_BUILTIN_EXC(ValueError, tp_Exception);
  164. INJECT_BUILTIN_EXC(RuntimeError, tp_Exception);
  165. INJECT_BUILTIN_EXC(TimeoutError, tp_Exception);
  166. INJECT_BUILTIN_EXC(ZeroDivisionError, tp_Exception);
  167. INJECT_BUILTIN_EXC(NameError, tp_Exception);
  168. INJECT_BUILTIN_EXC(UnboundLocalError, tp_Exception);
  169. INJECT_BUILTIN_EXC(AttributeError, tp_Exception);
  170. INJECT_BUILTIN_EXC(ImportError, tp_Exception);
  171. INJECT_BUILTIN_EXC(AssertionError, tp_Exception);
  172. INJECT_BUILTIN_EXC(KeyError, tp_Exception);
  173. #undef INJECT_BUILTIN_EXC
  174. #undef validate
  175. /* Setup Public Builtin Types */
  176. py_Type public_types[] = {
  177. tp_object,
  178. tp_type,
  179. tp_int,
  180. tp_float,
  181. tp_bool,
  182. tp_str,
  183. tp_list,
  184. tp_tuple,
  185. tp_slice,
  186. tp_range,
  187. tp_bytes,
  188. tp_dict,
  189. tp_property,
  190. tp_staticmethod,
  191. tp_classmethod,
  192. tp_super,
  193. tp_BaseException,
  194. tp_Exception,
  195. };
  196. for(int i = 0; i < c11__count_array(public_types); i++) {
  197. py_TypeInfo* ti = pk_typeinfo(public_types[i]);
  198. py_setdict(self->builtins, ti->name, &ti->self);
  199. }
  200. py_newnotimplemented(py_emplacedict(self->builtins, py_name("NotImplemented")));
  201. pk__add_module_stdc();
  202. pk__add_module_vmath();
  203. pk__add_module_array2d();
  204. // pk__add_module_colorcvt();
  205. // add modules
  206. pk__add_module_os();
  207. pk__add_module_sys();
  208. pk__add_module_io();
  209. pk__add_module_math();
  210. pk__add_module_dis();
  211. pk__add_module_random();
  212. pk__add_module_json();
  213. pk__add_module_gc();
  214. pk__add_module_time();
  215. pk__add_module_easing();
  216. pk__add_module_traceback();
  217. pk__add_module_enum();
  218. pk__add_module_inspect();
  219. pk__add_module_pickle();
  220. pk__add_module_base64();
  221. pk__add_module_importlib();
  222. pk__add_module_unicodedata();
  223. pk__add_module_conio();
  224. pk__add_module_lz4(); // optional
  225. pk__add_module_cute_png(); // optional
  226. pk__add_module_msgpack(); // optional
  227. py__add_module_periphery(); // optional
  228. pk__add_module_pkpy();
  229. pk__add_module_picoterm();
  230. // add python builtins
  231. do {
  232. bool ok;
  233. ok = py_exec(kPythonLibs_builtins, "<builtins>", EXEC_MODE, self->builtins);
  234. if(!ok) goto __ABORT;
  235. break;
  236. __ABORT:
  237. py_printexc();
  238. c11__abort("failed to load python builtins!");
  239. } while(0);
  240. self->main = py_newmodule("__main__");
  241. if(py_appcallbacks()->on_vm_ctor) {
  242. int index = VM__index(self);
  243. py_appcallbacks()->on_vm_ctor(index);
  244. }
  245. }
  246. void VM__dtor(VM* self) {
  247. if(py_appcallbacks()->on_vm_dtor) {
  248. int index = VM__index(self);
  249. py_appcallbacks()->on_vm_dtor(index);
  250. }
  251. // reset traceinfo
  252. py_sys_settrace(NULL, true);
  253. LineProfiler__dtor(&self->line_profiler);
  254. // destroy all objects
  255. ManagedHeap__dtor(&self->heap);
  256. // clear frames
  257. while(self->top_frame) {
  258. VM__pop_frame(self);
  259. }
  260. BinTree__dtor(&self->modules);
  261. FixedMemoryPool__dtor(&self->pool_frame);
  262. CachedNames__dtor(&self->cached_names);
  263. c11_vector__dtor(&self->types);
  264. }
  265. void VM__push_frame(VM* self, py_Frame* frame) {
  266. frame->f_back = self->top_frame;
  267. self->top_frame = frame;
  268. self->recursion_depth++;
  269. if(self->trace_info.func) self->trace_info.func(frame, TRACE_EVENT_PUSH);
  270. }
  271. void VM__pop_frame(VM* self) {
  272. assert(self->top_frame);
  273. py_Frame* frame = self->top_frame;
  274. if(self->trace_info.func) self->trace_info.func(frame, TRACE_EVENT_POP);
  275. // reset stack pointer
  276. self->stack.sp = frame->p0;
  277. // pop frame and delete
  278. self->top_frame = frame->f_back;
  279. Frame__delete(frame);
  280. self->recursion_depth--;
  281. }
  282. static void _clip_int(int* value, int min, int max) {
  283. if(*value < min) *value = min;
  284. if(*value > max) *value = max;
  285. }
  286. bool pk__parse_int_slice(py_Ref slice,
  287. int length,
  288. int* restrict start,
  289. int* restrict stop,
  290. int* restrict step) {
  291. if(py_isint(slice)) {
  292. int index = py_toint(slice);
  293. bool ok = pk__normalize_index(&index, length);
  294. if(!ok) return false;
  295. *start = index;
  296. *stop = index + 1;
  297. *step = 1;
  298. return true;
  299. }
  300. if(!py_istype(slice, tp_slice)) c11__abort("pk__parse_int_slice(): not a slice object");
  301. py_Ref s_start = py_getslot(slice, 0);
  302. py_Ref s_stop = py_getslot(slice, 1);
  303. py_Ref s_step = py_getslot(slice, 2);
  304. if(py_isnone(s_step))
  305. *step = 1;
  306. else {
  307. if(!py_checkint(s_step)) return false;
  308. *step = py_toint(s_step);
  309. }
  310. if(*step == 0) return ValueError("slice step cannot be zero");
  311. if(*step > 0) {
  312. if(py_isnone(s_start))
  313. *start = 0;
  314. else {
  315. if(!py_checkint(s_start)) return false;
  316. *start = py_toint(s_start);
  317. if(*start < 0) *start += length;
  318. _clip_int(start, 0, length);
  319. }
  320. if(py_isnone(s_stop))
  321. *stop = length;
  322. else {
  323. if(!py_checkint(s_stop)) return false;
  324. *stop = py_toint(s_stop);
  325. if(*stop < 0) *stop += length;
  326. _clip_int(stop, 0, length);
  327. }
  328. } else {
  329. if(py_isnone(s_start))
  330. *start = length - 1;
  331. else {
  332. if(!py_checkint(s_start)) return false;
  333. *start = py_toint(s_start);
  334. if(*start < 0) *start += length;
  335. _clip_int(start, -1, length - 1);
  336. }
  337. if(py_isnone(s_stop))
  338. *stop = -1;
  339. else {
  340. if(!py_checkint(s_stop)) return false;
  341. *stop = py_toint(s_stop);
  342. if(*stop < 0) *stop += length;
  343. _clip_int(stop, -1, length - 1);
  344. }
  345. }
  346. return true;
  347. }
  348. bool pk__normalize_index(int* index, int length) {
  349. if(*index < 0) *index += length;
  350. if(*index < 0 || *index >= length) return IndexError("%d not in [0, %d)", *index, length);
  351. return true;
  352. }
  353. static bool
  354. prepare_py_call(py_TValue* buffer, py_Ref argv, py_Ref p1, int kwargc, const FuncDecl* decl) {
  355. const CodeObject* co = &decl->code;
  356. int decl_argc = decl->args.length;
  357. if(p1 - argv < decl_argc) {
  358. return TypeError("%s() takes %d positional arguments but %d were given",
  359. co->name->data,
  360. decl_argc,
  361. (int)(p1 - argv));
  362. }
  363. py_TValue* t = argv;
  364. // prepare args
  365. memset(buffer, 0, co->nlocals * sizeof(py_TValue));
  366. c11__foreach(int, &decl->args, index) buffer[*index] = *t++;
  367. // prepare kwdefaults
  368. c11__foreach(FuncDeclKwArg, &decl->kwargs, kv) buffer[kv->index] = kv->value;
  369. // handle *args
  370. if(decl->starred_arg != -1) {
  371. int exceed_argc = p1 - t;
  372. py_Ref vargs = &buffer[decl->starred_arg];
  373. py_Ref data = py_newtuple(vargs, exceed_argc);
  374. for(int j = 0; j < exceed_argc; j++) {
  375. data[j] = *t++;
  376. }
  377. } else {
  378. // kwdefaults override
  379. // def f(a, b, c=None)
  380. // f(1, 2, 3) -> c=3
  381. c11__foreach(FuncDeclKwArg, &decl->kwargs, kv) {
  382. if(t >= p1) break;
  383. buffer[kv->index] = *t++;
  384. }
  385. // not able to consume all args
  386. if(t < p1) return TypeError("too many arguments (%s)", co->name->data);
  387. }
  388. if(decl->starred_kwarg != -1) py_newdict(&buffer[decl->starred_kwarg]);
  389. for(int j = 0; j < kwargc; j++) {
  390. py_Name key = (py_Name)py_toint(&p1[2 * j]);
  391. int index = c11_smallmap_n2d__get(&decl->kw_to_index, key, -1);
  392. // if key is an explicit key, set as local variable
  393. if(index >= 0) {
  394. buffer[index] = p1[2 * j + 1];
  395. } else {
  396. // otherwise, set as **kwargs if possible
  397. if(decl->starred_kwarg == -1) {
  398. return TypeError("'%n' is an invalid keyword argument for %s()",
  399. key,
  400. co->name->data);
  401. } else {
  402. // add to **kwargs
  403. bool ok =
  404. py_dict_setitem(&buffer[decl->starred_kwarg], py_name2ref(key), &p1[2 * j + 1]);
  405. if(!ok) return false;
  406. }
  407. }
  408. }
  409. return true;
  410. }
  411. FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall) {
  412. #ifndef NDEBUG
  413. pk_print_stack(self, self->top_frame, (Bytecode){0});
  414. if(py_checkexc()) {
  415. const char* name = py_tpname(self->unhandled_exc.type);
  416. c11__abort("unhandled exception `%s` was set!", name);
  417. }
  418. #endif
  419. py_StackRef p1 = self->stack.sp - kwargc * 2;
  420. py_StackRef p0 = p1 - argc - 2;
  421. // [callable, <self>, args..., kwargs...]
  422. // ^p0 ^p1 ^_sp
  423. // handle boundmethod, do a patch
  424. if(p0->type == tp_boundmethod) {
  425. assert(py_isnil(p0 + 1)); // self must be NULL
  426. py_TValue* slots = PyObject__slots(p0->_obj);
  427. p0[0] = slots[1]; // callable
  428. p0[1] = slots[0]; // self
  429. // [unbound, self, args..., kwargs...]
  430. }
  431. py_StackRef argv = p0 + 1 + (int)py_isnil(p0 + 1);
  432. self->curr_function = p0; // set current function for inspection
  433. if(p0->type == tp_function) {
  434. Function* fn = py_touserdata(p0);
  435. const CodeObject* co = &fn->decl->code;
  436. // the callee's locals live on the value stack; make room before any of
  437. // the paths below writes there
  438. if(argv + co->nlocals > self->stack.end) {
  439. py_exception(tp_RecursionError, "value stack overflow");
  440. return RES_ERROR;
  441. }
  442. switch(fn->decl->type) {
  443. case FuncType_NORMAL: {
  444. bool ok = prepare_py_call(self->vectorcall_buffer, argv, p1, kwargc, fn->decl);
  445. if(!ok) return RES_ERROR;
  446. // copy buffer back to stack
  447. self->stack.sp = argv + co->nlocals;
  448. memcpy(argv, self->vectorcall_buffer, co->nlocals * sizeof(py_TValue));
  449. // submit the call
  450. if(!fn->cfunc) {
  451. // python function
  452. VM__push_frame(self, Frame__new(co, p0, fn->module, &fn->globals, argv, false));
  453. return opcall ? RES_CALL : VM__run_top_frame(self);
  454. } else {
  455. // decl-based binding
  456. bool ok = py_callcfunc(fn->cfunc, co->nlocals, argv);
  457. self->stack.sp = p0;
  458. return ok ? RES_RETURN : RES_ERROR;
  459. }
  460. }
  461. case FuncType_SIMPLE:
  462. if(p1 - argv != fn->decl->args.length) {
  463. const char* fmt = "%s() takes %d positional arguments but %d were given";
  464. TypeError(fmt, co->name->data, fn->decl->args.length, (int)(p1 - argv));
  465. return RES_ERROR;
  466. }
  467. if(kwargc) {
  468. TypeError("%s() takes no keyword arguments", co->name->data);
  469. return RES_ERROR;
  470. }
  471. // [callable, <self>, args..., local_vars...]
  472. // ^p0 ^p1 ^_sp
  473. self->stack.sp = argv + co->nlocals;
  474. // initialize local variables to py_NIL
  475. memset(p1, 0, (char*)self->stack.sp - (char*)p1);
  476. // submit the call
  477. if(!fn->cfunc) {
  478. // python function
  479. VM__push_frame(self, Frame__new(co, p0, fn->module, &fn->globals, argv, false));
  480. return opcall ? RES_CALL : VM__run_top_frame(self);
  481. } else {
  482. // decl-based binding
  483. bool ok = py_callcfunc(fn->cfunc, co->nlocals, argv);
  484. self->stack.sp = p0;
  485. return ok ? RES_RETURN : RES_ERROR;
  486. }
  487. case FuncType_GENERATOR: {
  488. bool ok = prepare_py_call(self->vectorcall_buffer, argv, p1, kwargc, fn->decl);
  489. if(!ok) return RES_ERROR;
  490. // copy buffer back to stack
  491. self->stack.sp = argv + co->nlocals;
  492. memcpy(argv, self->vectorcall_buffer, co->nlocals * sizeof(py_TValue));
  493. py_Frame* frame = Frame__new(co, p0, fn->module, &fn->globals, argv, false);
  494. pk_newgenerator(py_retval(), frame, p0, self->stack.sp);
  495. self->stack.sp = p0; // reset the stack
  496. return RES_RETURN;
  497. }
  498. default: c11__unreachable();
  499. };
  500. c11__unreachable();
  501. /*****************_py_call*****************/
  502. }
  503. if(p0->type == tp_nativefunc) {
  504. if(kwargc && p0->_cfunc != pk__object_new) {
  505. TypeError("nativefunc does not accept keyword arguments");
  506. return RES_ERROR;
  507. }
  508. bool ok = py_callcfunc(p0->_cfunc, p1 - argv, argv);
  509. self->stack.sp = p0;
  510. return ok ? RES_RETURN : RES_ERROR;
  511. }
  512. if(p0->type == tp_type) {
  513. py_Type p0_type = py_totype(p0);
  514. py_TypeInfo* p0_ti = pk_typeinfo(p0_type);
  515. if(p0_ti->magics_version != self->type_version) pk_tpresolvemagics(p0_ti);
  516. // [cls, NULL, args..., kwargs...]
  517. py_Ref new_f = &p0_ti->cached_new;
  518. assert(py_isnil(p0 + 1));
  519. bool is_default_new = new_f->type == tp_nativefunc && new_f->_cfunc == pk__object_new;
  520. // prepare a copy of args and kwargs
  521. int span = self->stack.sp - argv;
  522. *self->stack.sp++ = *new_f; // push __new__
  523. *self->stack.sp++ = *p0; // push cls
  524. memcpy(self->stack.sp, argv, span * sizeof(py_TValue));
  525. self->stack.sp += span;
  526. // [new_f, cls, args..., kwargs...]
  527. if(VM__vectorcall(self, argc, kwargc, false) == RES_ERROR) return RES_ERROR;
  528. // by recursively using vectorcall, args and kwargs are consumed
  529. // try __init__
  530. // NOTE: previously we use `get_unbound_method` but here we just use `tpfindmagic`
  531. // >> [cls, NULL, args..., kwargs...]
  532. // >> py_retval() is the new instance
  533. py_Ref init_f = py_isnil(&p0_ti->cached_init) ? NULL : &p0_ti->cached_init;
  534. if(init_f) {
  535. if(py_isinstance(py_retval(), p0_type)) {
  536. // do an inplace patch
  537. *p0 = *init_f; // __init__
  538. p0[1] = self->last_retval; // self
  539. // [__init__, self, args..., kwargs...]
  540. if(VM__vectorcall(self, argc, kwargc, false) == RES_ERROR) return RES_ERROR;
  541. *py_retval() = p0[1]; // restore the new instance
  542. }
  543. } else {
  544. if(is_default_new) {
  545. if(argc != 0 || kwargc != 0) {
  546. TypeError("%t() takes no arguments", py_totype(p0));
  547. return RES_ERROR;
  548. }
  549. }
  550. }
  551. // reset the stack
  552. self->stack.sp = p0;
  553. return RES_RETURN;
  554. }
  555. // handle `__call__` overload
  556. if(pk_loadmethod(p0, __call__)) {
  557. // [__call__, self, args..., kwargs...]
  558. return VM__vectorcall(self, argc, kwargc, opcall);
  559. }
  560. TypeError("'%t' object is not callable", p0->type);
  561. return RES_ERROR;
  562. }
  563. /****************************************/
  564. void FuncDecl__gc_mark(const FuncDecl* self, c11_vector* p_stack) {
  565. CodeObject__gc_mark(&self->code, p_stack);
  566. for(int j = 0; j < self->kwargs.length; j++) {
  567. FuncDeclKwArg* kw = c11__at(FuncDeclKwArg, &self->kwargs, j);
  568. pk__mark_value(&kw->value);
  569. }
  570. }
  571. void CodeObject__gc_mark(const CodeObject* self, c11_vector* p_stack) {
  572. for(int i = 0; i < self->consts.length; i++) {
  573. py_TValue* p = c11__at(py_TValue, &self->consts, i);
  574. pk__mark_value(p);
  575. }
  576. for(int i = 0; i < self->func_decls.length; i++) {
  577. FuncDecl_ decl = c11__getitem(FuncDecl_, &self->func_decls, i);
  578. FuncDecl__gc_mark(decl, p_stack);
  579. }
  580. }
  581. static void pk__mark_value_func(py_Ref val, void* ctx) {
  582. c11_vector* p_stack = ctx;
  583. pk__mark_value(val);
  584. }
  585. void ManagedHeap__mark(ManagedHeap* self) {
  586. VM* vm = pk_current_vm;
  587. c11_vector* p_stack = &self->gc_roots;
  588. assert(p_stack->length == 0);
  589. // mark value stack
  590. for(py_TValue* p = vm->stack.begin; p < vm->stack.sp; p++) {
  591. // assert(p->type != tp_nil);
  592. pk__mark_value(p);
  593. }
  594. // mark modules
  595. BinTree__apply_mark(&vm->modules, p_stack);
  596. // mark cached names
  597. for(int i = 0; i < vm->cached_names.entries.length; i++) {
  598. CachedNames_KV* kv = c11_chunkedvector__at(&vm->cached_names.entries, i);
  599. pk__mark_value(&kv->val);
  600. }
  601. // mark types
  602. int types_length = vm->types.length;
  603. // 0-th type is placeholder
  604. for(py_Type i = 1; i < types_length; i++) {
  605. py_TypeInfo* ti = c11__getitem(TypePointer, &vm->types, i).ti;
  606. pk__mark_value(&ti->self);
  607. pk__mark_value(&ti->cached_new);
  608. pk__mark_value(&ti->cached_init);
  609. pk__mark_value(&ti->annotations);
  610. }
  611. // mark frame
  612. for(py_Frame* frame = vm->top_frame; frame; frame = frame->f_back) {
  613. Frame__gc_mark(frame, p_stack);
  614. }
  615. // mark vm's registers
  616. pk__mark_value(&vm->last_retval);
  617. pk__mark_value(&vm->unhandled_exc);
  618. for(int i = 0; i < c11__count_array(vm->reg); i++) {
  619. pk__mark_value(&vm->reg[i]);
  620. }
  621. // mark gc debug callback
  622. pk__mark_value(&vm->heap.debug_callback);
  623. // mark user func
  624. if(vm->callbacks.gc_mark) vm->callbacks.gc_mark(pk__mark_value_func, p_stack);
  625. /*****************************/
  626. while(p_stack->length > 0) {
  627. PyObject* obj = c11_vector__back(PyObject*, p_stack);
  628. c11_vector__pop(p_stack);
  629. assert(obj->gc_marked & 0b01);
  630. if(obj->slots > 0) {
  631. py_TValue* p = PyObject__slots(obj);
  632. for(int i = 0; i < obj->slots; i++)
  633. pk__mark_value(p + i);
  634. } else if(obj->slots == -1) {
  635. NameDict* dict = PyObject__dict(obj);
  636. for(int i = 0; i < dict->capacity; i++) {
  637. NameDict_KV* kv = &dict->items[i];
  638. if(kv->key == NULL) continue;
  639. pk__mark_value(&kv->value);
  640. }
  641. }
  642. if(obj->type > tp_object) {
  643. // NOTE: `defaultdict` -> `dict` -> `object`
  644. // NOTE: native types must extend from `object`.
  645. py_TypeInfo* ti = pk_typeinfo(obj->type);
  646. while(ti->base != tp_object) {
  647. ti = ti->base_ti;
  648. }
  649. void* ud = PyObject__userdata(obj);
  650. switch(ti->index) {
  651. case tp_list: {
  652. List* self = ud;
  653. for(int i = 0; i < self->length; i++) {
  654. py_TValue* val = c11__at(py_TValue, self, i);
  655. pk__mark_value(val);
  656. }
  657. break;
  658. }
  659. case tp_dict: {
  660. Dict* self = ud;
  661. for(int i = 0; i < self->entries.length; i++) {
  662. DictEntry* entry = c11__at(DictEntry, &self->entries, i);
  663. if(py_isnil(&entry->key)) continue;
  664. pk__mark_value(&entry->key);
  665. pk__mark_value(&entry->val);
  666. }
  667. break;
  668. }
  669. case tp_generator: {
  670. Generator* self = ud;
  671. if(self->frame) Frame__gc_mark(self->frame, p_stack);
  672. break;
  673. }
  674. case tp_function: {
  675. function__gc_mark(ud, p_stack);
  676. break;
  677. }
  678. case tp_BaseException: {
  679. BaseException* self = ud;
  680. pk__mark_value(&self->args);
  681. pk__mark_value(&self->inner_exc);
  682. c11__foreach(BaseExceptionFrame, &self->stacktrace, frame) {
  683. pk__mark_value(&frame->locals);
  684. pk__mark_value(&frame->globals);
  685. }
  686. break;
  687. }
  688. case tp_code: {
  689. CodeObject* self = ud;
  690. CodeObject__gc_mark(self, p_stack);
  691. break;
  692. }
  693. case tp_chunked_array2d: {
  694. c11_chunked_array2d__mark(ud, p_stack);
  695. break;
  696. }
  697. }
  698. }
  699. }
  700. }