mirror of
https://github.com/denoland/deno.git
synced 2024-12-23 07:44:48 -05:00
feat(std/wasi): add support for initializing reactors (#8603)
This adds another entry point to Context called initialize for spinning up style modules. Reactors are modules that don't have a main function and basically run forever in the background.
This commit is contained in:
parent
93d9f51d16
commit
de036e1f08
2 changed files with 75 additions and 0 deletions
|
@ -1588,4 +1588,37 @@ export default class Context {
|
|||
|
||||
_start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to initialize instance as a reactor by invoking its _initialize() export.
|
||||
*
|
||||
* If instance contains a _start() export, then an exception is thrown.
|
||||
*
|
||||
* The instance must also have a WebAssembly.Memory export named "memory"
|
||||
* which will be used as the address space, if it does not an error will be
|
||||
* thrown.
|
||||
*/
|
||||
initialize(instance: WebAssembly.Instance) {
|
||||
const { _start, _initialize, memory } = instance.exports;
|
||||
|
||||
if (!(memory instanceof WebAssembly.Memory)) {
|
||||
throw new TypeError("WebAsembly.instance must provide a memory export");
|
||||
}
|
||||
|
||||
this.memory = memory;
|
||||
|
||||
if (typeof _start == "function") {
|
||||
throw new TypeError(
|
||||
"WebAssembly.Instance export _start must not be a function",
|
||||
);
|
||||
}
|
||||
|
||||
if (typeof _initialize != "function") {
|
||||
throw new TypeError(
|
||||
"WebAsembly.instance export _initialize must be a function",
|
||||
);
|
||||
}
|
||||
|
||||
_initialize();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -180,3 +180,45 @@ Deno.test("context_start", function () {
|
|||
"export _start must be a function",
|
||||
);
|
||||
});
|
||||
|
||||
Deno.test("context_initialize", function () {
|
||||
assertThrows(
|
||||
() => {
|
||||
const context = new Context({});
|
||||
context.initialize({
|
||||
exports: {
|
||||
_initialize() {},
|
||||
},
|
||||
});
|
||||
},
|
||||
TypeError,
|
||||
"must provide a memory export",
|
||||
);
|
||||
|
||||
assertThrows(
|
||||
() => {
|
||||
const context = new Context({});
|
||||
context.initialize({
|
||||
exports: {
|
||||
_start() {},
|
||||
memory: new WebAssembly.Memory({ initial: 1 }),
|
||||
},
|
||||
});
|
||||
},
|
||||
TypeError,
|
||||
"export _start must not be a function",
|
||||
);
|
||||
|
||||
assertThrows(
|
||||
() => {
|
||||
const context = new Context({});
|
||||
context.initialize({
|
||||
exports: {
|
||||
memory: new WebAssembly.Memory({ initial: 1 }),
|
||||
},
|
||||
});
|
||||
},
|
||||
TypeError,
|
||||
"export _initialize must be a function",
|
||||
);
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue