mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
fix(std/wasi): disallow multiple starts (#8712)
This commit is contained in:
parent
c5ccbf3699
commit
77b2bc3bc1
2 changed files with 48 additions and 0 deletions
|
@ -294,6 +294,7 @@ export default class Context {
|
||||||
fds: FileDescriptor[];
|
fds: FileDescriptor[];
|
||||||
|
|
||||||
exports: Record<string, WebAssembly.ImportValue>;
|
exports: Record<string, WebAssembly.ImportValue>;
|
||||||
|
#started: boolean;
|
||||||
|
|
||||||
constructor(options: ContextOptions) {
|
constructor(options: ContextOptions) {
|
||||||
this.args = options.args ?? [];
|
this.args = options.args ?? [];
|
||||||
|
@ -1571,6 +1572,8 @@ export default class Context {
|
||||||
return ERRNO_NOSYS;
|
return ERRNO_NOSYS;
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.#started = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1585,6 +1588,12 @@ export default class Context {
|
||||||
* thrown.
|
* thrown.
|
||||||
*/
|
*/
|
||||||
start(instance: WebAssembly.Instance) {
|
start(instance: WebAssembly.Instance) {
|
||||||
|
if (this.#started) {
|
||||||
|
throw new Error("WebAssembly.Instance has already started");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.#started = true;
|
||||||
|
|
||||||
const { _start, _initialize, memory } = instance.exports;
|
const { _start, _initialize, memory } = instance.exports;
|
||||||
|
|
||||||
if (!(memory instanceof WebAssembly.Memory)) {
|
if (!(memory instanceof WebAssembly.Memory)) {
|
||||||
|
@ -1618,6 +1627,12 @@ export default class Context {
|
||||||
* thrown.
|
* thrown.
|
||||||
*/
|
*/
|
||||||
initialize(instance: WebAssembly.Instance) {
|
initialize(instance: WebAssembly.Instance) {
|
||||||
|
if (this.#started) {
|
||||||
|
throw new Error("WebAssembly.Instance has already started");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.#started = true;
|
||||||
|
|
||||||
const { _start, _initialize, memory } = instance.exports;
|
const { _start, _initialize, memory } = instance.exports;
|
||||||
|
|
||||||
if (!(memory instanceof WebAssembly.Memory)) {
|
if (!(memory instanceof WebAssembly.Memory)) {
|
||||||
|
|
|
@ -198,6 +198,23 @@ Deno.test("context_start", function () {
|
||||||
assert(err instanceof ExitStatus);
|
assert(err instanceof ExitStatus);
|
||||||
assertEquals(err.code, 0);
|
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 () {
|
Deno.test("context_initialize", function () {
|
||||||
|
@ -240,4 +257,20 @@ Deno.test("context_initialize", function () {
|
||||||
TypeError,
|
TypeError,
|
||||||
"export _initialize must be a function",
|
"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",
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue