Skip to content
Merged
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
68 changes: 68 additions & 0 deletions packages/jam/in-core/externalities/refine.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -274,4 +274,72 @@ describe("RefineExternalitiesImpl", () => {
assert.strictEqual(result.isOk, true);
});
});

describe("machineExpunge", () => {
it("should remove machine and return its program counter (0)", async () => {
const ext = createExt();
const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
const initResult = await ext.machineInit(code, tryAsProgramCounter(0));
assert.strictEqual(initResult.isOk, true);

const machineId = initResult.ok;
const result = await ext.machineExpunge(machineId);

assert.strictEqual(result.isOk, true);
// PC should be 0 since we initialized with PC=0
assert.strictEqual(result.ok, tryAsProgramCounter(0));
});

it("should remove machine and return its program counter (10)", async () => {
const ext = createExt();
const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
const initResult = await ext.machineInit(code, tryAsProgramCounter(10));
assert.strictEqual(initResult.isOk, true);

const machineId = initResult.ok;
const result = await ext.machineExpunge(machineId);

assert.strictEqual(result.isOk, true);
// PC should be 10 since we initialized with PC=10
assert.strictEqual(result.ok, tryAsProgramCounter(10));
});

it("should return NoMachineError for non-existent machine", async () => {
const ext = createExt();
const result = await ext.machineExpunge(tryAsMachineId(999));

assert.strictEqual(result.isError, true);
});

it("should not allow double expunge", async () => {
const ext = createExt();
const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
const initResult = await ext.machineInit(code, tryAsProgramCounter(0));

assert.strictEqual(initResult.isOk, true);
const machineId = initResult.ok;

const r1 = await ext.machineExpunge(machineId);
assert.strictEqual(r1.isOk, true);

const r2 = await ext.machineExpunge(machineId);
assert.strictEqual(r2.isError, true);
});
Comment thread
DrEverr marked this conversation as resolved.

it("should remove exact machine from multiple and return its program counter (10)", async () => {
const ext = createExt();
const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
await ext.machineInit(code, tryAsProgramCounter(0));
const initResult = await ext.machineInit(code, tryAsProgramCounter(10));
await ext.machineInit(code, tryAsProgramCounter(20));
assert.strictEqual(initResult.isOk, true);
Comment thread
DrEverr marked this conversation as resolved.

const machineId = initResult.ok;
const result = await ext.machineExpunge(machineId);

assert.strictEqual(result.isOk, true);
// PC should be 10 since we initialized with PC=10
assert.strictEqual(result.ok, tryAsProgramCounter(10));
});
});
});
14 changes: 11 additions & 3 deletions packages/jam/in-core/externalities/refine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,14 @@ import {
type MachineId,
type MachineResult,
type MemoryOperation,
type NoMachineError,
NoMachineError,
type PagesError,
type PeekPokeError,
type ProgramCounter,
type RefineExternalities,
SegmentExportError,
tryAsMachineId,
tryAsProgramCounter,
type ZeroVoidError,
} from "@typeberry/jam-host-calls";
import type { U64 } from "@typeberry/numbers";
Expand Down Expand Up @@ -88,8 +89,15 @@ export class RefineExternalitiesImpl implements RefineExternalities {
return this.exportedSegments;
}

machineExpunge(_machineIndex: MachineId): Promise<Result<ProgramCounter, NoMachineError>> {
throw new Error("Method not implemented.");
machineExpunge(machineIndex: MachineId): Promise<Result<ProgramCounter, NoMachineError>> {
// We just care about machineIndex
const entry = this.machines.findExact([machineIndex, undefined as unknown as IPvmInterpreter]);
if (entry === undefined) {
return Promise.resolve(Result.error(NoMachineError, () => `Machine not found (id: ${machineIndex})`));
}
const pc = tryAsProgramCounter(entry[1].getPC());
this.machines.removeOne(entry);
return Promise.resolve(Result.ok(pc));
}

machinePages(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export interface RefineExternalities {
/** Get the segments exported during this work item's refinement. */
getExportedSegments(): readonly Segment[];

/** Forget a previously started nested VM. */
/** Forget a previously started nested VM. Return its current program counter.*/
machineExpunge(machineIndex: MachineId): Promise<Result<ProgramCounter, NoMachineError>>;

/** Set given range of pages as non-accessible and re-initialize them with zeros. */
Expand Down
Loading