pycdc icon indicating copy to clipboard operation
pycdc copied to clipboard

Fix MAKE_FUNCTION default args for py 3.6-3.12

Open CarrBen opened this issue 10 months ago • 5 comments

DRAFT: This is stacked on top of #538 as both include changes to the same opcode

Some changes for the handling of MAKE_FUNCTION operand & arguments in py3.6-3.12 that I discovered while make some fixes to decompile a py 3.11 app. I started on this before I noticed that #391 existed, but as this PR is stacked on top of #538 it works for py 3.0 & py 3.4 too.

MAKE_FUNCTION Python 3.4 Docs MAKE_FUNCTION Python 3.7 Docs

Summary

  • Remove xfail test_functions_py3 for py 3.7
  • Update compiled test_functions_py3 for py 3.7 to match input .py with the new test case in #538
  • Added a branch for py 3.6+ to handle the args & kwargs being in tuples & dicts

Tests

The test_functions_py3 for py 3.7 was in xfail. In the previous PR, I added a new test case and updated the tokenized version, to match this the test_functions_py3.3.7.pyc file in compiled was re-built from the (previously updated) source in input. I used the token_dump and pymultic scripts for this, with a slight modification to use -alpine containers in pymultic.

New py3.6-12 Arg Defaults for MAKE_FUNCTION

With the current master, pycdc produced this output for the x7d test case on py3.7.

def x7d(foo = None, *, bar, **kwargs):

However, this is the input

def x7d(foo = 1, *, bar = 2, **kwargs):

This is because the MAKE_FUNCTION code expects individual args on the stack, but they are now on the stack inside of 0-4 tuples & kwargs indicated by the operand flag.

Stacked on top of #538 Duplicates #391 Related Issues #507 ? #155 ? #138 #448 The MAKE_FUNCTION part

CarrBen avatar Feb 13 '25 21:02 CarrBen

And they changed it again on Python 3.13

Luiz-Monad avatar Jun 09 '25 00:06 Luiz-Monad

Hi @CarrBen thanks for your contribution. Would it be possible for you to update this PR wrt py 3.12/3.13? Thanks!

whoami730 avatar Jul 01 '25 03:07 whoami730

Hello @CarrBen thanks for your contribution.You can update this PR to Python3.13 version 3.13?thank you!

1111qqjwbbw avatar Aug 29 '25 00:08 1111qqjwbbw

@whoami730 @1111qqjwbbw I think this branch might work OK for 3.12 (though there might be some other things that don't play nice with it).

For 3.13, I'm looking at updating it, I think I have a fix, but it looks like there are some other changes to CALL in 3.13 that have some wider consequences.

I might raise another PR for 3.13 support rather than push here, but I'll update here with more info once I push something.

CarrBen avatar Aug 30 '25 23:08 CarrBen

@whoami730 @1111qqjwbbw I've set up #579 for the Python 3.13 MAKE_FUNCTION. It's a draft as it builds on top of both this PR and #538

CarrBen avatar Sep 03 '25 21:09 CarrBen