From 27185223cfaac1800e15f831109a86cd819c0d77 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Wed, 9 Sep 2026 18:46:19 -0400 Subject: [PATCH 1/2] Fix LowLevelRegisters tuple order and drop unused register helpers Split out of nvp/simplify-some-vm-hot-paths. Co-Authored-By: Claude Fable 5.1 --- packages/@glimmer/runtime/lib/vm/low-level.ts | 19 ++--------------- packages/@glimmer/runtime/lib/vm/stack.ts | 21 +++---------------- 2 files changed, 5 insertions(+), 35 deletions(-) diff --git a/packages/@glimmer/runtime/lib/vm/low-level.ts b/packages/@glimmer/runtime/lib/vm/low-level.ts index a817f25548a..19bca0fc635 100644 --- a/packages/@glimmer/runtime/lib/vm/low-level.ts +++ b/packages/@glimmer/runtime/lib/vm/low-level.ts @@ -23,23 +23,8 @@ import type { VM } from './append'; import '../bootstrap'; import { APPEND_OPCODES } from '../opcodes'; -export type LowLevelRegisters = [$pc: number, $ra: number, $sp: number, $fp: number]; - -export function initializeRegisters(): LowLevelRegisters { - return [0, -1, 0, 0]; -} - -export function restoreRegisters(pc: number, sp: number): LowLevelRegisters { - return [pc, -1, sp, 0]; -} - -export function initializeRegistersWithSP(sp: number): LowLevelRegisters { - return [0, -1, sp, 0]; -} - -export function initializeRegistersWithPC(pc: number): LowLevelRegisters { - return [pc, -1, 0, 0]; -} +// Positional order matches the register constants: $pc=0, $ra=1, $fp=2, $sp=3. +export type LowLevelRegisters = [$pc: number, $ra: number, $fp: number, $sp: number]; export interface VmStack { readonly registers: LowLevelRegisters; diff --git a/packages/@glimmer/runtime/lib/vm/stack.ts b/packages/@glimmer/runtime/lib/vm/stack.ts index 9d736c28a64..cf88e2c309e 100644 --- a/packages/@glimmer/runtime/lib/vm/stack.ts +++ b/packages/@glimmer/runtime/lib/vm/stack.ts @@ -1,11 +1,9 @@ import assert from '@glimmer/debug-util/lib/assert'; import { LOCAL_DEBUG } from '@glimmer/local-debug-flags'; -import { $fp, $pc, $sp } from '@glimmer/vm/lib/registers'; +import { $fp, $sp } from '@glimmer/vm/lib/registers'; import type { LowLevelRegisters } from './low-level'; -import { initializeRegistersWithSP } from './low-level'; - export interface EvaluationStack { readonly registers: LowLevelRegisters; @@ -25,15 +23,10 @@ export interface EvaluationStack { export default class EvaluationStackImpl implements EvaluationStack { static restore(snapshot: unknown[], pc: number): EvaluationStackImpl { - const stack = new this(snapshot.slice(), initializeRegistersWithSP(snapshot.length - 1)); - assert(typeof pc === 'number', 'pc is a number'); - stack.registers[$pc] = pc; - stack.registers[$sp] = snapshot.length - 1; - stack.registers[$fp] = -1; - - return stack; + // [$pc, $ra, $fp, $sp] + return new this(snapshot.slice(), [pc, -1, -1, snapshot.length - 1]); } readonly registers: LowLevelRegisters; @@ -100,12 +93,4 @@ export default class EvaluationStackImpl implements EvaluationStack { } declare snapshot?: (this: EvaluationStackImpl) => unknown[]; - - static { - if (LOCAL_DEBUG) { - EvaluationStackImpl.prototype.snapshot = function () { - return this.stack.slice(this.registers[$fp], this.registers[$sp] + 1); - }; - } - } } From 7186100856597c89e5e26e05ea5be4053f66d2ed Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 21 Sep 2026 14:36:46 -0400 Subject: [PATCH 2/2] Apply suggestion from @NullVoxPopuli --- packages/@glimmer/runtime/lib/vm/low-level.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/@glimmer/runtime/lib/vm/low-level.ts b/packages/@glimmer/runtime/lib/vm/low-level.ts index 19bca0fc635..9a6add0eb6c 100644 --- a/packages/@glimmer/runtime/lib/vm/low-level.ts +++ b/packages/@glimmer/runtime/lib/vm/low-level.ts @@ -23,7 +23,6 @@ import type { VM } from './append'; import '../bootstrap'; import { APPEND_OPCODES } from '../opcodes'; -// Positional order matches the register constants: $pc=0, $ra=1, $fp=2, $sp=3. export type LowLevelRegisters = [$pc: number, $ra: number, $fp: number, $sp: number]; export interface VmStack {