1 | import { assert, assertEquals } from "../deps/deno.land/std@0.134.0/testing/asserts.js";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | let wasm;
|
15 |
|
16 |
|
17 |
|
18 | function setWasmExports(wasmExports) {
|
19 | wasm = wasmExports;
|
20 | }
|
21 |
|
22 |
|
23 |
|
24 | let cachedInt32Memory = null;
|
25 |
|
26 |
|
27 |
|
28 | function getInt32Memory() {
|
29 | if (cachedInt32Memory === null ||
|
30 | cachedInt32Memory.buffer !== wasm.memory.buffer) {
|
31 | cachedInt32Memory = new Int32Array(wasm.memory.buffer);
|
32 | }
|
33 | return cachedInt32Memory;
|
34 | }
|
35 |
|
36 | const State = {
|
37 | NONE: 0,
|
38 | UNWINDING: 1,
|
39 | REWINDING: 2,
|
40 | };
|
41 | function assertNoneState() {
|
42 | assertEquals(wasm.asyncify_get_state(), State.NONE);
|
43 | }
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 | const promises = new Map();
|
51 |
|
52 |
|
53 |
|
54 |
|
55 | function awaitPromise(stackPtr, promise) {
|
56 | if (wasm.asyncify_get_state() === State.REWINDING) {
|
57 | wasm.asyncify_stop_rewind();
|
58 | return;
|
59 | }
|
60 | assertNoneState();
|
61 |
|
62 | assertEquals(stackPtr % 4, 0);
|
63 | getInt32Memory().set([stackPtr + 8, stackPtr + 1024], stackPtr / 4);
|
64 | wasm.asyncify_start_unwind(stackPtr);
|
65 | assert(!promises.has(stackPtr));
|
66 | promises.set(stackPtr, promise);
|
67 | }
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 | async function wrap(rewriter, fn, ...args) {
|
74 | const stackPtr = rewriter.asyncifyStackPtr;
|
75 | assertNoneState();
|
76 | let result = fn(...args);
|
77 | while (wasm.asyncify_get_state() === State.UNWINDING) {
|
78 | wasm.asyncify_stop_unwind();
|
79 | assertNoneState();
|
80 | assert(promises.has(stackPtr));
|
81 | await promises.get(stackPtr);
|
82 | promises.delete(stackPtr);
|
83 | assertNoneState();
|
84 | wasm.asyncify_start_rewind(stackPtr);
|
85 | result = fn();
|
86 | }
|
87 | assertNoneState();
|
88 | return result;
|
89 | }
|
90 | export { awaitPromise, setWasmExports, wrap };
|
91 |
|
\ | No newline at end of file |