Skip to content

Require a value-producing head before matching return tails - #13

Open
EiNSTeiN- wants to merge 2 commits into
ejfkdev:mainfrom
EiNSTeiN-:fix/return-tail-value-head
Open

EiNSTeiN- wants to merge 2 commits into
ejfkdev:mainfrom
EiNSTeiN-:fix/return-tail-value-head

Conversation

@EiNSTeiN-

Copy link
Copy Markdown

I am opening this PR to prevent a padded handler-return trailer from matching and swallowing the function's later return-value construction. The following source loses its final return build(item) when the handler's return bytecode contains inert padding:

def select(read, build):
    try:
        item = read()
    except ValueError:
        return build("missing")
    return build(item)

With NOPs in the return trailers, pycdc currently emits an incomplete function that ends at the exception clause:

def select(read, build):
    try:
        item = read()
    except ValueError:
        return build("missing")

Some returns carry a value computed before cleanup. Treating only padding plus RETURN as a duplicated value-building tail can match unrelated mainline returns, swallowing their call or response construction and leaving an empty stack.

The change makes sunk_return_mirror_merge skip known padding to find the first meaningful operation and require a genuine value head: a load or an empty container construction. A carried-value return is left for the existing scope/value reconstruction. An actual independently constructed return tail remains eligible for matching.

The same issue applies to the asynchronous variation, where item = await read(). This matcher operates on Python 3.11+ exception-table layouts. The padding preserves jump targets and exception-table boundaries; it does not change which source path should return a value.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant