vm.h 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078
  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. // _CppFunc do not support kwargs
  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. callstack.pop();
  524. if(frame->id == base_id){ // [ frameBase<- ]
  525. return ret;
  526. }else{
  527. frame = callstack.top().get();
  528. frame->push(ret);
  529. }
  530. }else{
  531. frame = callstack.top().get(); // [ frameBase, newFrame<- ]
  532. }
  533. }catch(HandledException& e){
  534. continue;
  535. }catch(UnhandledException& e){
  536. PyVar obj = frame->pop();
  537. _Exception& _e = PyException_AS_C(obj);
  538. _e.st_push(frame->curr_snapshot());
  539. callstack.pop();
  540. if(callstack.empty()) throw _e;
  541. frame = callstack.top().get();
  542. frame->push(obj);
  543. if(frame->id < base_id) throw ToBeRaisedException();
  544. need_raise = true;
  545. }catch(ToBeRaisedException& e){
  546. need_raise = true;
  547. }
  548. }
  549. }
  550. PyVar new_user_type_object(PyVar mod, _Str name, PyVar base){
  551. PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>(_tp_type, DUMMY_VAL);
  552. setattr(obj, __base__, base);
  553. _Str fullName = name;
  554. if(mod != builtins) fullName = OBJ_NAME(mod) + "." + name;
  555. setattr(obj, __name__, PyStr(fullName));
  556. setattr(mod, name, obj);
  557. return obj;
  558. }
  559. PyVar new_type_object(_Str name, PyVar base=nullptr) {
  560. if(base == nullptr) base = _tp_object;
  561. PyVar obj = pkpy::make_shared<PyObject, Py_<i64>>(_tp_type, DUMMY_VAL);
  562. setattr(obj, __base__, base);
  563. _types[name] = obj;
  564. return obj;
  565. }
  566. template<typename T>
  567. inline PyVar new_object(PyVar type, T _value) {
  568. if(!type->is_type(_tp_type)) UNREACHABLE();
  569. return pkpy::make_shared<PyObject, Py_<T>>(type, _value);
  570. }
  571. template<typename T, typename... Args>
  572. inline PyVar new_object_c(Args&&... args) {
  573. return new_object(T::_tp(this), T(std::forward<Args>(args)...));
  574. }
  575. PyVar new_module(_Str name) {
  576. PyVar obj = new_object(_tp_module, DUMMY_VAL);
  577. setattr(obj, __name__, PyStr(name));
  578. _modules[name] = obj;
  579. return obj;
  580. }
  581. PyVar new_module_if_not_existed(_Str name) {
  582. PyVar* it = _modules.try_get(name);
  583. if(it != nullptr) return *it;
  584. return new_module(name);
  585. }
  586. PyVarOrNull getattr(const PyVar& obj, const _Str& name, bool throw_err=true) {
  587. PyVarDict::iterator it;
  588. PyObject* cls;
  589. if(obj->is_type(_tp_super)){
  590. const PyVar* root = &obj;
  591. int depth = 1;
  592. while(true){
  593. root = &OBJ_GET(PyVar, *root);
  594. if(!(*root)->is_type(_tp_super)) break;
  595. depth++;
  596. }
  597. cls = (*root)->type.get();
  598. for(int i=0; i<depth; i++) cls = cls->attribs[__base__].get();
  599. it = (*root)->attribs.find(name);
  600. if(it != (*root)->attribs.end()) return it->second;
  601. }else{
  602. it = obj->attribs.find(name);
  603. if(it != obj->attribs.end()) return it->second;
  604. cls = obj->type.get();
  605. }
  606. while(cls != None.get()) {
  607. it = cls->attribs.find(name);
  608. if(it != cls->attribs.end()){
  609. PyVar valueFromCls = it->second;
  610. if(valueFromCls->is_type(_tp_function) || valueFromCls->is_type(_tp_native_function)){
  611. return PyBoundMethod({obj, std::move(valueFromCls)});
  612. }else{
  613. return valueFromCls;
  614. }
  615. }
  616. cls = cls->attribs[__base__].get();
  617. }
  618. if(throw_err) attributeError(obj, name);
  619. return nullptr;
  620. }
  621. template<typename T>
  622. inline void setattr(PyVar& obj, const _Str& name, T&& value) {
  623. PyObject* p = obj.get();
  624. while(p->is_type(_tp_super)) p = static_cast<PyVar*>(p->value())->get();
  625. p->attribs[name] = std::forward<T>(value);
  626. }
  627. template<int ARGC>
  628. void bindMethod(PyVar obj, _Str funcName, _CppFuncRaw fn) {
  629. check_type(obj, _tp_type);
  630. setattr(obj, funcName, PyNativeFunction(_CppFunc(fn, ARGC, true)));
  631. }
  632. template<int ARGC>
  633. void bindFunc(PyVar obj, _Str funcName, _CppFuncRaw fn) {
  634. setattr(obj, funcName, PyNativeFunction(_CppFunc(fn, ARGC, false)));
  635. }
  636. template<int ARGC>
  637. void bindMethod(_Str typeName, _Str funcName, _CppFuncRaw fn) {
  638. bindMethod<ARGC>(_types[typeName], funcName, fn);
  639. }
  640. template<int ARGC>
  641. void bindStaticMethod(_Str typeName, _Str funcName, _CppFuncRaw fn) {
  642. bindFunc<ARGC>(_types[typeName], funcName, fn);
  643. }
  644. template<int ARGC>
  645. void bindMethodMulti(std::vector<_Str> typeNames, _Str funcName, _CppFuncRaw fn) {
  646. for(auto& typeName : typeNames) bindMethod<ARGC>(typeName, funcName, fn);
  647. }
  648. template<int ARGC>
  649. void bindBuiltinFunc(_Str funcName, _CppFuncRaw fn) {
  650. bindFunc<ARGC>(builtins, funcName, fn);
  651. }
  652. inline f64 num_to_float(const PyVar& obj){
  653. if (obj->is_type(_tp_int)){
  654. return (f64)PyInt_AS_C(obj);
  655. }else if(obj->is_type(_tp_float)){
  656. return PyFloat_AS_C(obj);
  657. }
  658. typeError("expected int or float, got " + OBJ_TP_NAME(obj));
  659. return 0;
  660. }
  661. PyVar num_negated(const PyVar& obj){
  662. if (obj->is_type(_tp_int)){
  663. return PyInt(-PyInt_AS_C(obj));
  664. }else if(obj->is_type(_tp_float)){
  665. return PyFloat(-PyFloat_AS_C(obj));
  666. }
  667. typeError("unsupported operand type(s) for -");
  668. return nullptr;
  669. }
  670. int normalized_index(int index, int size){
  671. if(index < 0) index += size;
  672. if(index < 0 || index >= size){
  673. indexError("index out of range, " + std::to_string(index) + " not in [0, " + std::to_string(size) + ")");
  674. }
  675. return index;
  676. }
  677. _Str disassemble(_Code code){
  678. std::vector<int> jumpTargets;
  679. for(auto byte : code->co_code){
  680. if(byte.op == OP_JUMP_ABSOLUTE || byte.op == OP_SAFE_JUMP_ABSOLUTE || byte.op == OP_POP_JUMP_IF_FALSE){
  681. jumpTargets.push_back(byte.arg);
  682. }
  683. }
  684. _StrStream ss;
  685. ss << std::string(54, '-') << '\n';
  686. ss << code->name << ":\n";
  687. int prev_line = -1;
  688. for(int i=0; i<code->co_code.size(); i++){
  689. const Bytecode& byte = code->co_code[i];
  690. _Str line = std::to_string(byte.line);
  691. if(byte.line == prev_line) line = "";
  692. else{
  693. if(prev_line != -1) ss << "\n";
  694. prev_line = byte.line;
  695. }
  696. std::string pointer;
  697. if(std::find(jumpTargets.begin(), jumpTargets.end(), i) != jumpTargets.end()){
  698. pointer = "-> ";
  699. }else{
  700. pointer = " ";
  701. }
  702. ss << pad(line, 8) << pointer << pad(std::to_string(i), 3);
  703. ss << " " << pad(OP_NAMES[byte.op], 20) << " ";
  704. // ss << pad(byte.arg == -1 ? "" : std::to_string(byte.arg), 5);
  705. std::string argStr = byte.arg == -1 ? "" : std::to_string(byte.arg);
  706. if(byte.op == OP_LOAD_CONST){
  707. argStr += " (" + PyStr_AS_C(asRepr(code->consts[byte.arg])) + ")";
  708. }
  709. if(byte.op == OP_LOAD_NAME_REF || byte.op == OP_LOAD_NAME || byte.op == OP_RAISE){
  710. argStr += " (" + code->names[byte.arg].first.__escape(true) + ")";
  711. }
  712. ss << pad(argStr, 20); // may overflow
  713. ss << code->blocks[byte.block].to_string();
  714. if(i != code->co_code.size() - 1) ss << '\n';
  715. }
  716. _StrStream consts;
  717. consts << "consts: ";
  718. consts << PyStr_AS_C(asRepr(PyList(code->consts)));
  719. _StrStream names;
  720. names << "names: ";
  721. PyVarList list;
  722. for(int i=0; i<code->names.size(); i++){
  723. list.push_back(PyStr(code->names[i].first));
  724. }
  725. names << PyStr_AS_C(asRepr(PyList(list)));
  726. ss << '\n' << consts.str() << '\n' << names.str() << '\n';
  727. for(int i=0; i<code->consts.size(); i++){
  728. PyVar obj = code->consts[i];
  729. if(obj->is_type(_tp_function)){
  730. const auto& f = PyFunction_AS_C(obj);
  731. ss << disassemble(f->code);
  732. }
  733. }
  734. return _Str(ss.str());
  735. }
  736. // for quick access
  737. PyVar _tp_object, _tp_type, _tp_int, _tp_float, _tp_bool, _tp_str;
  738. PyVar _tp_list, _tp_tuple;
  739. PyVar _tp_function, _tp_native_function, _tp_native_iterator, _tp_bound_method;
  740. PyVar _tp_slice, _tp_range, _tp_module, _tp_ref;
  741. PyVar _tp_super, _tp_exception;
  742. template<typename P>
  743. inline PyVarRef PyRef(P&& value) {
  744. static_assert(std::is_base_of<BaseRef, P>::value, "P should derive from BaseRef");
  745. return new_object(_tp_ref, std::forward<P>(value));
  746. }
  747. inline const BaseRef* PyRef_AS_C(const PyVar& obj)
  748. {
  749. if(!obj->is_type(_tp_ref)) typeError("expected an l-value");
  750. return (const BaseRef*)(obj->value());
  751. }
  752. __DEF_PY_AS_C(Int, i64, _tp_int)
  753. inline PyVar PyInt(i64 value) {
  754. if(value >= -5 && value <= 256) return _small_integers[value + 5];
  755. return new_object(_tp_int, value);
  756. }
  757. DEF_NATIVE(Float, f64, _tp_float)
  758. DEF_NATIVE(Str, _Str, _tp_str)
  759. DEF_NATIVE(List, PyVarList, _tp_list)
  760. DEF_NATIVE(Tuple, PyVarList, _tp_tuple)
  761. DEF_NATIVE(Function, _Func, _tp_function)
  762. DEF_NATIVE(NativeFunction, _CppFunc, _tp_native_function)
  763. DEF_NATIVE(Iter, _Iterator, _tp_native_iterator)
  764. DEF_NATIVE(BoundMethod, _BoundMethod, _tp_bound_method)
  765. DEF_NATIVE(Range, _Range, _tp_range)
  766. DEF_NATIVE(Slice, _Slice, _tp_slice)
  767. DEF_NATIVE(Exception, _Exception, _tp_exception)
  768. // there is only one True/False, so no need to copy them!
  769. inline bool PyBool_AS_C(const PyVar& obj){return obj == True;}
  770. inline const PyVar& PyBool(bool value){return value ? True : False;}
  771. void initializeBuiltinClasses(){
  772. _tp_object = pkpy::make_shared<PyObject, Py_<i64>>(nullptr, DUMMY_VAL);
  773. _tp_type = pkpy::make_shared<PyObject, Py_<i64>>(nullptr, DUMMY_VAL);
  774. _types["object"] = _tp_object;
  775. _types["type"] = _tp_type;
  776. _tp_bool = new_type_object("bool");
  777. _tp_int = new_type_object("int");
  778. _tp_float = new_type_object("float");
  779. _tp_str = new_type_object("str");
  780. _tp_list = new_type_object("list");
  781. _tp_tuple = new_type_object("tuple");
  782. _tp_slice = new_type_object("slice");
  783. _tp_range = new_type_object("range");
  784. _tp_module = new_type_object("module");
  785. _tp_ref = new_type_object("_ref");
  786. _tp_function = new_type_object("function");
  787. _tp_native_function = new_type_object("_native_function");
  788. _tp_native_iterator = new_type_object("_native_iterator");
  789. _tp_bound_method = new_type_object("bound_method");
  790. _tp_super = new_type_object("super");
  791. _tp_exception = new_type_object("Exception");
  792. this->None = new_object(new_type_object("NoneType"), DUMMY_VAL);
  793. this->Ellipsis = new_object(new_type_object("ellipsis"), DUMMY_VAL);
  794. this->True = new_object(_tp_bool, true);
  795. this->False = new_object(_tp_bool, false);
  796. this->builtins = new_module("builtins");
  797. this->_main = new_module("__main__");
  798. this->__py2py_call_signal = new_object(new_type_object("_signal"), DUMMY_VAL);
  799. setattr(_tp_type, __base__, _tp_object);
  800. _tp_type->type = _tp_type;
  801. setattr(_tp_object, __base__, None);
  802. _tp_object->type = _tp_type;
  803. for (auto& [name, type] : _types) {
  804. setattr(type, __name__, PyStr(name));
  805. }
  806. std::vector<_Str> publicTypes = {"type", "object", "bool", "int", "float", "str", "list", "tuple", "range"};
  807. for (auto& name : publicTypes) {
  808. setattr(builtins, name, _types[name]);
  809. }
  810. }
  811. i64 hash(const PyVar& obj){
  812. if (obj->is_type(_tp_int)) return PyInt_AS_C(obj);
  813. if (obj->is_type(_tp_bool)) return PyBool_AS_C(obj) ? 1 : 0;
  814. if (obj->is_type(_tp_float)){
  815. f64 val = PyFloat_AS_C(obj);
  816. return (i64)std::hash<f64>()(val);
  817. }
  818. if (obj->is_type(_tp_str)) return PyStr_AS_C(obj).hash();
  819. if (obj->is_type(_tp_type)) return (i64)obj.get();
  820. if (obj->is_type(_tp_tuple)) {
  821. i64 x = 1000003;
  822. for (const auto& item : PyTuple_AS_C(obj)) {
  823. i64 y = hash(item);
  824. x = x ^ (y + 0x9e3779b9 + (x << 6) + (x >> 2)); // recommended by Github Copilot
  825. }
  826. return x;
  827. }
  828. typeError("unhashable type: " + OBJ_TP_NAME(obj));
  829. return 0;
  830. }
  831. /***** Error Reporter *****/
  832. private:
  833. void _error(const _Str& name, const _Str& msg){
  834. _error(_Exception(name, msg));
  835. }
  836. void _error(_Exception e){
  837. if(callstack.empty()){
  838. e.is_re = false;
  839. throw e;
  840. }
  841. top_frame()->push(PyException(e));
  842. _raise();
  843. }
  844. void _raise(){
  845. bool ok = top_frame()->jump_to_exception_handler();
  846. if(ok) throw HandledException();
  847. else throw UnhandledException();
  848. }
  849. public:
  850. void typeError(const _Str& msg){ _error("TypeError", msg); }
  851. void zeroDivisionError(){ _error("ZeroDivisionError", "division by zero"); }
  852. void indexError(const _Str& msg){ _error("IndexError", msg); }
  853. void valueError(const _Str& msg){ _error("ValueError", msg); }
  854. void nameError(const _Str& name){ _error("NameError", "name '" + name + "' is not defined"); }
  855. void attributeError(PyVar obj, const _Str& name){
  856. _error("AttributeError", "type '" + OBJ_TP_NAME(obj) + "' has no attribute '" + name + "'");
  857. }
  858. inline void check_type(const PyVar& obj, const PyVar& type){
  859. if(!obj->is_type(type)) typeError("expected '" + OBJ_NAME(type) + "', but got '" + OBJ_TP_NAME(obj) + "'");
  860. }
  861. ~VM() {
  862. if(!use_stdio){
  863. delete _stdout;
  864. delete _stderr;
  865. }
  866. }
  867. _Code compile(_Str source, _Str filename, CompileMode mode);
  868. };
  869. /***** Pointers' Impl *****/
  870. PyVar NameRef::get(VM* vm, Frame* frame) const{
  871. PyVar* val;
  872. val = frame->f_locals().try_get(pair->first);
  873. if(val) return *val;
  874. val = frame->f_globals().try_get(pair->first);
  875. if(val) return *val;
  876. val = vm->builtins->attribs.try_get(pair->first);
  877. if(val) return *val;
  878. vm->nameError(pair->first);
  879. return nullptr;
  880. }
  881. void NameRef::set(VM* vm, Frame* frame, PyVar val) const{
  882. switch(pair->second) {
  883. case NAME_LOCAL: frame->f_locals()[pair->first] = std::move(val); break;
  884. case NAME_GLOBAL:
  885. {
  886. PyVar* existing = frame->f_locals().try_get(pair->first);
  887. if(existing != nullptr){
  888. *existing = std::move(val);
  889. }else{
  890. frame->f_globals()[pair->first] = std::move(val);
  891. }
  892. } break;
  893. default: UNREACHABLE();
  894. }
  895. }
  896. void NameRef::del(VM* vm, Frame* frame) const{
  897. switch(pair->second) {
  898. case NAME_LOCAL: {
  899. if(frame->f_locals().contains(pair->first)){
  900. frame->f_locals().erase(pair->first);
  901. }else{
  902. vm->nameError(pair->first);
  903. }
  904. } break;
  905. case NAME_GLOBAL:
  906. {
  907. if(frame->f_locals().contains(pair->first)){
  908. frame->f_locals().erase(pair->first);
  909. }else{
  910. if(frame->f_globals().contains(pair->first)){
  911. frame->f_globals().erase(pair->first);
  912. }else{
  913. vm->nameError(pair->first);
  914. }
  915. }
  916. } break;
  917. default: UNREACHABLE();
  918. }
  919. }
  920. PyVar AttrRef::get(VM* vm, Frame* frame) const{
  921. return vm->getattr(obj, attr.pair->first);
  922. }
  923. void AttrRef::set(VM* vm, Frame* frame, PyVar val) const{
  924. vm->setattr(obj, attr.pair->first, val);
  925. }
  926. void AttrRef::del(VM* vm, Frame* frame) const{
  927. vm->typeError("cannot delete attribute");
  928. }
  929. PyVar IndexRef::get(VM* vm, Frame* frame) const{
  930. return vm->call(obj, __getitem__, pkpy::oneArg(index));
  931. }
  932. void IndexRef::set(VM* vm, Frame* frame, PyVar val) const{
  933. vm->call(obj, __setitem__, pkpy::twoArgs(index, val));
  934. }
  935. void IndexRef::del(VM* vm, Frame* frame) const{
  936. vm->call(obj, __delitem__, pkpy::oneArg(index));
  937. }
  938. PyVar TupleRef::get(VM* vm, Frame* frame) const{
  939. PyVarList args(varRefs.size());
  940. for (int i = 0; i < varRefs.size(); i++) {
  941. args[i] = vm->PyRef_AS_C(varRefs[i])->get(vm, frame);
  942. }
  943. return vm->PyTuple(args);
  944. }
  945. void TupleRef::set(VM* vm, Frame* frame, PyVar val) const{
  946. if(!val->is_type(vm->_tp_tuple) && !val->is_type(vm->_tp_list)){
  947. vm->typeError("only tuple or list can be unpacked");
  948. }
  949. const PyVarList& args = OBJ_GET(PyVarList, val);
  950. if(args.size() > varRefs.size()) vm->valueError("too many values to unpack");
  951. if(args.size() < varRefs.size()) vm->valueError("not enough values to unpack");
  952. for (int i = 0; i < varRefs.size(); i++) {
  953. vm->PyRef_AS_C(varRefs[i])->set(vm, frame, args[i]);
  954. }
  955. }
  956. void TupleRef::del(VM* vm, Frame* frame) const{
  957. for (auto& r : varRefs) vm->PyRef_AS_C(r)->del(vm, frame);
  958. }
  959. /***** Frame's Impl *****/
  960. inline void Frame::try_deref(VM* vm, PyVar& v){
  961. if(v->is_type(vm->_tp_ref)) v = vm->PyRef_AS_C(v)->get(vm, this);
  962. }
  963. /***** Iterators' Impl *****/
  964. PyVar RangeIterator::next(){
  965. PyVar val = vm->PyInt(current);
  966. current += r.step;
  967. return val;
  968. }
  969. PyVar StringIterator::next(){
  970. return vm->PyStr(str.u8_getitem(index++));
  971. }
  972. PyVar _CppFunc::operator()(VM* vm, const pkpy::Args& args) const{
  973. int args_size = args.size() - (int)method; // remove self
  974. if(argc != -1 && args_size != argc) {
  975. vm->typeError("expected " + std::to_string(argc) + " arguments, but got " + std::to_string(args_size));
  976. }
  977. return f(vm, args);
  978. }