Skip to content
Merged
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
25 changes: 13 additions & 12 deletions packages/compiler/runtime/ohmRuntime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,9 +177,13 @@ function allocBindingsChunk(prev: i32): i32 {
return ptr;
}

@inline function chunkNext(chunk: i32): i32 {
return load<i32>(<usize>(chunk + 4));
}

// Called when current chunk is full.
export function bindingsAdvanceChunk(): void {
let next = load<i32>(<usize>(bindingsChunk + 4));
let next = chunkNext(bindingsChunk);
if (next === 0) {
next = allocBindingsChunk(bindingsChunk);
}
Expand Down Expand Up @@ -207,12 +211,6 @@ export function bindingsAdvanceChunk(): void {
return load<i32>(<usize>(chunk + BINDINGS_CHUNK_HEADER + (idx << 2)));
}

// Write a binding at a specific chunk + index position.
@inline function bindingsWrite(chunk: i32, idx: i32, value: i32): void {
if (!useChunkedBindings) { unchecked(bindingsArr[idx] = value); return; }
store<i32>(<usize>(chunk + BINDINGS_CHUNK_HEADER + (idx << 2)), value);
}

@inline function memoEntryForFailure(failureOffset: i32): MemoEntry {
return (failureOffset << 1) | MEMO_FAILURE_FLAG;
}
Expand Down Expand Up @@ -366,7 +364,10 @@ export function evalSpacesFull(targetPos: i32): i32 {
@inline function restoreBindings(chunk: i32, idx: i32): void {
bindingsChunk = chunk;
bindingsIdx = idx;
if (!useChunkedBindings) bindingsArr.length = idx;
if (!useChunkedBindings) {
bindingsChunk = 0;
bindingsArr.length = idx;
}
}

function resetParsingState(): void {
Expand Down Expand Up @@ -656,7 +657,7 @@ export function newTerminalNode(startIdx: i32, endIdx: i32): i32 {
store<i32>(<usize>(ptr + CST_NODE_OVERHEAD + i * 4), bindingsRead(chunk, idx));
idx++;
if (useChunkedBindings && idx === BINDINGS_CHUNK_CAPACITY) {
chunk = load<i32>(<usize>(chunk + 4)); // next
chunk = chunkNext(chunk);
idx = 0;
}
}
Expand Down Expand Up @@ -702,7 +703,7 @@ export function getBindingsLength(): i32 {
let chunk = bindingsFirstChunk;
while (chunk !== bindingsChunk) {
count += BINDINGS_CHUNK_CAPACITY;
chunk = load<i32>(<usize>(chunk + 4)); // next
chunk = chunkNext(chunk);
}
return count + bindingsIdx;
}
Expand All @@ -716,7 +717,7 @@ export function setBindingsLength(len: i32): void {
// Walk from first chunk to find the right chunk+idx.
let chunk = bindingsFirstChunk;
while (len >= BINDINGS_CHUNK_CAPACITY) {
chunk = load<i32>(<usize>(chunk + 4)); // next
chunk = chunkNext(chunk);
len -= BINDINGS_CHUNK_CAPACITY;
}
bindingsChunk = chunk;
Expand All @@ -727,7 +728,7 @@ export function bindingsAt(i: i32): i32 {
if (!useChunkedBindings) return unchecked(bindingsArr[i]);
let chunk = bindingsFirstChunk;
while (i >= BINDINGS_CHUNK_CAPACITY) {
chunk = load<i32>(<usize>(chunk + 4)); // next
chunk = chunkNext(chunk);
i -= BINDINGS_CHUNK_CAPACITY;
}
return bindingsRead(chunk, i);
Expand Down
Loading