Wrong Output From pycdc
Considering this block output from pycdas:
File Name: **
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 4
Flags: 0x00000013 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED)
[Names]
[Var Names]
'___'
[Free Vars]
'_'
'__'
[Cell Vars]
'___'
[Constants]
None
[Code]
File Name: **
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 3
Flags: 0x00000013 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED)
[Names]
[Var Names]
'____'
[Free Vars]
'__'
[Cell Vars]
'____'
[Constants]
None
[Code]
File Name: **
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 3
Flags: 0x00000013 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED)
[Names]
[Var Names]
'_____'
[Free Vars]
'__'
'____'
[Cell Vars]
[Constants]
None
[Disassembly]
0 LOAD_FAST 0: _____
2 LOAD_DEREF 1: ____
4 LOAD_DEREF 0: __
6 CALL_FUNCTION 1
8 CALL_FUNCTION 1
10 RETURN_VALUE
'<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
[Disassembly]
0 LOAD_CLOSURE 1: __
2 LOAD_CLOSURE 0: ____
4 BUILD_TUPLE 2
6 LOAD_CONST 1: <CODE> <lambda>
8 LOAD_CONST 2: '<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
10 MAKE_FUNCTION 8
12 RETURN_VALUE
'<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
[Code]
File Name: **
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 1
Flags: 0x00000013 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED)
[Names]
[Var Names]
'_____'
[Free Vars]
'___'
[Cell Vars]
[Constants]
None
[Disassembly]
0 LOAD_DEREF 0: ___
2 RETURN_VALUE
[Code]
File Name: **
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 1
Flags: 0x00000053 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED | CO_NOFREE)
[Names]
[Var Names]
'______'
[Free Vars]
[Cell Vars]
[Constants]
None
[Disassembly]
0 LOAD_FAST 0: ______
2 RETURN_VALUE
[Disassembly]
0 LOAD_DEREF 1: _
2 LOAD_CLOSURE 2: __
4 BUILD_TUPLE 1
6 LOAD_CONST 1: <CODE> <lambda>
8 LOAD_CONST 2: '<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
10 MAKE_FUNCTION 8
12 CALL_FUNCTION 1
14 LOAD_CLOSURE 0: ___
16 BUILD_TUPLE 1
18 LOAD_CONST 3: <CODE> <lambda>
20 LOAD_CONST 2: '<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
22 MAKE_FUNCTION 8
24 CALL_FUNCTION 1
26 LOAD_CONST 4: <CODE> <lambda>
28 LOAD_CONST 2: '<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
30 MAKE_FUNCTION 0
32 CALL_FUNCTION 1
34 RETURN_VALUE
The decompiler outputs:
(lambda ___ : None((lambda _____ : ___))((lambda ______: ______)))
It (might) should be:
(lambda ___ : _((lambda ____: (lambda _____: _____(____(__)))))((lambda _____ : ___))((lambda ______: ______)))
Please check it.
A simple POC:
v = (lambda _: (lambda __ : (lambda ___ : _((lambda ____: (lambda _____: _____(____(__)))))((lambda _____ : ___))((lambda ______: ______)))))
Compiled with Python 3.9. Tested with latest pycdc & pycdas.
pycdas output:
pypy2.cpython-39.pyc (Python 3.9)
[Code]
File Name: .\pypy2.py
Object Name: <module>
Arg Count: 0
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 0
Stack Size: 2
Flags: 0x00000040 (CO_NOFREE)
[Names]
'v'
[Var Names]
[Free Vars]
[Cell Vars]
[Constants]
[Code]
File Name: .\pypy2.py
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 3
Flags: 0x00000003 (CO_OPTIMIZED | CO_NEWLOCALS)
[Names]
[Var Names]
'_'
[Free Vars]
[Cell Vars]
'_'
[Constants]
None
[Code]
File Name: .\pypy2.py
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 3
Flags: 0x00000013 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED)
[Names]
[Var Names]
'__'
[Free Vars]
'_'
[Cell Vars]
'__'
[Constants]
None
[Code]
File Name: .\pypy2.py
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 4
Flags: 0x00000013 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED)
[Names]
[Var Names]
'___'
[Free Vars]
'_'
'__'
[Cell Vars]
'___'
[Constants]
None
[Code]
File Name: .\pypy2.py
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 3
Flags: 0x00000013 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED)
[Names]
[Var Names]
'____'
[Free Vars]
'__'
[Cell Vars]
'____'
[Constants]
None
[Code]
File Name: .\pypy2.py
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 3
Flags: 0x00000013 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED)
[Names]
[Var Names]
'_____'
[Free Vars]
'__'
'____'
[Cell Vars]
[Constants]
None
[Disassembly]
0 LOAD_FAST 0: _____
2 LOAD_DEREF 1: ____
4 LOAD_DEREF 0: __
6 CALL_FUNCTION 1
8 CALL_FUNCTION 1
10 RETURN_VALUE
'<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
[Disassembly]
0 LOAD_CLOSURE 1: __
2 LOAD_CLOSURE 0: ____
4 BUILD_TUPLE 2
6 LOAD_CONST 1: <CODE> <lambda>
8 LOAD_CONST 2: '<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
10 MAKE_FUNCTION 8
12 RETURN_VALUE
'<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
[Code]
File Name: .\pypy2.py
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 1
Flags: 0x00000013 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED)
[Names]
[Var Names]
'_____'
[Free Vars]
'___'
[Cell Vars]
[Constants]
None
[Disassembly]
0 LOAD_DEREF 0: ___
2 RETURN_VALUE
[Code]
File Name: .\pypy2.py
Object Name: <lambda>
Arg Count: 1
Pos Only Arg Count: 0
KW Only Arg Count: 0
Locals: 1
Stack Size: 1
Flags: 0x00000053 (CO_OPTIMIZED | CO_NEWLOCALS | CO_NESTED | CO_NOFREE)
[Names]
[Var Names]
'______'
[Free Vars]
[Cell Vars]
[Constants]
None
[Disassembly]
0 LOAD_FAST 0: ______
2 RETURN_VALUE
[Disassembly]
2 LOAD_CLOSURE 2: __
4 BUILD_TUPLE 1
6 LOAD_CONST 1: <CODE> <lambda>
8 LOAD_CONST 2: '<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
10 MAKE_FUNCTION 8
12 CALL_FUNCTION 1
14 LOAD_CLOSURE 0: ___
16 BUILD_TUPLE 1
18 LOAD_CONST 3: <CODE> <lambda>
20 LOAD_CONST 2: '<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
22 MAKE_FUNCTION 8
24 CALL_FUNCTION 1
26 LOAD_CONST 4: <CODE> <lambda>
28 LOAD_CONST 2: '<lambda>.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>'
30 MAKE_FUNCTION 0
32 CALL_FUNCTION 1
34 RETURN_VALUE
'<lambda>.<locals>.<lambda>.<locals>.<lambda>'
[Disassembly]
0 LOAD_CLOSURE 1: _
2 LOAD_CLOSURE 0: __
4 BUILD_TUPLE 2
6 LOAD_CONST 1: <CODE> <lambda>
8 LOAD_CONST 2: '<lambda>.<locals>.<lambda>.<locals>.<lambda>'
10 MAKE_FUNCTION 8
12 RETURN_VALUE
'<lambda>.<locals>.<lambda>'
[Disassembly]
0 LOAD_CLOSURE 0: _
2 BUILD_TUPLE 1
4 LOAD_CONST 1: <CODE> <lambda>
6 LOAD_CONST 2: '<lambda>.<locals>.<lambda>'
8 MAKE_FUNCTION 8
10 RETURN_VALUE
'<lambda>'
None
[Disassembly]
0 LOAD_CONST 0: <CODE> <lambda>
2 LOAD_CONST 1: '<lambda>'
4 MAKE_FUNCTION 0
6 STORE_NAME 0: v
8 LOAD_CONST 2: None
10 RETURN_VALUE
pycdc output:
# Source Generated with Decompyle++
# File: pypy2.cpython-39.pyc (Python 3.9)
v = lambda _: (lambda __ = None: (lambda ___ = None: None((lambda _____ = None: ___))((lambda ______: ______))
)
)
It seems the reason might related to this part of code:
case Pyc::MAKE_FUNCTION_A:
{
PycRef<ASTNode> fun_code = stack.top();
stack.pop();
/* Test for the qualified name of the function (at TOS) */
int tos_type = fun_code.cast<ASTObject>()->object().type();
if (tos_type != PycObject::TYPE_CODE &&
tos_type != PycObject::TYPE_CODE2) {
fun_code = stack.top();
stack.pop();
}
ASTFunction::defarg_t defArgs, kwDefArgs;
const int defCount = operand & 0xFF;
const int kwDefCount = (operand >> 8) & 0xFF;
for (int i = 0; i < defCount; ++i) {
defArgs.push_front(stack.top());
stack.pop();
}
for (int i = 0; i < kwDefCount; ++i) {
kwDefArgs.push_front(stack.top());
stack.pop();
}
stack.push(new ASTFunction(fun_code, defArgs, kwDefArgs));
}
break;
As defCount is 8 in this case, and it pops stack 8 times, which is wrong.

By adding this,
case Pyc::LOAD_CLOSURE_A:
stack.push(new ASTName(code->getCellVar(operand)));
break;
and modify the MAKE_FUNCTION
ASTFunction::defarg_t defArgs, kwDefArgs;
PycRef<ASTNode> fun_name = stack.top();
stack.pop();
PycRef<ASTNode> fun_code = stack.top();
stack.pop();
if (operand & 0x01) {
stack.pop();
}
if (operand & 0x02) {
stack.pop();
}
if (operand & 0x04) {
stack.pop();
}
if (operand & 0x08) {
stack.pop();
}
stack.push(new ASTFunction(fun_code, defArgs, kwDefArgs));
It works.
Hi @cnSchwarzer, Are you willing to submit a pull request?
Hi @cnSchwarzer, Are you willing to submit a pull request?
Hi,
It was just a quick fix, and I'm not sure if it meets your design. Because Load Closure in Python 3.9 seems doesn't have defArgs or kwDefArgs and I don't know whether it works. Maybe your current executor is based on some old version Python?