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