Skip to content

Fix bc_assign_slots corrupting OP_JMP offsets for standalone event calls#899

Merged
IgorYbema merged 1 commit into
heishamon:mainfrom
IgorYbema:fix-bc-assign-slots-standalone-call
May 30, 2026
Merged

Fix bc_assign_slots corrupting OP_JMP offsets for standalone event calls#899
IgorYbema merged 1 commit into
heishamon:mainfrom
IgorYbema:fix-bc-assign-slots-standalone-call

Conversation

@IgorYbema
Copy link
Copy Markdown
Member

When a standalone call (e.g. dhw_start();) appears inside an if-block, the TSEMICOLON handler resets OP_CALL.a to 0. The segment detection in bc_assign_slots only sets start when it finds a node with a > 0, so with OP_CALL.a = 0 start stayed at 0. Loop1 then scanned from byte 0 through all preceding bytecode, corrupting OP_JMP jump offsets to -1 and breaking the if-branch entirely.

Fix 1: initialise start = end after the skip-JMPs step so that when no positive-slot node is found the loops scan only the actual segment.

Fix 2: add the same OP_CALL/a==0 continue to loop2 that loop1 already had, preventing loop2 from overwriting the no-return-value sentinel with a heap slot reference.

Fixes #894

When a standalone call (e.g. dhw_start();) appears inside an if-block,
the TSEMICOLON handler resets OP_CALL.a to 0. The segment detection in
bc_assign_slots only sets `start` when it finds a node with a > 0, so
with OP_CALL.a = 0 `start` stayed at 0. Loop1 then scanned from byte 0
through all preceding bytecode, corrupting OP_JMP jump offsets to -1
and breaking the if-branch entirely.

Fix 1: initialise start = end after the skip-JMPs step so that when no
positive-slot node is found the loops scan only the actual segment.

Fix 2: add the same OP_CALL/a==0 continue to loop2 that loop1 already
had, preventing loop2 from overwriting the no-return-value sentinel with
a heap slot reference.

Fixes heishamon#894

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@IgorYbema IgorYbema merged commit 9d0e02e into heishamon:main May 30, 2026
1 check passed
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.

v4.1.4 regression: user-defined event calls (name();) inside if … then … end blocks no longer execute

1 participant