ceval.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. #pragma once
  2. #include "common.h"
  3. #include "vm.h"
  4. namespace pkpy{
  5. #define DISPATCH() goto __NEXT_STEP
  6. inline PyObject* VM::run_frame(Frame* frame){
  7. __NEXT_STEP:;
  8. /* NOTE:
  9. * Be aware of accidental gc!
  10. * DO NOT leave any strong reference of PyObject* in the C stack
  11. * For example, frame->popx() returns a strong reference which may be dangerous
  12. * `Args` containing strong references is safe if it is passed to `call` or `fast_call`
  13. */
  14. #if !DEBUG_NO_AUTO_GC
  15. heap._auto_collect();
  16. #endif
  17. const Bytecode& byte = frame->next_bytecode();
  18. #if DEBUG_CEVAL_STEP
  19. std::cout << frame->stack_info() << " " << OP_NAMES[byte.op] << std::endl;
  20. #endif
  21. switch (byte.op)
  22. {
  23. case OP_NO_OP: DISPATCH();
  24. /*****************************************/
  25. case OP_POP_TOP: frame->pop(); DISPATCH();
  26. case OP_DUP_TOP: frame->push(frame->top()); DISPATCH();
  27. case OP_ROT_TWO: std::swap(frame->top(), frame->top_1()); DISPATCH();
  28. case OP_PRINT_EXPR: {
  29. PyObject* obj = frame->top(); // use top() to avoid accidental gc
  30. if(obj != None) *_stdout << CAST(Str&, asRepr(obj)) << '\n';
  31. frame->pop();
  32. } DISPATCH();
  33. /*****************************************/
  34. case OP_LOAD_CONST: frame->push(frame->co->consts[byte.arg]); DISPATCH();
  35. case OP_LOAD_NONE: frame->push(None); DISPATCH();
  36. case OP_LOAD_TRUE: frame->push(True); DISPATCH();
  37. case OP_LOAD_FALSE: frame->push(False); DISPATCH();
  38. case OP_LOAD_ELLIPSIS: frame->push(Ellipsis); DISPATCH();
  39. case OP_LOAD_BUILTIN_EVAL: frame->push(builtins->attr(m_eval)); DISPATCH();
  40. case OP_LOAD_FUNCTION: {
  41. FuncDecl_ decl = frame->co->func_decls[byte.arg];
  42. PyObject* obj = VAR(Function({decl, frame->_module, frame->_locals}));
  43. frame->push(obj);
  44. } DISPATCH();
  45. case OP_LOAD_NULL: frame->push(_py_null); DISPATCH();
  46. /*****************************************/
  47. case OP_LOAD_NAME: {
  48. StrName name = frame->co->names[byte.arg];
  49. PyObject* val;
  50. val = frame->f_locals().try_get(name);
  51. if(val != nullptr) { frame->push(val); DISPATCH(); }
  52. val = frame->f_closure_try_get(name);
  53. if(val != nullptr) { frame->push(val); DISPATCH(); }
  54. val = frame->f_globals().try_get(name);
  55. if(val != nullptr) { frame->push(val); DISPATCH(); }
  56. val = vm->builtins->attr().try_get(name);
  57. if(val != nullptr) { frame->push(val); DISPATCH(); }
  58. vm->NameError(name);
  59. } DISPATCH();
  60. case OP_LOAD_GLOBAL: {
  61. StrName name = frame->co->names[byte.arg];
  62. PyObject* val = frame->f_globals().try_get(name);
  63. if(val != nullptr) { frame->push(val); DISPATCH(); }
  64. val = vm->builtins->attr().try_get(name);
  65. if(val != nullptr) { frame->push(val); DISPATCH(); }
  66. vm->NameError(name);
  67. } DISPATCH();
  68. case OP_LOAD_ATTR: {
  69. PyObject* a = frame->top();
  70. StrName name = frame->co->names[byte.arg];
  71. frame->top() = getattr(a, name);
  72. } DISPATCH();
  73. case OP_LOAD_METHOD: {
  74. PyObject* a = frame->top();
  75. StrName name = frame->co->names[byte.arg];
  76. PyObject* self;
  77. frame->top() = get_unbound_method(a, name, &self, true, true);
  78. frame->push(self);
  79. } DISPATCH();
  80. case OP_LOAD_SUBSCR: {
  81. Args args(2);
  82. args[1] = frame->popx(); // b
  83. args[0] = frame->top(); // a
  84. frame->top() = fast_call(__getitem__, std::move(args));
  85. } DISPATCH();
  86. case OP_STORE_LOCAL: {
  87. StrName name = frame->co->names[byte.arg];
  88. frame->f_locals().set(name, frame->popx());
  89. } DISPATCH();
  90. case OP_STORE_GLOBAL: {
  91. StrName name = frame->co->names[byte.arg];
  92. frame->f_globals().set(name, frame->popx());
  93. } DISPATCH();
  94. case OP_STORE_ATTR: {
  95. StrName name = frame->co->names[byte.arg];
  96. PyObject* a = frame->top();
  97. PyObject* val = frame->top_1();
  98. setattr(a, name, val);
  99. frame->pop_n(2);
  100. } DISPATCH();
  101. case OP_STORE_SUBSCR: {
  102. Args args(3);
  103. args[1] = frame->popx(); // b
  104. args[0] = frame->popx(); // a
  105. args[2] = frame->popx(); // val
  106. fast_call(__setitem__, std::move(args));
  107. } DISPATCH();
  108. case OP_DELETE_LOCAL: {
  109. StrName name = frame->co->names[byte.arg];
  110. if(frame->f_locals().contains(name)){
  111. frame->f_locals().erase(name);
  112. }else{
  113. NameError(name);
  114. }
  115. } DISPATCH();
  116. case OP_DELETE_GLOBAL: {
  117. StrName name = frame->co->names[byte.arg];
  118. if(frame->f_globals().contains(name)){
  119. frame->f_globals().erase(name);
  120. }else{
  121. NameError(name);
  122. }
  123. } DISPATCH();
  124. case OP_DELETE_ATTR: {
  125. PyObject* a = frame->popx();
  126. StrName name = frame->co->names[byte.arg];
  127. if(!a->is_attr_valid()) TypeError("cannot delete attribute");
  128. if(!a->attr().contains(name)) AttributeError(a, name);
  129. a->attr().erase(name);
  130. } DISPATCH();
  131. case OP_DELETE_SUBSCR: {
  132. PyObject* b = frame->popx();
  133. PyObject* a = frame->popx();
  134. fast_call(__delitem__, Args{a, b});
  135. } DISPATCH();
  136. /*****************************************/
  137. case OP_BUILD_LIST:
  138. frame->push(VAR(frame->popx_n_reversed(byte.arg).to_list()));
  139. DISPATCH();
  140. case OP_BUILD_DICT: {
  141. PyObject* t = VAR(frame->popx_n_reversed(byte.arg));
  142. PyObject* obj = call(builtins->attr(m_dict), Args{t});
  143. frame->push(obj);
  144. } DISPATCH();
  145. case OP_BUILD_SET: {
  146. PyObject* t = VAR(frame->popx_n_reversed(byte.arg));
  147. PyObject* obj = call(builtins->attr(m_set), Args{t});
  148. frame->push(obj);
  149. } DISPATCH();
  150. case OP_BUILD_SLICE: {
  151. PyObject* step = frame->popx();
  152. PyObject* stop = frame->popx();
  153. PyObject* start = frame->popx();
  154. Slice s;
  155. if(start != None) s.start = CAST(int, start);
  156. if(stop != None) s.stop = CAST(int, stop);
  157. if(step != None) s.step = CAST(int, step);
  158. frame->push(VAR(s));
  159. } DISPATCH();
  160. case OP_BUILD_TUPLE: {
  161. Tuple items = frame->popx_n_reversed(byte.arg);
  162. frame->push(VAR(std::move(items)));
  163. } DISPATCH();
  164. case OP_BUILD_STRING: {
  165. std::stringstream ss; // asStr() may run extra bytecode
  166. for(int i=byte.arg-1; i>=0; i--) ss << CAST(Str&, asStr(frame->top_n(i)));
  167. frame->pop_n(byte.arg);
  168. frame->push(VAR(ss.str()));
  169. } DISPATCH();
  170. /*****************************************/
  171. case OP_BINARY_OP: {
  172. Args args(2);
  173. args[1] = frame->popx(); // lhs
  174. args[0] = frame->top(); // rhs
  175. frame->top() = fast_call(BINARY_SPECIAL_METHODS[byte.arg], std::move(args));
  176. } DISPATCH();
  177. #define INT_BINARY_OP(op, func) \
  178. if(is_both_int(frame->top(), frame->top_1())){ \
  179. i64 b = _CAST(i64, frame->top()); \
  180. i64 a = _CAST(i64, frame->top_1()); \
  181. frame->pop(); \
  182. frame->top() = VAR(a op b); \
  183. }else{ \
  184. Args args(2); \
  185. args[1] = frame->popx(); \
  186. args[0] = frame->top(); \
  187. frame->top() = fast_call(func, std::move(args));\
  188. } \
  189. DISPATCH();
  190. case OP_BINARY_ADD:
  191. INT_BINARY_OP(+, __add__)
  192. case OP_BINARY_SUB:
  193. INT_BINARY_OP(-, __sub__)
  194. case OP_BINARY_MUL:
  195. INT_BINARY_OP(*, __mul__)
  196. case OP_BINARY_FLOORDIV:
  197. INT_BINARY_OP(/, __floordiv__)
  198. case OP_BINARY_MOD:
  199. INT_BINARY_OP(%, __mod__)
  200. case OP_COMPARE_LT:
  201. INT_BINARY_OP(<, __lt__)
  202. case OP_COMPARE_LE:
  203. INT_BINARY_OP(<=, __le__)
  204. case OP_COMPARE_EQ:
  205. INT_BINARY_OP(==, __eq__)
  206. case OP_COMPARE_NE:
  207. INT_BINARY_OP(!=, __ne__)
  208. case OP_COMPARE_GT:
  209. INT_BINARY_OP(>, __gt__)
  210. case OP_COMPARE_GE:
  211. INT_BINARY_OP(>=, __ge__)
  212. case OP_BITWISE_LSHIFT:
  213. INT_BINARY_OP(<<, __lshift__)
  214. case OP_BITWISE_RSHIFT:
  215. INT_BINARY_OP(>>, __rshift__)
  216. case OP_BITWISE_AND:
  217. INT_BINARY_OP(&, __and__)
  218. case OP_BITWISE_OR:
  219. INT_BINARY_OP(|, __or__)
  220. case OP_BITWISE_XOR:
  221. INT_BINARY_OP(^, __xor__)
  222. #undef INT_BINARY_OP
  223. case OP_IS_OP: {
  224. PyObject* rhs = frame->popx();
  225. PyObject* lhs = frame->top();
  226. bool ret_c = lhs == rhs;
  227. if(byte.arg == 1) ret_c = !ret_c;
  228. frame->top() = VAR(ret_c);
  229. } DISPATCH();
  230. case OP_CONTAINS_OP: {
  231. Args args(2);
  232. args[0] = frame->popx();
  233. args[1] = frame->top();
  234. PyObject* ret = fast_call(__contains__, std::move(args));
  235. bool ret_c = CAST(bool, ret);
  236. if(byte.arg == 1) ret_c = !ret_c;
  237. frame->top() = VAR(ret_c);
  238. } DISPATCH();
  239. /*****************************************/
  240. case OP_JUMP_ABSOLUTE: frame->jump_abs(byte.arg); DISPATCH();
  241. case OP_POP_JUMP_IF_FALSE:
  242. if(!asBool(frame->popx())) frame->jump_abs(byte.arg);
  243. DISPATCH();
  244. case OP_JUMP_IF_TRUE_OR_POP:
  245. if(asBool(frame->top()) == true) frame->jump_abs(byte.arg);
  246. else frame->pop();
  247. DISPATCH();
  248. case OP_JUMP_IF_FALSE_OR_POP:
  249. if(asBool(frame->top()) == false) frame->jump_abs(byte.arg);
  250. else frame->pop();
  251. DISPATCH();
  252. case OP_LOOP_CONTINUE: {
  253. int target = frame->co->blocks[byte.block].start;
  254. frame->jump_abs(target);
  255. } DISPATCH();
  256. case OP_LOOP_BREAK: {
  257. int target = frame->co->blocks[byte.block].end;
  258. frame->jump_abs_break(target);
  259. } DISPATCH();
  260. case OP_GOTO: {
  261. StrName label = frame->co->names[byte.arg];
  262. auto it = frame->co->labels.find(label);
  263. if(it == frame->co->labels.end()) _error("KeyError", fmt("label ", label.escape(), " not found"));
  264. frame->jump_abs_break(it->second);
  265. } DISPATCH();
  266. /*****************************************/
  267. // TODO: examine this later
  268. case OP_CALL: case OP_CALL_UNPACK: {
  269. int ARGC = byte.arg;
  270. bool method_call = frame->top_n(ARGC) != _py_null;
  271. if(method_call) ARGC++; // add self into args
  272. Args args = frame->popx_n_reversed(ARGC);
  273. if(!method_call) frame->pop();
  274. if(byte.op == OP_CALL_UNPACK) unpack_args(args);
  275. PyObject* callable = frame->popx();
  276. PyObject* ret = call(callable, std::move(args), no_arg(), true);
  277. if(ret == _py_op_call) return ret;
  278. frame->push(std::move(ret));
  279. } DISPATCH();
  280. case OP_CALL_KWARGS: case OP_CALL_KWARGS_UNPACK: {
  281. int ARGC = byte.arg & 0xFFFF;
  282. int KWARGC = (byte.arg >> 16) & 0xFFFF;
  283. Args kwargs = frame->popx_n_reversed(KWARGC*2);
  284. bool method_call = frame->top_n(ARGC) != _py_null;
  285. if(method_call) ARGC++; // add self into args
  286. Args args = frame->popx_n_reversed(ARGC);
  287. if(!method_call) frame->pop();
  288. if(byte.op == OP_CALL_KWARGS_UNPACK) unpack_args(args);
  289. PyObject* callable = frame->popx();
  290. PyObject* ret = call(callable, std::move(args), kwargs, true);
  291. if(ret == _py_op_call) return ret;
  292. frame->push(std::move(ret));
  293. } DISPATCH();
  294. case OP_RETURN_VALUE: return frame->popx();
  295. case OP_YIELD_VALUE: return _py_op_yield;
  296. /*****************************************/
  297. case OP_LIST_APPEND: {
  298. PyObject* obj = frame->popx();
  299. List& list = CAST(List&, frame->top_1());
  300. list.push_back(obj);
  301. } DISPATCH();
  302. case OP_DICT_ADD: {
  303. PyObject* kv = frame->popx();
  304. Tuple& t = CAST(Tuple& ,kv);
  305. fast_call(__setitem__, Args{frame->top_1(), t[0], t[1]});
  306. } DISPATCH();
  307. case OP_SET_ADD: {
  308. PyObject* obj = frame->popx();
  309. fast_call(m_add, Args{frame->top_1(), obj});
  310. } DISPATCH();
  311. /*****************************************/
  312. case OP_UNARY_NEGATIVE:
  313. frame->top() = num_negated(frame->top());
  314. DISPATCH();
  315. case OP_UNARY_NOT:
  316. frame->top() = VAR(!asBool(frame->top()));
  317. DISPATCH();
  318. case OP_UNARY_STAR:
  319. frame->top() = VAR(StarWrapper(frame->top()));
  320. DISPATCH();
  321. /*****************************************/
  322. case OP_GET_ITER:
  323. frame->top() = asIter(frame->top());
  324. DISPATCH();
  325. case OP_FOR_ITER: {
  326. BaseIter* it = PyIter_AS_C(frame->top());
  327. PyObject* obj = it->next();
  328. if(obj != nullptr){
  329. frame->push(obj);
  330. }else{
  331. int target = frame->co->blocks[byte.block].end;
  332. frame->jump_abs_break(target);
  333. }
  334. } DISPATCH();
  335. /*****************************************/
  336. case OP_IMPORT_NAME: {
  337. StrName name = frame->co->names[byte.arg];
  338. PyObject* ext_mod = _modules.try_get(name);
  339. if(ext_mod == nullptr){
  340. Str source;
  341. auto it = _lazy_modules.find(name);
  342. if(it == _lazy_modules.end()){
  343. bool ok = false;
  344. source = _read_file_cwd(fmt(name, ".py"), &ok);
  345. if(!ok) _error("ImportError", fmt("module ", name.escape(), " not found"));
  346. }else{
  347. source = it->second;
  348. _lazy_modules.erase(it);
  349. }
  350. CodeObject_ code = compile(source, name.sv(), EXEC_MODE);
  351. PyObject* new_mod = new_module(name);
  352. _exec(code, new_mod);
  353. new_mod->attr()._try_perfect_rehash();
  354. frame->push(new_mod);
  355. }else{
  356. frame->push(ext_mod);
  357. }
  358. } DISPATCH();
  359. case OP_IMPORT_STAR: {
  360. PyObject* obj = frame->popx();
  361. for(auto& [name, value]: obj->attr().items()){
  362. std::string_view s = name.sv();
  363. if(s.empty() || s[0] == '_') continue;
  364. frame->f_globals().set(name, value);
  365. }
  366. }; DISPATCH();
  367. /*****************************************/
  368. case OP_UNPACK_SEQUENCE: case OP_UNPACK_EX: {
  369. // asIter or iter->next may run bytecode, accidential gc may happen
  370. auto _lock = heap.gc_scope_lock(); // lock the gc via RAII!!
  371. PyObject* obj = asIter(frame->popx());
  372. BaseIter* iter = PyIter_AS_C(obj);
  373. for(int i=0; i<byte.arg; i++){
  374. PyObject* item = iter->next();
  375. if(item == nullptr) ValueError("not enough values to unpack");
  376. frame->push(item);
  377. }
  378. // handle extra items
  379. if(byte.op == OP_UNPACK_EX){
  380. List extras;
  381. while(true){
  382. PyObject* item = iter->next();
  383. if(item == nullptr) break;
  384. extras.push_back(item);
  385. }
  386. frame->push(VAR(extras));
  387. }else{
  388. if(iter->next() != nullptr) ValueError("too many values to unpack");
  389. }
  390. }; DISPATCH();
  391. /*****************************************/
  392. case OP_BEGIN_CLASS: {
  393. StrName name = frame->co->names[byte.arg];
  394. PyObject* super_cls = frame->popx();
  395. if(super_cls == None) super_cls = _t(tp_object);
  396. check_type(super_cls, tp_type);
  397. PyObject* cls = new_type_object(frame->_module, name, OBJ_GET(Type, super_cls));
  398. frame->push(cls);
  399. } DISPATCH();
  400. case OP_END_CLASS: {
  401. PyObject* cls = frame->popx();
  402. cls->attr()._try_perfect_rehash();
  403. }; DISPATCH();
  404. case OP_STORE_CLASS_ATTR: {
  405. StrName name = frame->co->names[byte.arg];
  406. PyObject* obj = frame->popx();
  407. PyObject* cls = frame->top();
  408. cls->attr().set(name, obj);
  409. } DISPATCH();
  410. /*****************************************/
  411. // // TODO: using "goto" inside with block may cause __exit__ not called
  412. // case OP_WITH_ENTER: call(frame->pop_value(this), __enter__, no_arg()); DISPATCH();
  413. // case OP_WITH_EXIT: call(frame->pop_value(this), __exit__, no_arg()); DISPATCH();
  414. /*****************************************/
  415. case OP_TRY_BLOCK_ENTER: frame->on_try_block_enter(); DISPATCH();
  416. case OP_TRY_BLOCK_EXIT: frame->on_try_block_exit(); DISPATCH();
  417. /*****************************************/
  418. case OP_ASSERT: {
  419. PyObject* obj = frame->top();
  420. Str msg;
  421. if(is_type(obj, tp_tuple)){
  422. auto& t = CAST(Tuple&, obj);
  423. if(t.size() != 2) ValueError("assert tuple must have 2 elements");
  424. obj = t[0];
  425. msg = CAST(Str&, asStr(t[1]));
  426. }
  427. bool ok = asBool(obj);
  428. frame->pop();
  429. if(!ok) _error("AssertionError", msg);
  430. } DISPATCH();
  431. case OP_EXCEPTION_MATCH: {
  432. const auto& e = CAST(Exception&, frame->top());
  433. StrName name = frame->co->names[byte.arg];
  434. frame->push(VAR(e.match_type(name)));
  435. } DISPATCH();
  436. case OP_RAISE: {
  437. PyObject* obj = frame->popx();
  438. Str msg = obj == None ? "" : CAST(Str, asStr(obj));
  439. StrName type = frame->co->names[byte.arg];
  440. _error(type, msg);
  441. } DISPATCH();
  442. case OP_RE_RAISE: _raise(); DISPATCH();
  443. default: throw std::runtime_error(fmt(OP_NAMES[byte.op], " is not implemented"));
  444. }
  445. UNREACHABLE();
  446. }
  447. #undef DISPATCH
  448. } // namespace pkpy