0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-10-29 08:58:01 -04: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:
Casper Beyer 2020-12-04 02:36:13 +08:00 committed by GitHub
parent 93d9f51d16
commit de036e1f08
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 0 deletions

View file

@ -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();
}
}

View file

@ -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",
);
});