vm.h 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089
  1. #pragma once
  2. #include "codeobject.h"
  3. #include "iter.h"
  4. #include "error.h"
  5. #define __DEF_PY_AS_C(type, ctype, ptype) \
  6. inline ctype& Py##type##_AS_C(const PyVar& obj) { \
  7. check_type(obj, ptype); \
  8. return OBJ_GET(ctype, obj); \
  9. }
  10. #define __DEF_PY(type, ctype, ptype) \
  11. inline PyVar Py##type(ctype value) { \
  12. return new_object(ptype, value); \
  13. }
  14. #define DEF_NATIVE(type, ctype, ptype) \
  15. __DEF_PY(type, ctype, ptype) \
  16. __DEF_PY_AS_C(type, ctype, ptype)
  17. class VM {
  18. std::vector<PyVar> _small_integers; // [-5, 256]
  19. std::stack< std::unique_ptr<Frame> > callstack;
  20. PyVar __py2py_call_signal;
  21. PyVar run_frame(Frame* frame){
  22. while(frame->has_next_bytecode()){
  23. const Bytecode& byte = frame->next_bytecode();
  24. // if(frame->_module != builtins){
  25. // printf("%d: %s (%d) %s\n", frame->_ip, OP_NAMES[byte.op], byte.arg, frame->stack_info().c_str());
  26. // }
  27. switch (byte.op)
  28. {
  29. case OP_NO_OP: break; // do nothing
  30. case OP_LOAD_CONST: frame->push(frame->co->consts[byte.arg]); break;
  31. case OP_LOAD_LAMBDA: {
  32. PyVar obj = frame->co->consts[byte.arg];
  33. setattr(obj, __module__, frame->_module);
  34. frame->push(obj);
  35. } break;
  36. case OP_LOAD_NAME_REF: {
  37. frame->push(PyRef(NameRef(frame->co->names[byte.arg])));
  38. } break;
  39. case OP_LOAD_NAME: {
  40. frame->push(NameRef(frame->co->names[byte.arg]).get(this, frame));
  41. } break;
  42. case OP_STORE_NAME: {
  43. const auto& p = frame->co->names[byte.arg];
  44. NameRef(p).set(this, frame, frame->pop_value(this));
  45. } break;
  46. case OP_BUILD_ATTR_REF: {
  47. const auto& attr = frame->co->names[byte.arg];
  48. PyVar obj = frame->pop_value(this);
  49. frame->push(PyRef(AttrRef(obj, NameRef(attr))));
  50. } break;
  51. case OP_BUILD_INDEX_REF: {
  52. PyVar index = frame->pop_value(this);
  53. PyVarRef obj = frame->pop_value(this);
  54. frame->push(PyRef(IndexRef(obj, index)));
  55. } break;
  56. case OP_STORE_REF: {
  57. PyVar obj = frame->pop_value(this);
  58. PyVarRef r = frame->pop();
  59. PyRef_AS_C(r)->set(this, frame, std::move(obj));
  60. } break;
  61. case OP_DELETE_REF: {
  62. PyVarRef r = frame->pop();
  63. PyRef_AS_C(r)->del(this, frame);
  64. } break;
  65. case OP_BUILD_SMART_TUPLE:
  66. {
  67. pkpy::Args items = frame->pop_n_reversed(byte.arg);
  68. bool done = false;
  69. for(int i=0; i<items.size(); i++){
  70. if(!items[i]->is_type(_tp_ref)) {
  71. done = true;
  72. PyVarList values = items.toList();
  73. for(int j=i; j<values.size(); j++) frame->try_deref(this, values[j]);
  74. frame->push(PyTuple(values));
  75. break;
  76. }
  77. }
  78. if(done) break;
  79. frame->push(PyRef(TupleRef(items.toList())));
  80. } break;
  81. case OP_BUILD_STRING:
  82. {
  83. pkpy::Args items = frame->pop_n_values_reversed(this, byte.arg);
  84. _StrStream ss;
  85. for(int i=0; i<items.size(); i++) ss << PyStr_AS_C(asStr(items[i]));
  86. frame->push(PyStr(ss.str()));
  87. } break;
  88. case OP_LOAD_EVAL_FN: {
  89. frame->push(builtins->attribs[m_eval]);
  90. } break;
  91. case OP_LIST_APPEND: {
  92. pkpy::Args args(2);
  93. args[1] = frame->pop_value(this); // obj
  94. args[0] = frame->top_value_offset(this, -2); // list
  95. fast_call(m_append, std::move(args));
  96. } break;
  97. case OP_STORE_FUNCTION:
  98. {
  99. PyVar obj = frame->pop_value(this);
  100. const _Func& fn = PyFunction_AS_C(obj);
  101. setattr(obj, __module__, frame->_module);
  102. frame->f_globals()[fn->name] = obj;
  103. } break;
  104. case OP_BUILD_CLASS:
  105. {
  106. const _Str& clsName = frame->co->names[byte.arg].first;
  107. PyVar clsBase = frame->pop_value(this);
  108. if(clsBase == None) clsBase = _tp_object;
  109. check_type(clsBase, _tp_type);
  110. PyVar cls = new_user_type_object(frame->_module, clsName, clsBase);
  111. while(true){
  112. PyVar fn = frame->pop_value(this);
  113. if(fn == None) break;
  114. const _Func& f = PyFunction_AS_C(fn);
  115. setattr(fn, __module__, frame->_module);
  116. setattr(cls, f->name, fn);
  117. }
  118. } break;
  119. case OP_RETURN_VALUE: return frame->pop_value(this);
  120. case OP_PRINT_EXPR:
  121. {
  122. const PyVar expr = frame->top_value(this);
  123. if(expr == None) break;
  124. *_stdout << PyStr_AS_C(asRepr(expr)) << '\n';
  125. } break;
  126. case OP_POP_TOP: frame->__pop(); break;
  127. case OP_BINARY_OP:
  128. {
  129. pkpy::Args args(2);
  130. args[1] = frame->pop_value(this);
  131. args[0] = frame->top_value(this);
  132. frame->top() = fast_call(BINARY_SPECIAL_METHODS[byte.arg], std::move(args));
  133. } break;
  134. case OP_BITWISE_OP:
  135. {
  136. frame->push(
  137. fast_call(BITWISE_SPECIAL_METHODS[byte.arg],
  138. frame->pop_n_values_reversed(this, 2))
  139. );
  140. } break;
  141. case OP_COMPARE_OP:
  142. {
  143. pkpy::Args args(2);
  144. args[1] = frame->pop_value(this);
  145. args[0] = frame->top_value(this);
  146. frame->top() = fast_call(CMP_SPECIAL_METHODS[byte.arg], std::move(args));
  147. } break;
  148. case OP_IS_OP:
  149. {
  150. PyVar rhs = frame->pop_value(this);
  151. bool ret_c = rhs == frame->top_value(this);
  152. if(byte.arg == 1) ret_c = !ret_c;
  153. frame->top() = PyBool(ret_c);
  154. } break;
  155. case OP_CONTAINS_OP:
  156. {
  157. PyVar rhs = frame->pop_value(this);
  158. bool ret_c = PyBool_AS_C(call(rhs, __contains__, pkpy::oneArg(frame->pop_value(this))));
  159. if(byte.arg == 1) ret_c = !ret_c;
  160. frame->push(PyBool(ret_c));
  161. } break;
  162. case OP_UNARY_NEGATIVE:
  163. frame->top() = num_negated(frame->top_value(this));
  164. break;
  165. case OP_UNARY_NOT:
  166. {
  167. PyVar obj = frame->pop_value(this);
  168. const PyVar& obj_bool = asBool(obj);
  169. frame->push(PyBool(!PyBool_AS_C(obj_bool)));
  170. } break;
  171. case OP_POP_JUMP_IF_FALSE:
  172. if(!PyBool_AS_C(asBool(frame->pop_value(this)))) frame->jump_abs(byte.arg);
  173. break;
  174. case OP_LOAD_NONE: frame->push(None); break;
  175. case OP_LOAD_TRUE: frame->push(True); break;
  176. case OP_LOAD_FALSE: frame->push(False); break;
  177. case OP_LOAD_ELLIPSIS: frame->push(Ellipsis); break;
  178. case OP_ASSERT:
  179. {
  180. PyVar expr = frame->pop_value(this);
  181. if(asBool(expr) != True) _error("AssertionError", "");
  182. } break;
  183. case OP_EXCEPTION_MATCH:
  184. {
  185. const auto& _e = PyException_AS_C(frame->top());
  186. _Str name = frame->co->names[byte.arg].first;
  187. frame->push(PyBool(_e.match_type(name)));
  188. } break;
  189. case OP_RAISE:
  190. {
  191. PyVar obj = frame->pop_value(this);
  192. _Str msg = obj == None ? "" : PyStr_AS_C(asStr(obj));
  193. _Str type = frame->co->names[byte.arg].first;
  194. _error(type, msg);
  195. } break;
  196. case OP_RE_RAISE: _raise(); break;
  197. case OP_BUILD_LIST:
  198. frame->push(PyList(
  199. frame->pop_n_values_reversed(this, byte.arg).toList()));
  200. break;
  201. case OP_BUILD_MAP:
  202. {
  203. pkpy::Args items = frame->pop_n_values_reversed(this, byte.arg*2);
  204. PyVar obj = call(builtins->attribs["dict"]);
  205. for(int i=0; i<items.size(); i+=2){
  206. call(obj, __setitem__, pkpy::twoArgs(items[i], items[i+1]));
  207. }
  208. frame->push(obj);
  209. } break;
  210. case OP_BUILD_SET:
  211. {
  212. PyVar list = PyList(
  213. frame->pop_n_values_reversed(this, byte.arg).toList()
  214. );
  215. PyVar obj = call(builtins->attribs["set"], pkpy::oneArg(list));
  216. frame->push(obj);
  217. } break;
  218. case OP_DUP_TOP: frame->push(frame->top_value(this)); break;
  219. case OP_CALL:
  220. {
  221. int ARGC = byte.arg & 0xFFFF;
  222. int KWARGC = (byte.arg >> 16) & 0xFFFF;
  223. pkpy::Args kwargs(0);
  224. if(KWARGC > 0) kwargs = frame->pop_n_values_reversed(this, KWARGC*2);
  225. pkpy::Args args = frame->pop_n_values_reversed(this, ARGC);
  226. PyVar callable = frame->pop_value(this);
  227. PyVar ret = call(callable, std::move(args), kwargs, true);
  228. if(ret == __py2py_call_signal) return ret;
  229. frame->push(std::move(ret));
  230. } break;
  231. case OP_JUMP_ABSOLUTE: frame->jump_abs(byte.arg); break;
  232. case OP_SAFE_JUMP_ABSOLUTE: frame->jump_abs_safe(byte.arg); break;
  233. case OP_GOTO: {
  234. const _Str& label = frame->co->names[byte.arg].first;
  235. int* target = frame->co->labels.try_get(label);
  236. if(target == nullptr) _error("KeyError", "label '" + label + "' not found");
  237. frame->jump_abs_safe(*target);
  238. } break;
  239. case OP_GET_ITER:
  240. {
  241. PyVar obj = frame->pop_value(this);
  242. PyVarOrNull iter_fn = getattr(obj, __iter__, false);
  243. if(iter_fn != nullptr){
  244. PyVar tmp = call(iter_fn);
  245. PyVarRef var = frame->pop();
  246. check_type(var, _tp_ref);
  247. PyIter_AS_C(tmp)->var = var;
  248. frame->push(std::move(tmp));
  249. }else{
  250. typeError("'" + OBJ_TP_NAME(obj) + "' object is not iterable");
  251. }
  252. } break;
  253. case OP_FOR_ITER:
  254. {
  255. // top() must be PyIter, so no need to try_deref()
  256. auto& it = PyIter_AS_C(frame->top());
  257. if(it->hasNext()){
  258. PyRef_AS_C(it->var)->set(this, frame, it->next());
  259. }else{
  260. int blockEnd = frame->co->blocks[byte.block].end;
  261. frame->jump_abs_safe(blockEnd);
  262. }
  263. } break;
  264. case OP_LOOP_CONTINUE:
  265. {
  266. int blockStart = frame->co->blocks[byte.block].start;
  267. frame->jump_abs(blockStart);
  268. } break;
  269. case OP_LOOP_BREAK:
  270. {
  271. int blockEnd = frame->co->blocks[byte.block].end;
  272. frame->jump_abs_safe(blockEnd);
  273. } break;
  274. case OP_JUMP_IF_FALSE_OR_POP:
  275. {
  276. const PyVar expr = frame->top_value(this);
  277. if(asBool(expr)==False) frame->jump_abs(byte.arg);
  278. else frame->pop_value(this);
  279. } break;
  280. case OP_JUMP_IF_TRUE_OR_POP:
  281. {
  282. const PyVar expr = frame->top_value(this);
  283. if(asBool(expr)==True) frame->jump_abs(byte.arg);
  284. else frame->pop_value(this);
  285. } break;
  286. case OP_BUILD_SLICE:
  287. {
  288. PyVar stop = frame->pop_value(this);
  289. PyVar start = frame->pop_value(this);
  290. _Slice s;
  291. if(start != None) {check_type(start, _tp_int); s.start = (int)PyInt_AS_C(start);}
  292. if(stop != None) {check_type(stop, _tp_int); s.stop = (int)PyInt_AS_C(stop);}
  293. frame->push(PySlice(s));
  294. } break;
  295. case OP_IMPORT_NAME:
  296. {
  297. const _Str& name = frame->co->names[byte.arg].first;
  298. auto it = _modules.find(name);
  299. if(it == _modules.end()){
  300. auto it2 = _lazy_modules.find(name);
  301. if(it2 == _lazy_modules.end()){
  302. _error("ImportError", "module '" + name + "' not found");
  303. }else{
  304. const _Str& source = it2->second;
  305. _Code code = compile(source, name, EXEC_MODE);
  306. PyVar _m = new_module(name);
  307. _exec(code, _m, pkpy::make_shared<PyVarDict>());
  308. frame->push(_m);
  309. _lazy_modules.erase(it2);
  310. }
  311. }else{
  312. frame->push(it->second);
  313. }
  314. } break;
  315. // TODO: using "goto" inside with block may cause __exit__ not called
  316. case OP_WITH_ENTER: call(frame->pop_value(this), __enter__); break;
  317. case OP_WITH_EXIT: call(frame->pop_value(this), __exit__); break;
  318. case OP_TRY_BLOCK_ENTER: frame->on_try_block_enter(); break;
  319. case OP_TRY_BLOCK_EXIT: frame->on_try_block_exit(); break;
  320. default:
  321. throw std::runtime_error(_Str("opcode ") + OP_NAMES[byte.op] + " is not implemented");
  322. break;
  323. }
  324. }
  325. if(frame->co->src->mode == EVAL_MODE || frame->co->src->mode == JSON_MODE){
  326. if(frame->_data.size() != 1) throw std::runtime_error("_data.size() != 1 in EVAL/JSON_MODE");
  327. return frame->pop_value(this);
  328. }
  329. if(!frame->_data.empty()) throw std::runtime_error("_data.size() != 0 in EXEC_MODE");
  330. return None;
  331. }
  332. public:
  333. PyVarDict _types;
  334. PyVarDict _modules; // loaded modules
  335. emhash8::HashMap<_Str, _Str> _lazy_modules; // lazy loaded modules
  336. PyVar None, True, False, Ellipsis;
  337. bool use_stdio;
  338. std::ostream* _stdout;
  339. std::ostream* _stderr;
  340. PyVar builtins; // builtins module
  341. PyVar _main; // __main__ module
  342. int maxRecursionDepth = 1000;
  343. VM(bool use_stdio){
  344. this->use_stdio = use_stdio;
  345. if(use_stdio){
  346. std::cout.setf(std::ios::unitbuf);
  347. std::cerr.setf(std::ios::unitbuf);
  348. this->_stdout = &std::cout;
  349. this->_stderr = &std::cerr;
  350. }else{
  351. this->_stdout = new _StrStream();
  352. this->_stderr = new _StrStream();
  353. }
  354. initializeBuiltinClasses();
  355. _small_integers.reserve(270);
  356. for(i64 i=-5; i<=256; i++) _small_integers.push_back(new_object(_tp_int, i));
  357. }
  358. PyVar asStr(const PyVar& obj){
  359. PyVarOrNull f = getattr(obj, __str__, false);
  360. if(f != nullptr) return call(f);
  361. return asRepr(obj);
  362. }
  363. inline Frame* top_frame() const {
  364. if(callstack.empty()) UNREACHABLE();
  365. return callstack.top().get();
  366. }
  367. PyVar asRepr(const PyVar& obj){
  368. if(obj->is_type(_tp_type)) return PyStr("<class '" + OBJ_GET(_Str, obj->attribs[__name__]) + "'>");
  369. return call(obj, __repr__);
  370. }
  371. const PyVar& asBool(const PyVar& obj){
  372. if(obj->is_type(_tp_bool)) return obj;
  373. if(obj == None) return False;
  374. if(obj->is_type(_tp_int)) return PyBool(PyInt_AS_C(obj) != 0);
  375. if(obj->is_type(_tp_float)) return PyBool(PyFloat_AS_C(obj) != 0.0);
  376. PyVarOrNull len_fn = getattr(obj, __len__, false);
  377. if(len_fn != nullptr){
  378. PyVar ret = call(len_fn);
  379. return PyBool(PyInt_AS_C(ret) > 0);
  380. }
  381. return True;
  382. }
  383. PyVar fast_call(const _Str& name, pkpy::Args&& args){
  384. PyObject* cls = args[0]->type.get();
  385. while(cls != None.get()) {
  386. PyVar* val = cls->attribs.try_get(name);
  387. if(val != nullptr) return call(*val, std::move(args));
  388. cls = cls->attribs[__base__].get();
  389. }
  390. attributeError(args[0], name);
  391. return nullptr;
  392. }
  393. inline PyVar call(const PyVar& _callable){
  394. return call(_callable, pkpy::noArg(), pkpy::noArg(), false);
  395. }
  396. template<typename ArgT>
  397. inline std::enable_if_t<std::is_same_v<std::remove_const_t<std::remove_reference_t<ArgT>>, pkpy::Args>, PyVar>
  398. call(const PyVar& _callable, ArgT&& args){
  399. return call(_callable, std::forward<ArgT>(args), pkpy::noArg(), false);
  400. }
  401. template<typename ArgT>
  402. inline std::enable_if_t<std::is_same_v<std::remove_const_t<std::remove_reference_t<ArgT>>, pkpy::Args>, PyVar>
  403. call(const PyVar& obj, const _Str& func, ArgT&& args){
  404. return call(getattr(obj, func), std::forward<ArgT>(args), pkpy::noArg(), false);
  405. }
  406. inline PyVar call(const PyVar& obj, const _Str& func){
  407. return call(getattr(obj, func), pkpy::noArg(), pkpy::noArg(), false);
  408. }
  409. PyVar call(const PyVar& _callable, pkpy::Args args, const pkpy::Args& kwargs, bool opCall){
  410. if(_callable->is_type(_tp_type)){
  411. auto it = _callable->attribs.find(__new__);
  412. PyVar obj;
  413. if(it != _callable->attribs.end()){
  414. obj = call(it->second, args, kwargs, false);
  415. }else{
  416. obj = new_object(_callable, DUMMY_VAL);
  417. PyVarOrNull init_fn = getattr(obj, __init__, false);
  418. if (init_fn != nullptr) call(init_fn, args, kwargs, false);
  419. }
  420. return obj;
  421. }
  422. const PyVar* callable = &_callable;
  423. if((*callable)->is_type(_tp_bound_method)){
  424. auto& bm = PyBoundMethod_AS_C((*callable));
  425. callable = &bm.method; // get unbound method
  426. args.extend_self(bm.obj);
  427. }
  428. if((*callable)->is_type(_tp_native_function)){
  429. const auto& f = OBJ_GET(_CppFunc, *callable);
  430. if(kwargs.size() != 0) typeError("_native_function does not accept keyword arguments");
  431. return f(this, args);
  432. } else if((*callable)->is_type(_tp_function)){
  433. const _Func& fn = PyFunction_AS_C((*callable));
  434. pkpy::shared_ptr<PyVarDict> _locals = pkpy::make_shared<PyVarDict>();
  435. PyVarDict& locals = *_locals;
  436. int i = 0;
  437. for(const auto& name : fn->args){
  438. if(i < args.size()){
  439. locals.emplace(name, args[i++]);
  440. continue;
  441. }
  442. typeError("missing positional argument '" + name + "'");
  443. }
  444. locals.insert(fn->kwArgs.begin(), fn->kwArgs.end());
  445. std::vector<_Str> positional_overrided_keys;
  446. if(!fn->starredArg.empty()){
  447. // handle *args
  448. PyVarList vargs;
  449. while(i < args.size()) vargs.push_back(args[i++]);
  450. locals.emplace(fn->starredArg, PyTuple(std::move(vargs)));
  451. }else{
  452. for(const auto& key : fn->kwArgsOrder){
  453. if(i < args.size()){
  454. locals[key] = args[i++];
  455. positional_overrided_keys.push_back(key);
  456. }else{
  457. break;
  458. }
  459. }
  460. if(i < args.size()) typeError("too many arguments");
  461. }
  462. for(int i=0; i<kwargs.size(); i+=2){
  463. const _Str& key = PyStr_AS_C(kwargs[i]);
  464. if(!fn->kwArgs.contains(key)){
  465. typeError(key.escape(true) + " is an invalid keyword argument for " + fn->name + "()");
  466. }
  467. const PyVar& val = kwargs[i+1];
  468. if(!positional_overrided_keys.empty()){
  469. auto it = std::find(positional_overrided_keys.begin(), positional_overrided_keys.end(), key);
  470. if(it != positional_overrided_keys.end()){
  471. typeError("multiple values for argument '" + key + "'");
  472. }
  473. }
  474. locals[key] = val;
  475. }
  476. PyVar* it_m = (*callable)->attribs.try_get(__module__);
  477. PyVar _module = it_m != nullptr ? *it_m : top_frame()->_module;
  478. if(opCall){
  479. __new_frame(fn->code, _module, _locals);
  480. return __py2py_call_signal;
  481. }
  482. return _exec(fn->code, _module, _locals);
  483. }
  484. typeError("'" + OBJ_TP_NAME(*callable) + "' object is not callable");
  485. return None;
  486. }
  487. // repl mode is only for setting `frame->id` to 0
  488. PyVarOrNull exec(_Str source, _Str filename, CompileMode mode, PyVar _module=nullptr){
  489. if(_module == nullptr) _module = _main;
  490. try {
  491. _Code code = compile(source, filename, mode);
  492. return _exec(code, _module, pkpy::make_shared<PyVarDict>());
  493. }catch (const _Exception& e){
  494. *_stderr << e.summary() << '\n';
  495. }
  496. catch (const std::exception& e) {
  497. *_stderr << "A std::exception occurred! It may be a bug, please report it!!\n";
  498. *_stderr << e.what() << '\n';
  499. }
  500. callstack = {};
  501. return nullptr;
  502. }
  503. template<typename ...Args>
  504. Frame* __new_frame(Args&&... args){
  505. if(callstack.size() > maxRecursionDepth){
  506. _error("RecursionError", "maximum recursion depth exceeded");
  507. }
  508. callstack.emplace(std::make_unique<Frame>(std::forward<Args>(args)...));
  509. return callstack.top().get();
  510. }
  511. template<typename ...Args>
  512. PyVar _exec(Args&&... args){
  513. Frame* frame = __new_frame(std::forward<Args>(args)...);
  514. i64 base_id = frame->id;
  515. PyVar ret = nullptr;
  516. bool need_raise = false;
  517. while(true){
  518. if(frame->id < base_id) UNREACHABLE();
  519. try{
  520. if(need_raise){ need_raise = false; _raise(); }
  521. ret = run_frame(frame);
  522. if(ret != __py2py_call_signal){
  523. if(frame->id == base_id){ // [ frameBase<- ]
  524. callstack.pop();
  525. return ret;
  526. }else{
  527. callstack.pop();
  528. frame = callstack.top().get();
  529. frame->push(ret);
  530. }
  531. }else{
  532. frame = callstack.top().get(); // [ frameBase, newFrame<- ]
  533. }
  534. }catch(HandledException& e){
  535. continue;
  536. }catch(UnhandledException& e){
  537. PyVar obj = frame->pop();
  538. _Exception& _e = PyException_AS_C(obj);
  539. _e.st_push(frame->snapshot());
  540. callstack.pop();
  541. if(callstack.empty()) throw _e;
  542. frame = callstack.top().get();
  543. frame->push(obj);
  544. if(frame->id < base_id) throw ToBeRaisedException();
  545. need_raise = true;
  546. }catch(ToBeRaisedException& e){
  547. need_raise = true;
  548. }
  549. }
  550. }
  551. PyVar new_user_type_object(PyVar mod, _Str name, PyVar base){
  552. if(!base->is_type(_tp_type)) UNREACHABLE();
  553. PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>(_tp_type, DUMMY_VAL);
  554. setattr(obj, __base__, base);
  555. _Str fullName = name;
  556. if(mod != builtins) fullName = OBJ_NAME(mod) + "." + name;
  557. setattr(obj, __name__, PyStr(fullName));
  558. setattr(mod, name, obj);
  559. return obj;
  560. }
  561. PyVar new_type_object(_Str name, PyVar base=nullptr) {
  562. if(base == nullptr) base = _tp_object;
  563. PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>(_tp_type, DUMMY_VAL);
  564. setattr(obj, __base__, base);
  565. _types[name] = obj;
  566. return obj;
  567. }
  568. template<typename T>
  569. inline PyVar new_object(PyVar type, T _value) {
  570. if(!type->is_type(_tp_type)) UNREACHABLE();
  571. return pkpy::make_shared<PyObject, Py_<T>>(type, _value);
  572. }
  573. template<typename T, typename... Args>
  574. inline PyVar new_object(Args&&... args) {
  575. return new_object(T::_type(this), T(std::forward<Args>(args)...));
  576. }
  577. PyVar new_module(const _Str& name) {
  578. PyVar obj = new_object(_tp_module, DUMMY_VAL);
  579. setattr(obj, __name__, PyStr(name));
  580. _modules[name] = obj;
  581. return obj;
  582. }
  583. PyVarOrNull getattr(const PyVar& obj, const _Str& name, bool throw_err=true) {
  584. PyVarDict::iterator it;
  585. PyObject* cls;
  586. if(obj->is_type(_tp_super)){
  587. const PyVar* root = &obj;
  588. int depth = 1;
  589. while(true){
  590. root = &OBJ_GET(PyVar, *root);
  591. if(!(*root)->is_type(_tp_super)) break;
  592. depth++;
  593. }
  594. cls = (*root)->type.get();
  595. for(int i=0; i<depth; i++) cls = cls->attribs[__base__].get();
  596. it = (*root)->attribs.find(name);
  597. if(it != (*root)->attribs.end()) return it->second;
  598. }else{
  599. it = obj->attribs.find(name);
  600. if(it != obj->attribs.end()) return it->second;
  601. cls = obj->type.get();
  602. }
  603. while(cls != None.get()) {
  604. it = cls->attribs.find(name);
  605. if(it != cls->attribs.end()){
  606. PyVar valueFromCls = it->second;
  607. if(valueFromCls->is_type(_tp_function) || valueFromCls->is_type(_tp_native_function)){
  608. return PyBoundMethod({obj, std::move(valueFromCls)});
  609. }else{
  610. return valueFromCls;
  611. }
  612. }
  613. cls = cls->attribs[__base__].get();
  614. }
  615. if(throw_err) attributeError(obj, name);
  616. return nullptr;
  617. }
  618. template<typename T>
  619. inline void setattr(PyVar& obj, const _Str& name, T&& value) {
  620. PyObject* p = obj.get();
  621. while(p->is_type(_tp_super)) p = static_cast<PyVar*>(p->value())->get();
  622. p->attribs[name] = std::forward<T>(value);
  623. }
  624. template<int ARGC>
  625. void bind_method(PyVar obj, _Str funcName, _CppFuncRaw fn) {
  626. check_type(obj, _tp_type);
  627. setattr(obj, funcName, PyNativeFunction(_CppFunc(fn, ARGC, true)));
  628. }
  629. template<int ARGC>
  630. void bind_func(PyVar obj, _Str funcName, _CppFuncRaw fn) {
  631. setattr(obj, funcName, PyNativeFunction(_CppFunc(fn, ARGC, false)));
  632. }
  633. template<int ARGC>
  634. void bind_method(_Str typeName, _Str funcName, _CppFuncRaw fn) {
  635. bind_method<ARGC>(_types[typeName], funcName, fn);
  636. }
  637. template<int ARGC>
  638. void bind_static_method(_Str typeName, _Str funcName, _CppFuncRaw fn) {
  639. bind_func<ARGC>(_types[typeName], funcName, fn);
  640. }
  641. template<int ARGC>
  642. void _bind_methods(std::vector<_Str> typeNames, _Str funcName, _CppFuncRaw fn) {
  643. for(auto& typeName : typeNames) bind_method<ARGC>(typeName, funcName, fn);
  644. }
  645. template<int ARGC>
  646. void bind_builtin_func(_Str funcName, _CppFuncRaw fn) {
  647. bind_func<ARGC>(builtins, funcName, fn);
  648. }
  649. inline f64 num_to_float(const PyVar& obj){
  650. if (obj->is_type(_tp_int)){
  651. return (f64)PyInt_AS_C(obj);
  652. }else if(obj->is_type(_tp_float)){
  653. return PyFloat_AS_C(obj);
  654. }
  655. typeError("expected int or float, got " + OBJ_TP_NAME(obj));
  656. return 0;
  657. }
  658. PyVar num_negated(const PyVar& obj){
  659. if (obj->is_type(_tp_int)){
  660. return PyInt(-PyInt_AS_C(obj));
  661. }else if(obj->is_type(_tp_float)){
  662. return PyFloat(-PyFloat_AS_C(obj));
  663. }
  664. typeError("unsupported operand type(s) for -");
  665. return nullptr;
  666. }
  667. int normalized_index(int index, int size){
  668. if(index < 0) index += size;
  669. if(index < 0 || index >= size){
  670. indexError(std::to_string(index) + " not in [0, " + std::to_string(size) + ")");
  671. }
  672. return index;
  673. }
  674. _Str disassemble(_Code code){
  675. std::vector<int> jumpTargets;
  676. for(auto byte : code->co_code){
  677. if(byte.op == OP_JUMP_ABSOLUTE || byte.op == OP_SAFE_JUMP_ABSOLUTE || byte.op == OP_POP_JUMP_IF_FALSE){
  678. jumpTargets.push_back(byte.arg);
  679. }
  680. }
  681. _StrStream ss;
  682. ss << std::string(54, '-') << '\n';
  683. ss << code->name << ":\n";
  684. int prev_line = -1;
  685. for(int i=0; i<code->co_code.size(); i++){
  686. const Bytecode& byte = code->co_code[i];
  687. _Str line = std::to_string(byte.line);
  688. if(byte.line == prev_line) line = "";
  689. else{
  690. if(prev_line != -1) ss << "\n";
  691. prev_line = byte.line;
  692. }
  693. std::string pointer;
  694. if(std::find(jumpTargets.begin(), jumpTargets.end(), i) != jumpTargets.end()){
  695. pointer = "-> ";
  696. }else{
  697. pointer = " ";
  698. }
  699. ss << pad(line, 8) << pointer << pad(std::to_string(i), 3);
  700. ss << " " << pad(OP_NAMES[byte.op], 20) << " ";
  701. // ss << pad(byte.arg == -1 ? "" : std::to_string(byte.arg), 5);
  702. std::string argStr = byte.arg == -1 ? "" : std::to_string(byte.arg);
  703. if(byte.op == OP_LOAD_CONST){
  704. argStr += " (" + PyStr_AS_C(asRepr(code->consts[byte.arg])) + ")";
  705. }
  706. if(byte.op == OP_LOAD_NAME_REF || byte.op == OP_LOAD_NAME || byte.op == OP_RAISE){
  707. argStr += " (" + code->names[byte.arg].first.escape(true) + ")";
  708. }
  709. ss << pad(argStr, 20); // may overflow
  710. ss << code->blocks[byte.block].to_string();
  711. if(i != code->co_code.size() - 1) ss << '\n';
  712. }
  713. _StrStream consts;
  714. consts << "consts: ";
  715. consts << PyStr_AS_C(asRepr(PyList(code->consts)));
  716. _StrStream names;
  717. names << "names: ";
  718. PyVarList list;
  719. for(int i=0; i<code->names.size(); i++){
  720. list.push_back(PyStr(code->names[i].first));
  721. }
  722. names << PyStr_AS_C(asRepr(PyList(list)));
  723. ss << '\n' << consts.str() << '\n' << names.str() << '\n';
  724. for(int i=0; i<code->consts.size(); i++){
  725. PyVar obj = code->consts[i];
  726. if(obj->is_type(_tp_function)){
  727. const auto& f = PyFunction_AS_C(obj);
  728. ss << disassemble(f->code);
  729. }
  730. }
  731. return _Str(ss.str());
  732. }
  733. // for quick access
  734. PyVar _tp_object, _tp_type, _tp_int, _tp_float, _tp_bool, _tp_str;
  735. PyVar _tp_list, _tp_tuple;
  736. PyVar _tp_function, _tp_native_function, _tp_native_iterator, _tp_bound_method;
  737. PyVar _tp_slice, _tp_range, _tp_module, _tp_ref;
  738. PyVar _tp_super, _tp_exception;
  739. template<typename P>
  740. inline PyVarRef PyRef(P&& value) {
  741. static_assert(std::is_base_of<BaseRef, P>::value, "P should derive from BaseRef");
  742. return new_object(_tp_ref, std::forward<P>(value));
  743. }
  744. inline const BaseRef* PyRef_AS_C(const PyVar& obj)
  745. {
  746. if(!obj->is_type(_tp_ref)) typeError("expected an l-value");
  747. return (const BaseRef*)(obj->value());
  748. }
  749. __DEF_PY_AS_C(Int, i64, _tp_int)
  750. inline PyVar PyInt(i64 value) {
  751. if(value >= -5 && value <= 256) return _small_integers[value + 5];
  752. return new_object(_tp_int, value);
  753. }
  754. DEF_NATIVE(Float, f64, _tp_float)
  755. DEF_NATIVE(Str, _Str, _tp_str)
  756. DEF_NATIVE(List, PyVarList, _tp_list)
  757. DEF_NATIVE(Tuple, PyVarList, _tp_tuple)
  758. DEF_NATIVE(Function, _Func, _tp_function)
  759. DEF_NATIVE(NativeFunction, _CppFunc, _tp_native_function)
  760. DEF_NATIVE(Iter, _Iterator, _tp_native_iterator)
  761. DEF_NATIVE(BoundMethod, _BoundMethod, _tp_bound_method)
  762. DEF_NATIVE(Range, _Range, _tp_range)
  763. DEF_NATIVE(Slice, _Slice, _tp_slice)
  764. DEF_NATIVE(Exception, _Exception, _tp_exception)
  765. // there is only one True/False, so no need to copy them!
  766. inline bool PyBool_AS_C(const PyVar& obj){return obj == True;}
  767. inline const PyVar& PyBool(bool value){return value ? True : False;}
  768. void initializeBuiltinClasses(){
  769. _tp_object = pkpy::make_shared<PyObject, Py_<i64>>(nullptr, DUMMY_VAL);
  770. _tp_type = pkpy::make_shared<PyObject, Py_<i64>>(nullptr, DUMMY_VAL);
  771. _types["object"] = _tp_object;
  772. _types["type"] = _tp_type;
  773. _tp_bool = new_type_object("bool");
  774. _tp_int = new_type_object("int");
  775. _tp_float = new_type_object("float");
  776. _tp_str = new_type_object("str");
  777. _tp_list = new_type_object("list");
  778. _tp_tuple = new_type_object("tuple");
  779. _tp_slice = new_type_object("slice");
  780. _tp_range = new_type_object("range");
  781. _tp_module = new_type_object("module");
  782. _tp_ref = new_type_object("_ref");
  783. _tp_function = new_type_object("function");
  784. _tp_native_function = new_type_object("_native_function");
  785. _tp_native_iterator = new_type_object("_native_iterator");
  786. _tp_bound_method = new_type_object("bound_method");
  787. _tp_super = new_type_object("super");
  788. _tp_exception = new_type_object("Exception");
  789. this->None = new_object(new_type_object("NoneType"), DUMMY_VAL);
  790. this->Ellipsis = new_object(new_type_object("ellipsis"), DUMMY_VAL);
  791. this->True = new_object(_tp_bool, true);
  792. this->False = new_object(_tp_bool, false);
  793. this->builtins = new_module("builtins");
  794. this->_main = new_module("__main__");
  795. this->__py2py_call_signal = new_object(new_type_object("_signal"), DUMMY_VAL);
  796. setattr(_tp_type, __base__, _tp_object);
  797. _tp_type->type = _tp_type;
  798. setattr(_tp_object, __base__, None);
  799. _tp_object->type = _tp_type;
  800. for (auto& [name, type] : _types) {
  801. setattr(type, __name__, PyStr(name));
  802. }
  803. std::vector<_Str> publicTypes = {"type", "object", "bool", "int", "float", "str", "list", "tuple", "range"};
  804. for (auto& name : publicTypes) {
  805. setattr(builtins, name, _types[name]);
  806. }
  807. }
  808. i64 hash(const PyVar& obj){
  809. if (obj->is_type(_tp_int)) return PyInt_AS_C(obj);
  810. if (obj->is_type(_tp_bool)) return PyBool_AS_C(obj) ? 1 : 0;
  811. if (obj->is_type(_tp_float)){
  812. f64 val = PyFloat_AS_C(obj);
  813. return (i64)std::hash<f64>()(val);
  814. }
  815. if (obj->is_type(_tp_str)) return PyStr_AS_C(obj).hash();
  816. if (obj->is_type(_tp_type)) return (i64)obj.get();
  817. if (obj->is_type(_tp_tuple)) {
  818. i64 x = 1000003;
  819. for (const auto& item : PyTuple_AS_C(obj)) {
  820. i64 y = hash(item);
  821. x = x ^ (y + 0x9e3779b9 + (x << 6) + (x >> 2)); // recommended by Github Copilot
  822. }
  823. return x;
  824. }
  825. typeError("unhashable type: " + OBJ_TP_NAME(obj));
  826. return 0;
  827. }
  828. /***** Error Reporter *****/
  829. private:
  830. void _error(const _Str& name, const _Str& msg){
  831. _error(_Exception(name, msg));
  832. }
  833. void _error(_Exception e){
  834. if(callstack.empty()){
  835. e.is_re = false;
  836. throw e;
  837. }
  838. top_frame()->push(PyException(e));
  839. _raise();
  840. }
  841. void _raise(){
  842. bool ok = top_frame()->jump_to_exception_handler();
  843. if(ok) throw HandledException();
  844. else throw UnhandledException();
  845. }
  846. public:
  847. void notImplementedError(){ _error("NotImplementedError", ""); }
  848. void typeError(const _Str& msg){ _error("TypeError", msg); }
  849. void zeroDivisionError(){ _error("ZeroDivisionError", "division by zero"); }
  850. void indexError(const _Str& msg){ _error("IndexError", msg); }
  851. void valueError(const _Str& msg){ _error("ValueError", msg); }
  852. void nameError(const _Str& name){ _error("NameError", "name '" + name + "' is not defined"); }
  853. void attributeError(PyVar obj, const _Str& name){
  854. _error("AttributeError", "type '" + OBJ_TP_NAME(obj) + "' has no attribute '" + name + "'");
  855. }
  856. inline void check_type(const PyVar& obj, const PyVar& type){
  857. if(!obj->is_type(type)) typeError("expected '" + OBJ_NAME(type) + "', but got '" + OBJ_TP_NAME(obj) + "'");
  858. }
  859. template<typename T>
  860. PyVar register_class(PyVar mod){
  861. PyVar type = new_user_type_object(mod, T::_name(), _tp_object);
  862. if(OBJ_NAME(mod) != T::_mod()) UNREACHABLE();
  863. T::_register(this, mod, type);
  864. return type;
  865. }
  866. template<typename T>
  867. T& py_cast(const PyVar& obj){
  868. check_type(obj, T::_type(this));
  869. return OBJ_GET(T, obj);
  870. }
  871. ~VM() {
  872. if(!use_stdio){
  873. delete _stdout;
  874. delete _stderr;
  875. }
  876. }
  877. _Code compile(_Str source, _Str filename, CompileMode mode);
  878. };
  879. /***** Pointers' Impl *****/
  880. PyVar NameRef::get(VM* vm, Frame* frame) const{
  881. PyVar* val;
  882. val = frame->f_locals().try_get(pair->first);
  883. if(val) return *val;
  884. val = frame->f_globals().try_get(pair->first);
  885. if(val) return *val;
  886. val = vm->builtins->attribs.try_get(pair->first);
  887. if(val) return *val;
  888. vm->nameError(pair->first);
  889. return nullptr;
  890. }
  891. void NameRef::set(VM* vm, Frame* frame, PyVar val) const{
  892. switch(pair->second) {
  893. case NAME_LOCAL: frame->f_locals()[pair->first] = std::move(val); break;
  894. case NAME_GLOBAL:
  895. {
  896. PyVar* existing = frame->f_locals().try_get(pair->first);
  897. if(existing != nullptr){
  898. *existing = std::move(val);
  899. }else{
  900. frame->f_globals()[pair->first] = std::move(val);
  901. }
  902. } break;
  903. default: UNREACHABLE();
  904. }
  905. }
  906. void NameRef::del(VM* vm, Frame* frame) const{
  907. switch(pair->second) {
  908. case NAME_LOCAL: {
  909. if(frame->f_locals().contains(pair->first)){
  910. frame->f_locals().erase(pair->first);
  911. }else{
  912. vm->nameError(pair->first);
  913. }
  914. } break;
  915. case NAME_GLOBAL:
  916. {
  917. if(frame->f_locals().contains(pair->first)){
  918. frame->f_locals().erase(pair->first);
  919. }else{
  920. if(frame->f_globals().contains(pair->first)){
  921. frame->f_globals().erase(pair->first);
  922. }else{
  923. vm->nameError(pair->first);
  924. }
  925. }
  926. } break;
  927. default: UNREACHABLE();
  928. }
  929. }
  930. PyVar AttrRef::get(VM* vm, Frame* frame) const{
  931. return vm->getattr(obj, attr.pair->first);
  932. }
  933. void AttrRef::set(VM* vm, Frame* frame, PyVar val) const{
  934. vm->setattr(obj, attr.pair->first, val);
  935. }
  936. void AttrRef::del(VM* vm, Frame* frame) const{
  937. vm->typeError("cannot delete attribute");
  938. }
  939. PyVar IndexRef::get(VM* vm, Frame* frame) const{
  940. return vm->call(obj, __getitem__, pkpy::oneArg(index));
  941. }
  942. void IndexRef::set(VM* vm, Frame* frame, PyVar val) const{
  943. vm->call(obj, __setitem__, pkpy::twoArgs(index, val));
  944. }
  945. void IndexRef::del(VM* vm, Frame* frame) const{
  946. vm->call(obj, __delitem__, pkpy::oneArg(index));
  947. }
  948. PyVar TupleRef::get(VM* vm, Frame* frame) const{
  949. PyVarList args(varRefs.size());
  950. for (int i = 0; i < varRefs.size(); i++) {
  951. args[i] = vm->PyRef_AS_C(varRefs[i])->get(vm, frame);
  952. }
  953. return vm->PyTuple(args);
  954. }
  955. void TupleRef::set(VM* vm, Frame* frame, PyVar val) const{
  956. if(!val->is_type(vm->_tp_tuple) && !val->is_type(vm->_tp_list)){
  957. vm->typeError("only tuple or list can be unpacked");
  958. }
  959. const PyVarList& args = OBJ_GET(PyVarList, val);
  960. if(args.size() > varRefs.size()) vm->valueError("too many values to unpack");
  961. if(args.size() < varRefs.size()) vm->valueError("not enough values to unpack");
  962. for (int i = 0; i < varRefs.size(); i++) {
  963. vm->PyRef_AS_C(varRefs[i])->set(vm, frame, args[i]);
  964. }
  965. }
  966. void TupleRef::del(VM* vm, Frame* frame) const{
  967. for (auto& r : varRefs) vm->PyRef_AS_C(r)->del(vm, frame);
  968. }
  969. /***** Frame's Impl *****/
  970. inline void Frame::try_deref(VM* vm, PyVar& v){
  971. if(v->is_type(vm->_tp_ref)) v = vm->PyRef_AS_C(v)->get(vm, this);
  972. }
  973. /***** Iterators' Impl *****/
  974. PyVar RangeIterator::next(){
  975. PyVar val = vm->PyInt(current);
  976. current += r.step;
  977. return val;
  978. }
  979. PyVar StringIterator::next(){
  980. return vm->PyStr(str.u8_getitem(index++));
  981. }
  982. PyVar _CppFunc::operator()(VM* vm, const pkpy::Args& args) const{
  983. int args_size = args.size() - (int)method; // remove self
  984. if(argc != -1 && args_size != argc) {
  985. vm->typeError("expected " + std::to_string(argc) + " arguments, but got " + std::to_string(args_size));
  986. }
  987. return f(vm, args);
  988. }