Skip to content

Refactor registers to use the stack#4263

Merged
raskad merged 2 commits intomainfrom
refactor-stack
May 31, 2025
Merged

Refactor registers to use the stack#4263
raskad merged 2 commits intomainfrom
refactor-stack

Conversation

@raskad
Copy link
Member

@raskad raskad commented May 29, 2025

This Pull Request changes the following:

  • Refactor the vm stack into a dedicated struct and implement stack access in functions that are more readable.
  • Remove the Registers data structure and store registers on the stack.

@raskad raskad added C-VM Issues and PRs related to the Boa Virtual Machine. A-Internal Changes that don't modify execution behaviour labels May 29, 2025
@github-actions
Copy link

Test262 conformance changes

Test result main count PR count difference
Total 50,254 50,254 0
Passed 46,898 47,093 +195
Ignored 1,634 1,444 -190
Failed 1,722 1,717 -5
Panics 2 0 -2
Conformance 93.32% 93.71% +0.39%
Fixed tests (195):
test/staging/set-is-subset-table-receiver-cleared.js (previously Ignored)
test/staging/set-is-subset-table-transition.js (previously Ignored)
test/staging/set-is-subset-on-set-like.js (previously Ignored)
test/staging/set-methods/set-intersection-other-is-map.js (previously Ignored)
test/staging/set-methods/set-intersection-other-is-set.js (previously Ignored)
test/staging/set-methods/set-intersect-other-is-set-like.js (previously Ignored)
test/staging/sm/Set/difference.js (previously Failed)
test/staging/sm/Set/union.js (previously Panic)
test/staging/sm/Set/symmetric-difference.js (previously Panic)
test/staging/sm/Set/is-disjoint-from.js (previously Failed)
test/staging/sm/Set/is-superset-of.js (previously Failed)
test/built-ins/Set/prototype/isSupersetOf/array-throws.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/converts-negative-zero.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/not-a-constructor.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/compares-empty-sets.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/set-like-class-order.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/allows-set-like-object.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/set-like-class-mutation.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/compares-itself.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/isSupersetOf.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/builtins.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/size-is-a-number.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/allows-set-like-class.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/keys-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/subclass-receiver-methods.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/called-with-object.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/compares-Map.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/set-like-array.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/compares-same-sets.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/require-internal-slot.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/compares-sets.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/length.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/receiver-not-set.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/name.js (previously Ignored)
test/built-ins/Set/prototype/isSupersetOf/has-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/array-throws.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/converts-negative-zero.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/not-a-constructor.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/combines-Map.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/combines-empty-sets.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/set-like-class-order.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/allows-set-like-object.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/set-like-class-mutation.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/add-not-called.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/builtins.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/subclass.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/combines-sets.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/size-is-a-number.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/subclass-symbol-species.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/symmetricDifference.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/allows-set-like-class.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/keys-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/subclass-receiver-methods.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/called-with-object.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/set-like-array.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/result-order.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/require-internal-slot.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/combines-same-sets.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/length.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/receiver-not-set.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/name.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/combines-itself.js (previously Ignored)
test/built-ins/Set/prototype/symmetricDifference/has-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/intersection/array-throws.js (previously Ignored)
test/built-ins/Set/prototype/intersection/converts-negative-zero.js (previously Ignored)
test/built-ins/Set/prototype/intersection/not-a-constructor.js (previously Ignored)
test/built-ins/Set/prototype/intersection/combines-Map.js (previously Ignored)
test/built-ins/Set/prototype/intersection/combines-empty-sets.js (previously Ignored)
test/built-ins/Set/prototype/intersection/set-like-class-order.js (previously Ignored)
test/built-ins/Set/prototype/intersection/allows-set-like-object.js (previously Ignored)
test/built-ins/Set/prototype/intersection/set-like-class-mutation.js (previously Ignored)
test/built-ins/Set/prototype/intersection/add-not-called.js (previously Ignored)
test/built-ins/Set/prototype/intersection/builtins.js (previously Ignored)
test/built-ins/Set/prototype/intersection/subclass.js (previously Ignored)
test/built-ins/Set/prototype/intersection/intersection.js (previously Ignored)
test/built-ins/Set/prototype/intersection/combines-sets.js (previously Ignored)
test/built-ins/Set/prototype/intersection/size-is-a-number.js (previously Ignored)
test/built-ins/Set/prototype/intersection/subclass-symbol-species.js (previously Ignored)
test/built-ins/Set/prototype/intersection/allows-set-like-class.js (previously Ignored)
test/built-ins/Set/prototype/intersection/keys-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/intersection/subclass-receiver-methods.js (previously Ignored)
test/built-ins/Set/prototype/intersection/called-with-object.js (previously Ignored)
test/built-ins/Set/prototype/intersection/set-like-array.js (previously Ignored)
test/built-ins/Set/prototype/intersection/result-order.js (previously Ignored)
test/built-ins/Set/prototype/intersection/require-internal-slot.js (previously Ignored)
test/built-ins/Set/prototype/intersection/combines-same-sets.js (previously Ignored)
test/built-ins/Set/prototype/intersection/length.js (previously Ignored)
test/built-ins/Set/prototype/intersection/receiver-not-set.js (previously Ignored)
test/built-ins/Set/prototype/intersection/name.js (previously Ignored)
test/built-ins/Set/prototype/intersection/combines-itself.js (previously Ignored)
test/built-ins/Set/prototype/intersection/has-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/union/array-throws.js (previously Ignored)
test/built-ins/Set/prototype/union/appends-new-values.js (previously Ignored)
test/built-ins/Set/prototype/union/converts-negative-zero.js (previously Ignored)
test/built-ins/Set/prototype/union/not-a-constructor.js (previously Ignored)
test/built-ins/Set/prototype/union/combines-Map.js (previously Ignored)
test/built-ins/Set/prototype/union/union.js (previously Ignored)
test/built-ins/Set/prototype/union/combines-empty-sets.js (previously Ignored)
test/built-ins/Set/prototype/union/set-like-class-order.js (previously Ignored)
test/built-ins/Set/prototype/union/allows-set-like-object.js (previously Ignored)
test/built-ins/Set/prototype/union/set-like-class-mutation.js (previously Ignored)
test/built-ins/Set/prototype/union/add-not-called.js (previously Ignored)
test/built-ins/Set/prototype/union/builtins.js (previously Ignored)
test/built-ins/Set/prototype/union/subclass.js (previously Ignored)
test/built-ins/Set/prototype/union/combines-sets.js (previously Ignored)
test/built-ins/Set/prototype/union/size-is-a-number.js (previously Ignored)
test/built-ins/Set/prototype/union/subclass-symbol-species.js (previously Ignored)
test/built-ins/Set/prototype/union/allows-set-like-class.js (previously Ignored)
test/built-ins/Set/prototype/union/keys-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/union/subclass-receiver-methods.js (previously Ignored)
test/built-ins/Set/prototype/union/called-with-object.js (previously Ignored)
test/built-ins/Set/prototype/union/set-like-array.js (previously Ignored)
test/built-ins/Set/prototype/union/result-order.js (previously Ignored)
test/built-ins/Set/prototype/union/require-internal-slot.js (previously Ignored)
test/built-ins/Set/prototype/union/combines-same-sets.js (previously Ignored)
test/built-ins/Set/prototype/union/length.js (previously Ignored)
test/built-ins/Set/prototype/union/receiver-not-set.js (previously Ignored)
test/built-ins/Set/prototype/union/name.js (previously Ignored)
test/built-ins/Set/prototype/union/combines-itself.js (previously Ignored)
test/built-ins/Set/prototype/union/has-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/difference/array-throws.js (previously Ignored)
test/built-ins/Set/prototype/difference/difference.js (previously Ignored)
test/built-ins/Set/prototype/difference/converts-negative-zero.js (previously Ignored)
test/built-ins/Set/prototype/difference/not-a-constructor.js (previously Ignored)
test/built-ins/Set/prototype/difference/combines-Map.js (previously Ignored)
test/built-ins/Set/prototype/difference/combines-empty-sets.js (previously Ignored)
test/built-ins/Set/prototype/difference/set-like-class-order.js (previously Ignored)
test/built-ins/Set/prototype/difference/allows-set-like-object.js (previously Ignored)
test/built-ins/Set/prototype/difference/set-like-class-mutation.js (previously Ignored)
test/built-ins/Set/prototype/difference/add-not-called.js (previously Ignored)
test/built-ins/Set/prototype/difference/builtins.js (previously Ignored)
test/built-ins/Set/prototype/difference/subclass.js (previously Ignored)
test/built-ins/Set/prototype/difference/combines-sets.js (previously Ignored)
test/built-ins/Set/prototype/difference/size-is-a-number.js (previously Ignored)
test/built-ins/Set/prototype/difference/subclass-symbol-species.js (previously Ignored)
test/built-ins/Set/prototype/difference/allows-set-like-class.js (previously Ignored)
test/built-ins/Set/prototype/difference/keys-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/difference/subclass-receiver-methods.js (previously Ignored)
test/built-ins/Set/prototype/difference/called-with-object.js (previously Ignored)
test/built-ins/Set/prototype/difference/set-like-array.js (previously Ignored)
test/built-ins/Set/prototype/difference/result-order.js (previously Ignored)
test/built-ins/Set/prototype/difference/require-internal-slot.js (previously Ignored)
test/built-ins/Set/prototype/difference/combines-same-sets.js (previously Ignored)
test/built-ins/Set/prototype/difference/length.js (previously Ignored)
test/built-ins/Set/prototype/difference/receiver-not-set.js (previously Ignored)
test/built-ins/Set/prototype/difference/name.js (previously Ignored)
test/built-ins/Set/prototype/difference/combines-itself.js (previously Ignored)
test/built-ins/Set/prototype/difference/has-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/array-throws.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/not-a-constructor.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/compares-empty-sets.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/set-like-class-order.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/allows-set-like-object.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/set-like-class-mutation.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/compares-itself.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/builtins.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/size-is-a-number.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/allows-set-like-class.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/keys-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/subclass-receiver-methods.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/called-with-object.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/compares-Map.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/set-like-array.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/compares-same-sets.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/require-internal-slot.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/compares-sets.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/length.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/receiver-not-set.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/name.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/isSubsetOf.js (previously Ignored)
test/built-ins/Set/prototype/isSubsetOf/has-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/array-throws.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/converts-negative-zero.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/not-a-constructor.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/compares-empty-sets.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/set-like-class-order.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/allows-set-like-object.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/set-like-class-mutation.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/isDisjointFrom.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/compares-itself.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/builtins.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/size-is-a-number.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/allows-set-like-class.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/keys-is-callable.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/subclass-receiver-methods.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/called-with-object.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/compares-Map.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/set-like-array.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/compares-same-sets.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/require-internal-slot.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/compares-sets.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/length.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/receiver-not-set.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/name.js (previously Ignored)
test/built-ins/Set/prototype/isDisjointFrom/has-is-callable.js (previously Ignored)

@raskad
Copy link
Member Author

raskad commented May 30, 2025

Running the benchmarks locally I noticed a bit of a performance reduction. As far as I can see, it is a result of the additional clones in some opcodes. Those add refcount increases and drop glue with refcount decreases.
When we switch to a non refcount gc, this should sort itself out.

@raskad raskad requested a review from a team May 30, 2025 02:17
Copy link
Member

@HalidOdat HalidOdat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work! Really love the refactor 🤩

@raskad raskad added this pull request to the merge queue May 31, 2025
Merged via the queue into main with commit d642599 May 31, 2025
14 checks passed
@raskad raskad deleted the refactor-stack branch May 31, 2025 23:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-Internal Changes that don't modify execution behaviour C-VM Issues and PRs related to the Boa Virtual Machine.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants