Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 1 addition & 17 deletions packages/@glimmer/runtime/lib/vm/low-level.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,23 +23,7 @@ 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];
}
export type LowLevelRegisters = [$pc: number, $ra: number, $fp: number, $sp: number];

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

labels on an array type don't materr all that much, but they didn't originally agree with the index-order in lib/vm/stack (even though the original type matched what the removed (unused) helpers were doin'

the source of truth for what these labeled indicies are: vm/lib/register.ts (also imported in lib/vm/stack)

pc = 0
ra = 1
fp = 2
sp = 3

(so the code on the left was always wrong) 🙈


export interface VmStack {
readonly registers: LowLevelRegisters;
Expand Down
21 changes: 3 additions & 18 deletions packages/@glimmer/runtime/lib/vm/stack.ts
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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;
Expand Down Expand Up @@ -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);
};
}
}
}
Loading