compiler: fix bytecode for logical assignments of properties #131
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The compiler emitted incorrect bytecode for logical assignment operations on property expressions. The generated instructions left the stack in an unclean state when the assignment condition was not fulfilled, causing a stack layout mismatch between compiler and vm, leading to undefined variable accesses and other non-deterministic behavior.
Solve this issue by rewriting the bytecode generation to yield an instruction sequence that does not leave garbage on the stack.
The implementation is not optimal yet, as an expression in the form
obj.prop ||= val
will loadobj.prop
twice. This is acceptable for now as the load operation has no side effect, but should be solved in a better way by introducing new instructions that allow for swapping stack slots, allowing the vm to operate on a copy of the loaded value.Also rewrite the corresponding test case to trigger a runtime error on code versions before this fix.
Fixes: fdc9b6a ("compiler: fix
??=
,||=
and&&=
logical assignment semantics")Signed-off-by: Jo-Philipp Wich jo@mein.io