Mentions légales du service

Skip to content

compiler: Fix emit statment when using a simple variable as argument

SHERMAN David requested to merge github/fork/vaussard/fix-simple-emit into master

Created by: vaussard

When using

emit foo bar

with bar being a 'simple' variable (i.e. we do not need to perform temporary memory allocations), the current intermediate tree looks like

EmitNode(foo) | --- MemoryVectorNode(bar)

which is wrong, as EmitNode's child nodes should only be used when temporary memory allocation is necessary. As a result, the bytecode for MemoryVectorNode will be emitted, resulting in a spurious LOAD operation:

LOAD 35 EMIT foo addr 35 size 1

This spurious LOAD can potentially currupt Aseba's stack, which in turn can have suprising effect when happening inside a subroutine call.

The fix is simple: add the MemoryVectorNode as a child of EmitNode only if it is a temporary memory allocation. Only in such case, the emitted bytecode will be correct, with balanced LOAD/STORE operations.

Merge request reports