Support LOAD_METHOD and CALL_METHOD from Python 3.7+
Fixes #163
This commit is contained in:
36
ASTree.cpp
36
ASTree.cpp
@@ -580,6 +580,34 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
stack.push(call);
|
||||
}
|
||||
break;
|
||||
case Pyc::CALL_METHOD_A:
|
||||
{
|
||||
ASTCall::pparam_t pparamList;
|
||||
for (int i = 0; i < operand; i++) {
|
||||
PycRef<ASTNode> param = stack.top();
|
||||
stack.pop();
|
||||
if (param.type() == ASTNode::NODE_FUNCTION) {
|
||||
PycRef<ASTNode> fun_code = param.cast<ASTFunction>()->code();
|
||||
PycRef<PycCode> code_src = fun_code.cast<ASTObject>()->object().cast<PycCode>();
|
||||
PycRef<PycString> function_name = code_src->name();
|
||||
if (function_name->isEqual("<lambda>")) {
|
||||
pparamList.push_front(param);
|
||||
} else {
|
||||
// Decorator used
|
||||
PycRef<ASTNode> decor_name = new ASTName(function_name);
|
||||
curblock->append(new ASTStore(param, decor_name));
|
||||
|
||||
pparamList.push_front(decor_name);
|
||||
}
|
||||
} else {
|
||||
pparamList.push_front(param);
|
||||
}
|
||||
}
|
||||
PycRef<ASTNode> 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<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
case Pyc::STORE_LOCALS:
|
||||
stack.pop();
|
||||
break;
|
||||
case Pyc::LOAD_METHOD_A:
|
||||
{
|
||||
// Behave like LOAD_ATTR
|
||||
PycRef<ASTNode> 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;
|
||||
|
BIN
tests/compiled/load_method.3.7.pyc
Normal file
BIN
tests/compiled/load_method.3.7.pyc
Normal file
Binary file not shown.
BIN
tests/compiled/load_method.3.9.pyc
Normal file
BIN
tests/compiled/load_method.3.9.pyc
Normal file
Binary file not shown.
BIN
tests/compiled/test_class_method_py3.3.7.pyc
Normal file
BIN
tests/compiled/test_class_method_py3.3.7.pyc
Normal file
Binary file not shown.
15
tests/input/load_method.py
Normal file
15
tests/input/load_method.py
Normal file
@@ -0,0 +1,15 @@
|
||||
class C:
|
||||
def test1(self):
|
||||
a = 1
|
||||
|
||||
def test2(self, x, y, z):
|
||||
a = x * y + z
|
||||
|
||||
# @staticmethod -- TODO: Fix decorators
|
||||
def testS():
|
||||
a = 3
|
||||
|
||||
c = C()
|
||||
c.test1()
|
||||
c.test2(42, 5, -1)
|
||||
C.testS()
|
19
tests/tokenized/load_method.txt
Normal file
19
tests/tokenized/load_method.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
class C : <EOL>
|
||||
<INDENT>
|
||||
def test1 ( self ) : <EOL>
|
||||
<INDENT>
|
||||
a = 1 <EOL>
|
||||
<OUTDENT>
|
||||
def test2 ( self , x , y , z ) : <EOL>
|
||||
<INDENT>
|
||||
a = x * y + z <EOL>
|
||||
<OUTDENT>
|
||||
def testS ( ) : <EOL>
|
||||
<INDENT>
|
||||
a = 3 <EOL>
|
||||
<OUTDENT>
|
||||
<OUTDENT>
|
||||
c = C ( ) <EOL>
|
||||
c . test1 ( ) <EOL>
|
||||
c . test2 ( 42 , 5 , - 1 ) <EOL>
|
||||
C . testS ( ) <EOL>
|
BIN
tests/xfail/loadbuild_class.3.7.pyc
Normal file
BIN
tests/xfail/loadbuild_class.3.7.pyc
Normal file
Binary file not shown.
Reference in New Issue
Block a user