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 |
|
15 |
|
16 | let wasm;
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | function setWasmExports(wasmExports) {
|
22 | wasm = wasmExports;
|
23 | }
|
24 |
|
25 |
|
26 |
|
27 |
|
28 | let cachedInt32Memory = null;
|
29 |
|
30 |
|
31 |
|
32 |
|
33 | function getInt32Memory() {
|
34 | if (
|
35 | cachedInt32Memory === null ||
|
36 | cachedInt32Memory.buffer !== wasm.memory.buffer
|
37 | ) {
|
38 | cachedInt32Memory = new Int32Array(wasm.memory.buffer);
|
39 | }
|
40 | return cachedInt32Memory;
|
41 | }
|
42 |
|
43 |
|
44 | const State = {
|
45 | NONE: 0,
|
46 | UNWINDING: 1,
|
47 | REWINDING: 2,
|
48 | };
|
49 |
|
50 | function assertNoneState() {
|
51 | assertEquals(wasm.asyncify_get_state(), State.NONE);
|
52 | }
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | const promises = new Map();
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 | function awaitPromise(stackPtr, promise) {
|
67 | if (wasm.asyncify_get_state() === State.REWINDING) {
|
68 | wasm.asyncify_stop_rewind();
|
69 | return;
|
70 | }
|
71 |
|
72 | assertNoneState();
|
73 |
|
74 |
|
75 | assertEquals(stackPtr % 4, 0);
|
76 | getInt32Memory().set([stackPtr + 8, stackPtr + 1024], stackPtr / 4);
|
77 |
|
78 | wasm.asyncify_start_unwind(stackPtr);
|
79 |
|
80 | assert(!promises.has(stackPtr));
|
81 | promises.set(stackPtr, promise);
|
82 | }
|
83 |
|
84 |
|
85 |
|
86 |
|
87 |
|
88 |
|
89 | async function wrap(rewriter, fn, ...args) {
|
90 | const stackPtr = rewriter.asyncifyStackPtr;
|
91 |
|
92 | assertNoneState();
|
93 | let result = fn(...args);
|
94 |
|
95 | while (wasm.asyncify_get_state() === State.UNWINDING) {
|
96 | wasm.asyncify_stop_unwind();
|
97 |
|
98 | assertNoneState();
|
99 | assert(promises.has(stackPtr));
|
100 | await promises.get(stackPtr);
|
101 | promises.delete(stackPtr);
|
102 |
|
103 | assertNoneState();
|
104 | wasm.asyncify_start_rewind(stackPtr);
|
105 | result = fn();
|
106 | }
|
107 |
|
108 | assertNoneState();
|
109 | return result;
|
110 | }
|
111 |
|
112 | export { awaitPromise, setWasmExports, wrap };
|