summaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
Diffstat (limited to 'std')
-rw-r--r--std/wasi/snapshot_preview1.ts15
-rw-r--r--std/wasi/snapshot_preview1_test.ts33
2 files changed, 48 insertions, 0 deletions
diff --git a/std/wasi/snapshot_preview1.ts b/std/wasi/snapshot_preview1.ts
index 225458c66..7160bbee9 100644
--- a/std/wasi/snapshot_preview1.ts
+++ b/std/wasi/snapshot_preview1.ts
@@ -294,6 +294,7 @@ export default class Context {
fds: FileDescriptor[];
exports: Record<string, WebAssembly.ImportValue>;
+ #started: boolean;
constructor(options: ContextOptions) {
this.args = options.args ?? [];
@@ -1571,6 +1572,8 @@ export default class Context {
return ERRNO_NOSYS;
}),
};
+
+ this.#started = false;
}
/**
@@ -1585,6 +1588,12 @@ export default class Context {
* thrown.
*/
start(instance: WebAssembly.Instance) {
+ if (this.#started) {
+ throw new Error("WebAssembly.Instance has already started");
+ }
+
+ this.#started = true;
+
const { _start, _initialize, memory } = instance.exports;
if (!(memory instanceof WebAssembly.Memory)) {
@@ -1618,6 +1627,12 @@ export default class Context {
* thrown.
*/
initialize(instance: WebAssembly.Instance) {
+ if (this.#started) {
+ throw new Error("WebAssembly.Instance has already started");
+ }
+
+ this.#started = true;
+
const { _start, _initialize, memory } = instance.exports;
if (!(memory instanceof WebAssembly.Memory)) {
diff --git a/std/wasi/snapshot_preview1_test.ts b/std/wasi/snapshot_preview1_test.ts
index f102f083d..55982545f 100644
--- a/std/wasi/snapshot_preview1_test.ts
+++ b/std/wasi/snapshot_preview1_test.ts
@@ -198,6 +198,23 @@ Deno.test("context_start", function () {
assert(err instanceof ExitStatus);
assertEquals(err.code, 0);
}
+
+ assertThrows(
+ () => {
+ const context = new Context({});
+ context.start({
+ exports: {
+ memory: new WebAssembly.Memory({ initial: 1 }),
+ _start() {},
+ },
+ });
+ context.start({
+ exports: {},
+ });
+ },
+ Error,
+ "WebAssembly.Instance has already started",
+ );
});
Deno.test("context_initialize", function () {
@@ -240,4 +257,20 @@ Deno.test("context_initialize", function () {
TypeError,
"export _initialize must be a function",
);
+ assertThrows(
+ () => {
+ const context = new Context({});
+ context.initialize({
+ exports: {
+ memory: new WebAssembly.Memory({ initial: 1 }),
+ _initialize() {},
+ },
+ });
+ context.initialize({
+ exports: {},
+ });
+ },
+ Error,
+ "WebAssembly.Instance has already started",
+ );
});