X Tutup
Skip to content

Embedded displayables leak from Transform._in_current_store #6945

@mal

Description

@mal

Per Discord - 2026-03-08.

Commit 0e71cc4 in 8.5.0 introduced the change below.

if isinstance(self, ATLTransform):
assert isinstance(rv, ATLTransform)
rv.block = self.block

This doesn't seem to be safe when ATL leverages the child keyword as it gets baked into the compiled block. The result is that the correct child (result of _in_current_store) which was passed to the constructor ends up ignored in favour of the one baked into the reused block.

It's unclear if other displayables pulled in via the ATL block copy would suffer similar issues, but on the surface it seems likely. The current preference is to retain the performance gain from the linked change, but how to do so while ensuring safety in this scenario isn't entirely clear yet.

Update

The commit referenced above effectively regresses #6534 which was resolved in the 8.5.0 cycle. The testcase for that issue is nearly identical for this one, the only difference being the use of an ATL transform using the child keyword rather than a vanilla one.

Test case
image test = '[color]'
image r = Solid('f773', xysize=(320, 240))
image y = Solid('ff73', xysize=(320, 240))

transform wrap(child):
    child

label start:
    $ color = 'r'

    scene black
    show test as person
    'initial red'
    $ color = 'y'
    with {'master': dissolve}
    'dissolves to yellow'

    $ color = 'r'

    scene black
    show layer master at wrap
    show test as person
    'initial red'
    $ color = 'y'
    with {'master': dissolve}
    'instantly yellow'
    return

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      X Tutup