diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index e8333e6d..00000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,96 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: CI - -# Controls when the action will run. Triggers the workflow on push or pull request -# events but only for the main branch -on: - push: - branches: [main] - pull_request: - branches: [main] - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - build: - # We'll run the tests on both Linux and OSX - strategy: - fail-fast: false - matrix: - platform: [ubuntu-latest] # , macos-latest] # Too slow :( - - # The type of runner that the job will run on - runs-on: ${{matrix.platform}} - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - - name: Setup Docker (macOS) - uses: docker-practice/actions-setup-docker@1.0.8 - if: matrix.platform == 'macos-latest' - - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v4 - with: - # We need `git log` to find git-subtree versions - fetch-depth: 0 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Setup Node.js environment - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: 'pnpm' - - - name: Install dependencies - run: pnpm install --frozen-lockfile --ignore-scripts - - - name: EMSDK cache - uses: actions/cache@v3 - with: - path: "emsdk-cache" - key: ${{ hashFiles('scripts/emcc.sh') }} - - - name: Environment info - run: | - echo $(which node) v$(node --version) - echo $(which pnpm) v$(pnpm --version) - echo $(which npx) v$(npx --version) - echo $(npx which tsc) $(npx tsc --version) - echo $(npx which tsup) $(npx tsup --version) - echo $(npx which esbuild) v$(npx esbuild --version) - - - name: Build - run: pnpm run build - - - name: Check types - run: pnpm run check:types - - - name: Check package.jsons - run: pnpm run check:packages - - - name: Test - run: pnpm run test:slow - - - name: Build tarballs - run: pnpm run tarball && du -h build/tar/* - - - name: Test release with NodeJS minimal ESModule example - run: ./scripts/smoketest-node-minimal.ts - - - name: Test release with NodeJS/Typescript example - run: ./scripts/smoketest-node.ts - - - name: Test release with create-react-app/Typescript example - run: ./scripts/smoketest-create-react-app.ts - - - name: Test release with Vite/Vue example - run: ./scripts/smoketest-vite.ts - - - name: Check lint - run: pnpm run lint - - - name: Check format - run: pnpm run check:format diff --git a/packages/quickjs-emscripten-core/src/memory.ts b/packages/quickjs-emscripten-core/src/memory.ts index 5c641765..3fc3a648 100644 --- a/packages/quickjs-emscripten-core/src/memory.ts +++ b/packages/quickjs-emscripten-core/src/memory.ts @@ -62,6 +62,15 @@ export class ModuleMemory { return new Lifetime({ typedArray, ptr }, undefined, (value) => this.module._free(value.ptr)) } + /** + * Read one pointer out of the heap through a view built at call time. WASM + * memory growth detaches any view made earlier, so a caller that suspends + * between allocating and reading must not reuse the original typed array. + */ + readPointer(ptr: number): T { + return new Int32Array(this.module.HEAPU8.buffer, ptr, 1)[0] as T + } + // TODO: shouldn't this be Uint32 instead of Int32? newMutablePointerArray( length: number, diff --git a/packages/quickjs-emscripten-core/src/runtime-asyncify.ts b/packages/quickjs-emscripten-core/src/runtime-asyncify.ts index 8d99bd75..876adf3f 100644 --- a/packages/quickjs-emscripten-core/src/runtime-asyncify.ts +++ b/packages/quickjs-emscripten-core/src/runtime-asyncify.ts @@ -2,6 +2,7 @@ import type { QuickJSAsyncEmscriptenModule, QuickJSAsyncFFI, JSContextPointer, + JSContextPointerPointer, JSRuntimePointer, } from "@jitl/quickjs-ffi-types" import { QuickJSAsyncContext } from "./context-asyncify" @@ -21,6 +22,7 @@ import type { } from "./types" import { intrinsicsToFlags } from "./types" import { Lifetime } from "./lifetime" +import type { ExecutePendingJobsResult } from "./runtime" export class QuickJSAsyncRuntime extends QuickJSRuntime { declare public context: QuickJSAsyncContext | undefined @@ -92,4 +94,27 @@ export class QuickJSAsyncRuntime extends QuickJSRuntime { public override setMaxStackSize(stackSize: number): void { return super.setMaxStackSize(stackSize) } + + /** + * Asyncified version of {@link QuickJSRuntime.executePendingJobs}. + * + * Pending jobs may call an asyncified host function, so the synchronous + * version cannot safely drive a runtime created from an Asyncify build. + */ + async executePendingJobsAsync( + maxJobsToExecute: number | void = -1, + ): Promise { + const ctxPtrOut = this.memory.newMutablePointerArray(1) + try { + const valuePtr = await this.ffi.QTS_ExecutePendingJob_MaybeAsync( + this.rt.value, + maxJobsToExecute ?? -1, + ctxPtrOut.value.ptr, + ) + const ctxPtr = this.memory.readPointer(ctxPtrOut.value.ptr) + return this.resolveExecutePendingJobsResult(valuePtr, ctxPtr) + } finally { + ctxPtrOut.dispose() + } + } } diff --git a/packages/quickjs-emscripten-core/src/runtime.ts b/packages/quickjs-emscripten-core/src/runtime.ts index e404f064..da1acdfe 100644 --- a/packages/quickjs-emscripten-core/src/runtime.ts +++ b/packages/quickjs-emscripten-core/src/runtime.ts @@ -3,6 +3,7 @@ import type { JSContextPointer, JSContextPointerPointer, JSRuntimePointer, + JSValuePointer, EitherFFI, EitherModule, } from "@jitl/quickjs-ffi-types" @@ -253,6 +254,14 @@ export class QuickJSRuntime extends UsingDisposable implements Disposable { const ctxPtr = ctxPtrOut.value.typedArray[0] as JSContextPointer ctxPtrOut.dispose() + return this.resolveExecutePendingJobsResult(valuePtr, ctxPtr) + } + + /** @private */ + protected resolveExecutePendingJobsResult( + valuePtr: JSValuePointer, + ctxPtr: JSContextPointer, + ): ExecutePendingJobsResult { if (ctxPtr === 0) { // No jobs executed. this.ffi.QTS_FreeValuePointerRuntime(this.rt.value, valuePtr) diff --git a/packages/quickjs-emscripten/src/asyncify-sync-driver.test.ts b/packages/quickjs-emscripten/src/asyncify-sync-driver.test.ts new file mode 100644 index 00000000..87efa382 --- /dev/null +++ b/packages/quickjs-emscripten/src/asyncify-sync-driver.test.ts @@ -0,0 +1,31 @@ +import { assert, describe, it } from "vitest" +import { newQuickJSAsyncWASMModuleFromVariant } from "quickjs-emscripten-core" +import { RELEASE_ASYNC } from "./variants" + +// Lives in its own file on purpose. A suspension that is reported rather than resumed leaves the +// Emscripten module suspended, and that state outlives the context it happened in — in a debug +// build the same case trips an Emscripten assertion, which aborts the module outright. Either +// way the damage is module-wide, so nothing else may share this one. +describe("asyncify synchronous job driver", () => { + it("reports a suspended job instead of returning a value it never produced", async () => { + const wasm = await newQuickJSAsyncWASMModuleFromVariant(RELEASE_ASYNC) + const vm = wasm.newContext() + + vm.newAsyncifiedFunction("get", async (pathHandle) => + vm.newString(vm.getString(pathHandle)), + ).consume((fn) => vm.setProp(vm.global, "get", fn)) + + const result = await vm.evalCodeAsync(` + (async () => { + await get("/a") + await get("/b") + })() + `) + vm.unwrapResult(result).dispose() + + // The second await resumes from a pending job and suspends into the host function. + // executePendingJobs cannot deliver that result synchronously, so it has to say so — + // silently continuing means reading a pointer the unwound call never wrote. + assert.throws(() => vm.runtime.executePendingJobs(), /returned a Promise/) + }) +}) diff --git a/packages/quickjs-emscripten/src/quickjs.test.ts b/packages/quickjs-emscripten/src/quickjs.test.ts index f603c256..1a7f85de 100644 --- a/packages/quickjs-emscripten/src/quickjs.test.ts +++ b/packages/quickjs-emscripten/src/quickjs.test.ts @@ -1224,6 +1224,34 @@ function asyncContextTests( }) describe("asyncify functions", () => { + it("supports sequential awaited host calls in one evaluation", async () => { + let asyncFunctionCalls = 0 + vm.newAsyncifiedFunction("get", async (pathHandle) => { + asyncFunctionCalls++ + const path = vm.getString(pathHandle) + return vm.newString(JSON.stringify({ path })) + }).consume((fn) => vm.setProp(vm.global, "get", fn)) + + const result = await vm.evalCodeAsync(` + (async () => { + const a = JSON.parse(await get("/a")) + const b = JSON.parse(await get("/b")) + const c = JSON.parse(await get("/c")) + return [a, b, c] + })() + `) + + const promise = vm.unwrapResult(result).consume((handle) => vm.resolvePromise(handle)) + vm.unwrapResult(await vm.runtime.executePendingJobsAsync()) + const resolved = vm.unwrapResult(await promise) + assert.deepEqual(vm.dump(resolved), [{ path: "/a" }, { path: "/b" }, { path: "/c" }]) + resolved.dispose() + assert.equal(asyncFunctionCalls, 3) + + const reuseResult = await vm.evalCodeAsync("1 + 1") + assert.equal(vm.unwrapResult(reuseResult).consume(vm.dump), 2) + }) + it("sees Promise as synchronous", async () => { let asyncFunctionCalls = 0 const asyncFn = async () => { diff --git a/packages/variant-quickjs-ng-wasmfile-debug-asyncify/src/ffi.ts b/packages/variant-quickjs-ng-wasmfile-debug-asyncify/src/ffi.ts index a154293f..aa2c3924 100644 --- a/packages/variant-quickjs-ng-wasmfile-debug-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-ng-wasmfile-debug-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -229,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -248,7 +248,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( @@ -267,7 +267,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( @@ -287,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -331,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - "number", - "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -360,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -383,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -404,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + this.module.cwrap( + "QTS_Eval", "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( diff --git a/packages/variant-quickjs-ng-wasmfile-release-asyncify/src/ffi.ts b/packages/variant-quickjs-ng-wasmfile-release-asyncify/src/ffi.ts index e89c9b41..245604cd 100644 --- a/packages/variant-quickjs-ng-wasmfile-release-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-ng-wasmfile-release-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -210,6 +210,7 @@ export class QuickJSAsyncFFI { "QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], + { async: true }, ) QTS_IsGlobalSymbol: ( @@ -228,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -239,6 +240,7 @@ export class QuickJSAsyncFFI { "QTS_ExecutePendingJob", "number", ["number", "number", "number"], + { async: true }, ) QTS_GetProp: ( @@ -246,36 +248,38 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetProp", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetProp", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_GetPropNumber: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetPropNumber", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetPropNumber", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_SetProp: ( ctx: JSContextPointer, @@ -283,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -291,12 +295,12 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, - ) => void | Promise = this.module.cwrap("QTS_SetProp", null, [ - "number", - "number", - "number", - "number", - ]) + ) => void | Promise = this.module.cwrap( + "QTS_SetProp", + null, + ["number", "number", "number", "number"], + { async: true }, + ) QTS_DefineProp: ( ctx: JSContextPointer, @@ -327,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ - "number", - "number", - "number", + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -346,6 +349,7 @@ export class QuickJSAsyncFFI { "QTS_GetOwnPropertyNames", "number", ["number", "number", "number", "number", "number"], + { async: true }, ) QTS_Call: ( @@ -355,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -364,13 +368,12 @@ export class QuickJSAsyncFFI { this_obj: JSValuePointer | JSValueConstPointer, argc: number, argv_ptrs: JSValueConstPointerPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Call", "number", [ - "number", - "number", - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Call", "number", - ]) + ["number", "number", "number", "number", "number"], + { async: true }, + ) QTS_ResolveException: (ctx: JSContextPointer, maybe_exception: JSValuePointer) => JSValuePointer = this.module.cwrap("QTS_ResolveException", "number", ["number", "number"]) @@ -379,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -389,6 +392,7 @@ export class QuickJSAsyncFFI { "QTS_Dump", "number", ["number", "number"], + { async: true }, ) QTS_Eval: ( @@ -399,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", + this.module.cwrap( + "QTS_Eval", "number", - "string", - "number", - "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( @@ -416,14 +418,12 @@ export class QuickJSAsyncFFI { filename: string, detectModule: EvalDetectModule, evalFlags: EvalFlags, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Eval", "number", - ]) + ["number", "number", "number", "string", "number", "number"], + { async: true }, + ) QTS_GetModuleNamespace: ( ctx: JSContextPointer, diff --git a/packages/variant-quickjs-singlefile-browser-debug-asyncify/src/ffi.ts b/packages/variant-quickjs-singlefile-browser-debug-asyncify/src/ffi.ts index a154293f..aa2c3924 100644 --- a/packages/variant-quickjs-singlefile-browser-debug-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-singlefile-browser-debug-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -229,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -248,7 +248,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( @@ -267,7 +267,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( @@ -287,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -331,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - "number", - "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -360,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -383,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -404,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + this.module.cwrap( + "QTS_Eval", "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( diff --git a/packages/variant-quickjs-singlefile-browser-release-asyncify/src/ffi.ts b/packages/variant-quickjs-singlefile-browser-release-asyncify/src/ffi.ts index e89c9b41..245604cd 100644 --- a/packages/variant-quickjs-singlefile-browser-release-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-singlefile-browser-release-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -210,6 +210,7 @@ export class QuickJSAsyncFFI { "QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], + { async: true }, ) QTS_IsGlobalSymbol: ( @@ -228,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -239,6 +240,7 @@ export class QuickJSAsyncFFI { "QTS_ExecutePendingJob", "number", ["number", "number", "number"], + { async: true }, ) QTS_GetProp: ( @@ -246,36 +248,38 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetProp", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetProp", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_GetPropNumber: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetPropNumber", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetPropNumber", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_SetProp: ( ctx: JSContextPointer, @@ -283,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -291,12 +295,12 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, - ) => void | Promise = this.module.cwrap("QTS_SetProp", null, [ - "number", - "number", - "number", - "number", - ]) + ) => void | Promise = this.module.cwrap( + "QTS_SetProp", + null, + ["number", "number", "number", "number"], + { async: true }, + ) QTS_DefineProp: ( ctx: JSContextPointer, @@ -327,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ - "number", - "number", - "number", + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -346,6 +349,7 @@ export class QuickJSAsyncFFI { "QTS_GetOwnPropertyNames", "number", ["number", "number", "number", "number", "number"], + { async: true }, ) QTS_Call: ( @@ -355,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -364,13 +368,12 @@ export class QuickJSAsyncFFI { this_obj: JSValuePointer | JSValueConstPointer, argc: number, argv_ptrs: JSValueConstPointerPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Call", "number", [ - "number", - "number", - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Call", "number", - ]) + ["number", "number", "number", "number", "number"], + { async: true }, + ) QTS_ResolveException: (ctx: JSContextPointer, maybe_exception: JSValuePointer) => JSValuePointer = this.module.cwrap("QTS_ResolveException", "number", ["number", "number"]) @@ -379,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -389,6 +392,7 @@ export class QuickJSAsyncFFI { "QTS_Dump", "number", ["number", "number"], + { async: true }, ) QTS_Eval: ( @@ -399,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", + this.module.cwrap( + "QTS_Eval", "number", - "string", - "number", - "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( @@ -416,14 +418,12 @@ export class QuickJSAsyncFFI { filename: string, detectModule: EvalDetectModule, evalFlags: EvalFlags, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Eval", "number", - ]) + ["number", "number", "number", "string", "number", "number"], + { async: true }, + ) QTS_GetModuleNamespace: ( ctx: JSContextPointer, diff --git a/packages/variant-quickjs-singlefile-cjs-debug-asyncify/src/ffi.ts b/packages/variant-quickjs-singlefile-cjs-debug-asyncify/src/ffi.ts index a154293f..aa2c3924 100644 --- a/packages/variant-quickjs-singlefile-cjs-debug-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-singlefile-cjs-debug-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -229,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -248,7 +248,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( @@ -267,7 +267,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( @@ -287,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -331,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - "number", - "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -360,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -383,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -404,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + this.module.cwrap( + "QTS_Eval", "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( diff --git a/packages/variant-quickjs-singlefile-cjs-release-asyncify/src/ffi.ts b/packages/variant-quickjs-singlefile-cjs-release-asyncify/src/ffi.ts index e89c9b41..245604cd 100644 --- a/packages/variant-quickjs-singlefile-cjs-release-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-singlefile-cjs-release-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -210,6 +210,7 @@ export class QuickJSAsyncFFI { "QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], + { async: true }, ) QTS_IsGlobalSymbol: ( @@ -228,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -239,6 +240,7 @@ export class QuickJSAsyncFFI { "QTS_ExecutePendingJob", "number", ["number", "number", "number"], + { async: true }, ) QTS_GetProp: ( @@ -246,36 +248,38 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetProp", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetProp", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_GetPropNumber: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetPropNumber", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetPropNumber", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_SetProp: ( ctx: JSContextPointer, @@ -283,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -291,12 +295,12 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, - ) => void | Promise = this.module.cwrap("QTS_SetProp", null, [ - "number", - "number", - "number", - "number", - ]) + ) => void | Promise = this.module.cwrap( + "QTS_SetProp", + null, + ["number", "number", "number", "number"], + { async: true }, + ) QTS_DefineProp: ( ctx: JSContextPointer, @@ -327,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ - "number", - "number", - "number", + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -346,6 +349,7 @@ export class QuickJSAsyncFFI { "QTS_GetOwnPropertyNames", "number", ["number", "number", "number", "number", "number"], + { async: true }, ) QTS_Call: ( @@ -355,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -364,13 +368,12 @@ export class QuickJSAsyncFFI { this_obj: JSValuePointer | JSValueConstPointer, argc: number, argv_ptrs: JSValueConstPointerPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Call", "number", [ - "number", - "number", - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Call", "number", - ]) + ["number", "number", "number", "number", "number"], + { async: true }, + ) QTS_ResolveException: (ctx: JSContextPointer, maybe_exception: JSValuePointer) => JSValuePointer = this.module.cwrap("QTS_ResolveException", "number", ["number", "number"]) @@ -379,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -389,6 +392,7 @@ export class QuickJSAsyncFFI { "QTS_Dump", "number", ["number", "number"], + { async: true }, ) QTS_Eval: ( @@ -399,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", + this.module.cwrap( + "QTS_Eval", "number", - "string", - "number", - "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( @@ -416,14 +418,12 @@ export class QuickJSAsyncFFI { filename: string, detectModule: EvalDetectModule, evalFlags: EvalFlags, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Eval", "number", - ]) + ["number", "number", "number", "string", "number", "number"], + { async: true }, + ) QTS_GetModuleNamespace: ( ctx: JSContextPointer, diff --git a/packages/variant-quickjs-singlefile-mjs-debug-asyncify/src/ffi.ts b/packages/variant-quickjs-singlefile-mjs-debug-asyncify/src/ffi.ts index a154293f..aa2c3924 100644 --- a/packages/variant-quickjs-singlefile-mjs-debug-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-singlefile-mjs-debug-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -229,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -248,7 +248,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( @@ -267,7 +267,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( @@ -287,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -331,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - "number", - "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -360,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -383,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -404,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + this.module.cwrap( + "QTS_Eval", "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( diff --git a/packages/variant-quickjs-singlefile-mjs-release-asyncify/src/ffi.ts b/packages/variant-quickjs-singlefile-mjs-release-asyncify/src/ffi.ts index e89c9b41..245604cd 100644 --- a/packages/variant-quickjs-singlefile-mjs-release-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-singlefile-mjs-release-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -210,6 +210,7 @@ export class QuickJSAsyncFFI { "QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], + { async: true }, ) QTS_IsGlobalSymbol: ( @@ -228,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -239,6 +240,7 @@ export class QuickJSAsyncFFI { "QTS_ExecutePendingJob", "number", ["number", "number", "number"], + { async: true }, ) QTS_GetProp: ( @@ -246,36 +248,38 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetProp", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetProp", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_GetPropNumber: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetPropNumber", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetPropNumber", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_SetProp: ( ctx: JSContextPointer, @@ -283,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -291,12 +295,12 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, - ) => void | Promise = this.module.cwrap("QTS_SetProp", null, [ - "number", - "number", - "number", - "number", - ]) + ) => void | Promise = this.module.cwrap( + "QTS_SetProp", + null, + ["number", "number", "number", "number"], + { async: true }, + ) QTS_DefineProp: ( ctx: JSContextPointer, @@ -327,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ - "number", - "number", - "number", + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -346,6 +349,7 @@ export class QuickJSAsyncFFI { "QTS_GetOwnPropertyNames", "number", ["number", "number", "number", "number", "number"], + { async: true }, ) QTS_Call: ( @@ -355,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -364,13 +368,12 @@ export class QuickJSAsyncFFI { this_obj: JSValuePointer | JSValueConstPointer, argc: number, argv_ptrs: JSValueConstPointerPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Call", "number", [ - "number", - "number", - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Call", "number", - ]) + ["number", "number", "number", "number", "number"], + { async: true }, + ) QTS_ResolveException: (ctx: JSContextPointer, maybe_exception: JSValuePointer) => JSValuePointer = this.module.cwrap("QTS_ResolveException", "number", ["number", "number"]) @@ -379,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -389,6 +392,7 @@ export class QuickJSAsyncFFI { "QTS_Dump", "number", ["number", "number"], + { async: true }, ) QTS_Eval: ( @@ -399,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", + this.module.cwrap( + "QTS_Eval", "number", - "string", - "number", - "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( @@ -416,14 +418,12 @@ export class QuickJSAsyncFFI { filename: string, detectModule: EvalDetectModule, evalFlags: EvalFlags, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Eval", "number", - ]) + ["number", "number", "number", "string", "number", "number"], + { async: true }, + ) QTS_GetModuleNamespace: ( ctx: JSContextPointer, diff --git a/packages/variant-quickjs-wasmfile-debug-asyncify/src/ffi.ts b/packages/variant-quickjs-wasmfile-debug-asyncify/src/ffi.ts index a154293f..aa2c3924 100644 --- a/packages/variant-quickjs-wasmfile-debug-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-wasmfile-debug-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -229,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -248,7 +248,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( @@ -267,7 +267,7 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( @@ -287,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -331,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - "number", - "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -360,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -383,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -404,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + this.module.cwrap( + "QTS_Eval", "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( diff --git a/packages/variant-quickjs-wasmfile-release-asyncify/src/ffi.ts b/packages/variant-quickjs-wasmfile-release-asyncify/src/ffi.ts index e89c9b41..245604cd 100644 --- a/packages/variant-quickjs-wasmfile-release-asyncify/src/ffi.ts +++ b/packages/variant-quickjs-wasmfile-release-asyncify/src/ffi.ts @@ -200,7 +200,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, value: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"]), + this.module.cwrap("QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], {}), ) QTS_GetSymbolDescriptionOrKey_MaybeAsync: ( @@ -210,6 +210,7 @@ export class QuickJSAsyncFFI { "QTS_GetSymbolDescriptionOrKey", "number", ["number", "number"], + { async: true }, ) QTS_IsGlobalSymbol: ( @@ -228,7 +229,7 @@ export class QuickJSAsyncFFI { maxJobsToExecute: number, lastJobContext: JSContextPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_ExecutePendingJob", "number", ["number", "number", "number"], {}), ) QTS_ExecutePendingJob_MaybeAsync: ( @@ -239,6 +240,7 @@ export class QuickJSAsyncFFI { "QTS_ExecutePendingJob", "number", ["number", "number", "number"], + { async: true }, ) QTS_GetProp: ( @@ -246,36 +248,38 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetProp", "number", ["number", "number", "number"], {}), ) QTS_GetProp_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetProp", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetProp", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_GetPropNumber: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"]), + this.module.cwrap("QTS_GetPropNumber", "number", ["number", "number", "number"], {}), ) QTS_GetPropNumber_MaybeAsync: ( ctx: JSContextPointer, this_val: JSValuePointer | JSValueConstPointer, prop_name: number, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_GetPropNumber", "number", [ - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_GetPropNumber", "number", - ]) + ["number", "number", "number"], + { async: true }, + ) QTS_SetProp: ( ctx: JSContextPointer, @@ -283,7 +287,7 @@ export class QuickJSAsyncFFI { prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, ) => void = assertSync( - this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"]), + this.module.cwrap("QTS_SetProp", null, ["number", "number", "number", "number"], {}), ) QTS_SetProp_MaybeAsync: ( @@ -291,12 +295,12 @@ export class QuickJSAsyncFFI { this_val: JSValuePointer | JSValueConstPointer, prop_name: JSValuePointer | JSValueConstPointer, prop_value: JSValuePointer | JSValueConstPointer, - ) => void | Promise = this.module.cwrap("QTS_SetProp", null, [ - "number", - "number", - "number", - "number", - ]) + ) => void | Promise = this.module.cwrap( + "QTS_SetProp", + null, + ["number", "number", "number", "number"], + { async: true }, + ) QTS_DefineProp: ( ctx: JSContextPointer, @@ -327,13 +331,12 @@ export class QuickJSAsyncFFI { obj: JSValuePointer | JSValueConstPointer, flags: number, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_GetOwnPropertyNames", "number", [ - "number", - "number", - "number", + this.module.cwrap( + "QTS_GetOwnPropertyNames", "number", - "number", - ]), + ["number", "number", "number", "number", "number"], + {}, + ), ) QTS_GetOwnPropertyNames_MaybeAsync: ( @@ -346,6 +349,7 @@ export class QuickJSAsyncFFI { "QTS_GetOwnPropertyNames", "number", ["number", "number", "number", "number", "number"], + { async: true }, ) QTS_Call: ( @@ -355,7 +359,7 @@ export class QuickJSAsyncFFI { argc: number, argv_ptrs: JSValueConstPointerPointer, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"]), + this.module.cwrap("QTS_Call", "number", ["number", "number", "number", "number", "number"], {}), ) QTS_Call_MaybeAsync: ( @@ -364,13 +368,12 @@ export class QuickJSAsyncFFI { this_obj: JSValuePointer | JSValueConstPointer, argc: number, argv_ptrs: JSValueConstPointerPointer, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Call", "number", [ - "number", - "number", - "number", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Call", "number", - ]) + ["number", "number", "number", "number", "number"], + { async: true }, + ) QTS_ResolveException: (ctx: JSContextPointer, maybe_exception: JSValuePointer) => JSValuePointer = this.module.cwrap("QTS_ResolveException", "number", ["number", "number"]) @@ -379,7 +382,7 @@ export class QuickJSAsyncFFI { ctx: JSContextPointer, obj: JSValuePointer | JSValueConstPointer, ) => JSBorrowedCharPointer = assertSync( - this.module.cwrap("QTS_Dump", "number", ["number", "number"]), + this.module.cwrap("QTS_Dump", "number", ["number", "number"], {}), ) QTS_Dump_MaybeAsync: ( @@ -389,6 +392,7 @@ export class QuickJSAsyncFFI { "QTS_Dump", "number", ["number", "number"], + { async: true }, ) QTS_Eval: ( @@ -399,14 +403,12 @@ export class QuickJSAsyncFFI { detectModule: EvalDetectModule, evalFlags: EvalFlags, ) => JSValuePointer = assertSync( - this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", + this.module.cwrap( + "QTS_Eval", "number", - "string", - "number", - "number", - ]), + ["number", "number", "number", "string", "number", "number"], + {}, + ), ) QTS_Eval_MaybeAsync: ( @@ -416,14 +418,12 @@ export class QuickJSAsyncFFI { filename: string, detectModule: EvalDetectModule, evalFlags: EvalFlags, - ) => JSValuePointer | Promise = this.module.cwrap("QTS_Eval", "number", [ - "number", - "number", - "number", - "string", - "number", + ) => JSValuePointer | Promise = this.module.cwrap( + "QTS_Eval", "number", - ]) + ["number", "number", "number", "string", "number", "number"], + { async: true }, + ) QTS_GetModuleNamespace: ( ctx: JSContextPointer, diff --git a/scripts/generate.ts b/scripts/generate.ts index aac0ddaf..b21a42f0 100755 --- a/scripts/generate.ts +++ b/scripts/generate.ts @@ -223,22 +223,22 @@ function renderFunction(args: { const ffiParams = JSON.stringify(params.map((param) => param.type.ffi)) const cwrapArgs = [JSON.stringify(functionName), JSON.stringify(returnType.ffi), ffiParams] - if (context.DEBUG && async) { + if (async) { // https://emscripten.org/docs/porting/asyncify.html#usage-with-ccall // Passing {async:true} to cwrap/ccall will wrap all return values in // Promise.resolve(...), even if the c code doesn't suspend and returns a // primitive value. // - // When compiled with -s ASSERTIONS=1, Emscripten will throw if the - // function suspends and {async: true} wasn't passed. - // - // However, we'd like to avoid Promise/async overhead if the call can - // return a primitive value directly. So, we compile in {async:true} - // only in DEBUG mode, where assertions are enabled. - // - // Then we rely on our type system to ensure our code supports both - // primitive and promise-wrapped return values in production mode. + // Asyncify requires this option whenever the function may suspend. Debug + // builds assert when it is missing; release builds otherwise continue in + // a corrupted state. cwrapArgs.push("{ async: true }") + } else if (forceSync) { + // Handed no options, cwrap returns the raw WebAssembly export and skips ccall entirely — + // including its check for a call that suspended. The suspension then goes unnoticed and the + // caller reads a return value the call never produced, instead of the Promise assertSync is + // here to catch. Empty options are enough to keep that check. + cwrapArgs.push("{}") } let cwrap = `this.module.cwrap(${cwrapArgs.join(", ")})`