pycdc icon indicating copy to clipboard operation
pycdc copied to clipboard

Wrong Output From pycdc

Open reitowo opened this issue 4 years ago • 5 comments

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.

reitowo avatar Jul 03 '21 13:07 reitowo

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 ______: ______))
)
)

reitowo avatar Jul 03 '21 14:07 reitowo

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. image

reitowo avatar Jul 03 '21 14:07 reitowo

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.

reitowo avatar Jul 03 '21 15:07 reitowo

Hi @cnSchwarzer, Are you willing to submit a pull request?

zrax avatar Jul 13 '21 14:07 zrax

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?

reitowo avatar Jul 14 '21 07:07 reitowo