From ac189cc916c58985333c6678ee7bc649e5d5f414 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Mon, 12 Apr 2021 09:45:25 -0700 Subject: [PATCH] Support LOAD_METHOD and CALL_METHOD from Python 3.7+ Fixes #163 --- ASTree.cpp | 36 ++++++++++++++++++ tests/compiled/load_method.3.7.pyc | Bin 0 -> 675 bytes tests/compiled/load_method.3.9.pyc | Bin 0 -> 695 bytes .../{xfail => compiled}/private_name.3.7.pyc | Bin tests/compiled/test_class_method_py3.3.7.pyc | Bin 0 -> 454 bytes tests/input/load_method.py | 15 ++++++++ tests/tokenized/load_method.txt | 19 +++++++++ tests/xfail/loadbuild_class.3.7.pyc | Bin 0 -> 885 bytes 8 files changed, 70 insertions(+) create mode 100644 tests/compiled/load_method.3.7.pyc create mode 100644 tests/compiled/load_method.3.9.pyc rename tests/{xfail => compiled}/private_name.3.7.pyc (100%) create mode 100644 tests/compiled/test_class_method_py3.3.7.pyc create mode 100644 tests/input/load_method.py create mode 100644 tests/tokenized/load_method.txt create mode 100644 tests/xfail/loadbuild_class.3.7.pyc diff --git a/ASTree.cpp b/ASTree.cpp index 6d80b23..ba31382 100644 --- a/ASTree.cpp +++ b/ASTree.cpp @@ -580,6 +580,34 @@ PycRef BuildFromCode(PycRef code, PycModule* mod) stack.push(call); } break; + case Pyc::CALL_METHOD_A: + { + ASTCall::pparam_t pparamList; + for (int i = 0; i < operand; i++) { + PycRef param = stack.top(); + stack.pop(); + if (param.type() == ASTNode::NODE_FUNCTION) { + PycRef fun_code = param.cast()->code(); + PycRef code_src = fun_code.cast()->object().cast(); + PycRef function_name = code_src->name(); + if (function_name->isEqual("")) { + pparamList.push_front(param); + } else { + // Decorator used + PycRef decor_name = new ASTName(function_name); + curblock->append(new ASTStore(param, decor_name)); + + pparamList.push_front(decor_name); + } + } else { + pparamList.push_front(param); + } + } + PycRef func = stack.top(); + stack.pop(); + stack.push(new ASTCall(func, pparamList, ASTCall::kwparam_t())); + } + break; case Pyc::CONTINUE_LOOP_A: curblock->append(new ASTKeyword(ASTKeyword::KW_CONTINUE)); break; @@ -1476,6 +1504,14 @@ PycRef BuildFromCode(PycRef code, PycModule* mod) case Pyc::STORE_LOCALS: stack.pop(); break; + case Pyc::LOAD_METHOD_A: + { + // Behave like LOAD_ATTR + PycRef name = stack.top(); + stack.pop(); + stack.push(new ASTBinary(name, new ASTName(code->getName(operand)), ASTBinary::BIN_ATTR)); + } + break; case Pyc::LOAD_NAME_A: stack.push(new ASTName(code->getName(operand))); break; diff --git a/tests/compiled/load_method.3.7.pyc b/tests/compiled/load_method.3.7.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c07bd561ae43cfaa59ca827a84887dc8987ac0ad GIT binary patch literal 675 zcma)3y-veG3_jek?giu8Xwk+Mc98nwuQu;%ZB3iXm`yh1Wl}=(} zig*JSurF$mijc76e}DGbcin8(1<}V-e)~rHot+)IWb}x$3lcX11;U1SZ4E^%)?x@T zyjWWSg0zhm+URU;^2Ce7QFI5w_aeepWRcY)&Q3_g)B(lNLO^RHhBo6#JLsZE+Qk~- zrG|b4RL#V2w)@1HB!RG^7F1>h1t(s~(oPm9cN)Ufric-r?T7JnmY*e)5Y;Ho?Z7!A)F<{B0$ zBY$3ydYm)^yPVk@*sZR_TkNk$moHbW7V_cm{)2BPF&Jwl{ zm3o|oNtsD&giRYPnk=e;rNv96yBB8cNszX5OsqI1zu@JHFQR}h!lfFbe{|LIvV74M NW6a;S8Xib!!8h4}cE$hz literal 0 HcmV?d00001 diff --git a/tests/compiled/load_method.3.9.pyc b/tests/compiled/load_method.3.9.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd5ed6061b756c26d1b19d11e50689071ef3efd4 GIT binary patch literal 695 zcma)3y-or_5Z>AQVFe);B))*nSzx5FGKPf0?i#vl*30b~O^zS$4kH9Acn~OkrA@4? zF1~?{&g=;a#>7eH=bPD?Z)Z2G*Q*TW?J>W3LH|nNr#J{YsM!UYYo?fjCF+6)EM^N9 zKnyFsX28%}iYrUmYYP!u*_2gIk9lr{y*t7Ybx^YtG%-$5EZ_On> zDmX)E=th92H$o!_cTqEeM!_7%;8E@uRCvZn+gY64Y6w#cGse6(?+2rCewGYFCHrxH zH&m_BL_2w$<>xdsBg0@?>9$NRvI&0)JqOhd>k$SsnDHi?S;uT{8+PywjpwA)r{PJ% zM8hM?)ZsJS4Z0iV&1cI5y7 literal 0 HcmV?d00001 diff --git a/tests/xfail/private_name.3.7.pyc b/tests/compiled/private_name.3.7.pyc similarity index 100% rename from tests/xfail/private_name.3.7.pyc rename to tests/compiled/private_name.3.7.pyc diff --git a/tests/compiled/test_class_method_py3.3.7.pyc b/tests/compiled/test_class_method_py3.3.7.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e2f2806645f725623a21ab3369370c19e9e71e5 GIT binary patch literal 454 zcmYjNJx{|h5cN4}>qeBJV(P@elBFPKgep2Pk%cXb6~(EDnlEAp)QYYB1N;mY)Stra zm8mlu6L$%qp7h>5U*6r>xfzW-hVk+KDtDMa>F^g0iWx$Wk#3n{3bu$151Hck%y(j} z{|84kL+BHvgoU73$Q3BQWuc=S^t*O&x0+{>)-jnWC==!geS!1>3YMZC8(gsgV8sM0 z&T?3vVa07L0#%QcVmP!P?0eW3x{LHF+0(4`peW6$c`hwn`e1uiofgLD*40V2u#mp7 zTA=NFk``5C&P}3?jOkV~Ps~H9rq#;!J4xeo`-4D$N8sz@-#1J + +def test1 ( self ) : + +a = 1 + +def test2 ( self , x , y , z ) : + +a = x * y + z + +def testS ( ) : + +a = 3 + + +c = C ( ) +c . test1 ( ) +c . test2 ( 42 , 5 , - 1 ) +C . testS ( ) diff --git a/tests/xfail/loadbuild_class.3.7.pyc b/tests/xfail/loadbuild_class.3.7.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa688fe9da06cadc1de2c643bb97f95e583858b5 GIT binary patch literal 885 zcmbV~y-ve05P*G-lZHa83Ni2sUBU|>RJBrBP#3l=CaqnmQrZ-!0fEHSK1dnac^a=w zyaE$@gb>0fP3wp{ literal 0 HcmV?d00001