jseption 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +56 -4
  2. package/dist/atoms.d.ts +1 -0
  3. package/dist/atoms.js +2 -1
  4. package/dist/atoms.js.map +1 -1
  5. package/dist/builtins/base64.d.ts +14 -0
  6. package/dist/builtins/base64.js +219 -0
  7. package/dist/builtins/base64.js.map +1 -0
  8. package/dist/builtins/bigint.js +3 -3
  9. package/dist/builtins/bigint.js.map +1 -1
  10. package/dist/builtins/date.d.ts +1 -0
  11. package/dist/builtins/date.js +26 -12
  12. package/dist/builtins/date.js.map +1 -1
  13. package/dist/builtins/error.js +9 -0
  14. package/dist/builtins/error.js.map +1 -1
  15. package/dist/builtins/float16.d.ts +3 -0
  16. package/dist/builtins/float16.js +69 -0
  17. package/dist/builtins/float16.js.map +1 -0
  18. package/dist/builtins/function.js +2 -2
  19. package/dist/builtins/index.js +9 -6
  20. package/dist/builtins/index.js.map +1 -1
  21. package/dist/builtins/iterator.d.ts +2 -0
  22. package/dist/builtins/iterator.js +624 -0
  23. package/dist/builtins/iterator.js.map +1 -0
  24. package/dist/builtins/json.d.ts +13 -1
  25. package/dist/builtins/json.js +283 -211
  26. package/dist/builtins/json.js.map +1 -1
  27. package/dist/builtins/mapset.js +365 -6
  28. package/dist/builtins/mapset.js.map +1 -1
  29. package/dist/builtins/math.js +203 -3
  30. package/dist/builtins/math.js.map +1 -1
  31. package/dist/builtins/native.js +6 -6
  32. package/dist/builtins/object.js +9 -2
  33. package/dist/builtins/object.js.map +1 -1
  34. package/dist/builtins/promise.js +31 -11
  35. package/dist/builtins/promise.js.map +1 -1
  36. package/dist/builtins/proxy.js +2 -2
  37. package/dist/builtins/reflect.js +6 -2
  38. package/dist/builtins/reflect.js.map +1 -1
  39. package/dist/builtins/regexp.js +74 -3
  40. package/dist/builtins/regexp.js.map +1 -1
  41. package/dist/builtins/string.js +1 -1
  42. package/dist/builtins/symbol.js +1 -1
  43. package/dist/builtins/symbol.js.map +1 -1
  44. package/dist/builtins/typedarray.d.ts +1 -0
  45. package/dist/builtins/typedarray.js +302 -32
  46. package/dist/builtins/typedarray.js.map +1 -1
  47. package/dist/builtins/weakref.js +7 -7
  48. package/dist/embed.d.ts +5 -0
  49. package/dist/embed.js +47 -15
  50. package/dist/embed.js.map +1 -1
  51. package/dist/interpreter.js +15 -14
  52. package/dist/interpreter.js.map +1 -1
  53. package/dist/jit.d.ts +1 -0
  54. package/dist/jit.js +51 -13
  55. package/dist/jit.js.map +1 -1
  56. package/dist/jit_hook.d.ts +1 -0
  57. package/dist/jit_hook.js.map +1 -1
  58. package/dist/jit_runtime.d.ts +1 -1
  59. package/dist/jit_runtime.js +6 -6
  60. package/dist/jit_runtime.js.map +1 -1
  61. package/dist/jit_stack.d.ts +1 -0
  62. package/dist/jit_stack.js +2 -1
  63. package/dist/jit_stack.js.map +1 -1
  64. package/dist/jseption.d.ts +4 -0
  65. package/dist/jseption.js +2 -0
  66. package/dist/jseption.js.map +1 -1
  67. package/dist/membrane.d.ts +16 -0
  68. package/dist/membrane.js +576 -0
  69. package/dist/membrane.js.map +1 -0
  70. package/dist/module.js +5 -3
  71. package/dist/module.js.map +1 -1
  72. package/dist/parser.js +26 -9
  73. package/dist/parser.js.map +1 -1
  74. package/dist/print.d.ts +12 -0
  75. package/dist/print.js +494 -0
  76. package/dist/print.js.map +1 -0
  77. package/dist/qjs.js +13 -10
  78. package/dist/qjs.js.map +1 -1
  79. package/dist/quickjs.d.ts +8 -0
  80. package/dist/quickjs.js +132 -53
  81. package/dist/quickjs.js.map +1 -1
  82. package/dist/std.d.ts +4 -2
  83. package/dist/std.js +42 -8
  84. package/dist/std.js.map +1 -1
  85. package/dist/values.d.ts +31 -27
  86. package/dist/values.js.map +1 -1
  87. package/dist/version.d.ts +1 -1
  88. package/dist/version.js +1 -1
  89. package/dist/version.js.map +1 -1
  90. package/package.json +1 -1
package/dist/qjs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"qjs.js","sourceRoot":"","sources":["../src/qjs.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/*\n * qjs: command line interpreter (port of qjs.c)\n */\nimport { JS_NewRuntime, JS_NewContext, JS_Eval, JS_IsException, JS_EVAL_TYPE_GLOBAL, JS_EVAL_TYPE_MODULE, JS_EVAL_FLAG_STRICT,\n JS_EVAL_FLAG_COMPILE_ONLY, JS_EVAL_FLAG_STRIP_TYPES, JS_EVAL_FLAG_JSX, JS_IsUndefined, JS_ToString, JS_GetFunctionData, JS_SetMaxStackSize, formatException,\n JS_GetException, JSContext, JSValue, JSModuleDef, JS_SetModuleLoader, JS_ImportModule, JS_EvalModule, JS_DetectModule,\n JS_PromiseState, JS_PromiseResult, JSPromiseState } from './jseption.ts';\nimport { js_std_add_helpers, js_std_loop, js_std_dump_error, js_std_module_loader } from './std.ts';\nimport { dump_byte_code } from './dump.ts';\nimport { js_module_type_of, js_module_type_flags } from './module.ts';\nimport { readFileSync } from 'node:fs';\nimport { resolve as path_resolve } from 'node:path';\n\nfunction help(): never {\n console.log(`usage: qjs [options] [file [args]]\n-h --help list options\n-e --eval EXPR evaluate EXPR\n-i --interactive go to interactive mode\n-d --dump dump the bytecode of the evaluated code\n-m --module evaluate the file and -e as ES modules (.mjs, .mts, .jsx\n and .tsx files always are; .js and .ts files are when they\n start with import or export)\n --script evaluate the file as a script\n --strict evaluate in strict mode\n --strip-types run -e and the REPL as TypeScript (type syntax is stripped;\n .ts, .mts, .cts and .tsx files always are)\n --jsx compile JSX in -e and the REPL (.jsx and .tsx files always\n are)\n-q --quit just instantiate the interpreter and quit`);\n process.exit(1);\n}\n\nfunction dump_buf(ctx: JSContext, buf: string, filename: string, eval_flags: number): number {\n const fn = JS_Eval(ctx, buf, filename, eval_flags | JS_EVAL_FLAG_COMPILE_ONLY);\n if (JS_IsException(fn)) { js_std_dump_error(ctx); return -1; }\n const b = fn instanceof JSModuleDef ? fn.func_bytecode! : JS_GetFunctionData(fn)!.function_bytecode;\n process.stdout.write(dump_byte_code(ctx, b));\n return 0;\n}\n\nfunction eval_buf(ctx: JSContext, buf: string, filename: string, eval_flags: number, dump: boolean): number {\n if (dump && dump_buf(ctx, buf, filename, eval_flags)) return -1;\n const val = JS_Eval(ctx, buf, filename, eval_flags);\n if (JS_IsException(val)) {\n js_std_dump_error(ctx);\n return -1;\n }\n return 0;\n}\n\n/* module evaluations whose promise is checked once the event loop is idle */\nconst module_promises: JSValue[] = [];\n\n/* report a module that failed to load, link or evaluate: 0, or -1 */\nfunction check_module(ctx: JSContext, p: JSValue): number {\n if (JS_PromiseState(ctx, p) !== JSPromiseState.REJECTED) return 0;\n process.stderr.write(formatException(ctx, JS_PromiseResult(ctx, p)) + '\\n');\n return -1;\n}\n\n/* is `filename` (with source `buf`) a module? */\nfunction is_module_file(filename: string, buf: string, force: 'module' | 'script' | null): boolean {\n if (force !== null) return force === 'module';\n if (/\\.m[jt]s$/.test(filename) || /\\.[jt]sx$/.test(filename)) return true;\n if (/\\.c[jt]s$/.test(filename)) return false;\n return JS_DetectModule(buf);\n}\n\nasync function repl(ctx: JSContext, eval_flags: number): Promise<void> {\n const readline = await import('readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: 'qjs > ' });\n rl.prompt();\n for await (const line of rl) {\n if (line.trim() === '') { rl.prompt(); continue; }\n const val = JS_Eval(ctx, line, '<repl>', JS_EVAL_TYPE_GLOBAL | eval_flags);\n if (JS_IsException(val)) {\n js_std_dump_error(ctx);\n } else if (!JS_IsUndefined(val)) {\n const s = JS_ToString(ctx, val);\n if (JS_IsException(s)) js_std_dump_error(ctx);\n else console.log(s);\n }\n await js_std_loop(ctx);\n rl.prompt();\n }\n}\n\nasync function main(): Promise<number> {\n const argv = process.argv.slice(2);\n let optind = 0;\n const expr: string[] = [];\n let interactive = false, dump = false, strict = false, quit = false, strip_types = false, jsx = false;\n let force: 'module' | 'script' | null = null;\n while (optind < argv.length && argv[optind].startsWith('-')) {\n const arg = argv[optind++];\n if (arg === '-h' || arg === '--help') help();\n else if (arg === '-e' || arg === '--eval') { if (optind >= argv.length) help(); expr.push(argv[optind++]); }\n else if (arg === '-i' || arg === '--interactive') interactive = true;\n else if (arg === '-d' || arg === '--dump') dump = true;\n else if (arg === '--strict') strict = true;\n else if (arg === '-m' || arg === '--module') force = 'module';\n else if (arg === '--script') force = 'script';\n else if (arg === '--strip-types') strip_types = true;\n else if (arg === '--jsx') jsx = true;\n else if (arg === '-q' || arg === '--quit') quit = true;\n else if (arg === '--') break;\n else { console.error(`qjs: unknown option '${arg}'`); help(); }\n }\n const rt = JS_NewRuntime();\n JS_SetMaxStackSize(rt, 1000);\n const ctx = JS_NewContext(rt);\n js_std_add_helpers(ctx, argv.slice(optind));\n JS_SetModuleLoader(rt, js_std_module_loader());\n if (quit) return 0;\n const lang_flags = (strip_types ? JS_EVAL_FLAG_STRIP_TYPES : 0) | (jsx ? JS_EVAL_FLAG_JSX : 0);\n const eval_flags = JS_EVAL_TYPE_GLOBAL | (strict ? JS_EVAL_FLAG_STRICT : 0) | lang_flags;\n let status = 0;\n for (const e of expr) {\n if (force === 'module') {\n const name = path_resolve('<cmdline>');\n if (dump && dump_buf(ctx, e, name, (eval_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE)) { status = 1; continue; }\n module_promises.push(JS_EvalModule(ctx, e, name, eval_flags));\n } else if (eval_buf(ctx, e, '<cmdline>', eval_flags, dump)) {\n status = 1;\n }\n }\n if (optind < argv.length) {\n const filename = argv[optind];\n let buf: string;\n try {\n buf = readFileSync(filename, 'utf8');\n } catch (e) {\n console.error(`qjs: cannot load '${filename}': ${(e as Error).message}`);\n return 1;\n }\n /* TypeScript files: erasable type syntax is stripped (Node's strip-only mode); JSX and TSX\n files: JSX is compiled. Modules get the same flags from the loader */\n const file_flags = eval_flags | js_module_type_flags(js_module_type_of(filename));\n if (is_module_file(filename, buf, force)) {\n /* through the loader, so that the module's id is its absolute path and import.meta.url\n its file: URL */\n const id = path_resolve(filename);\n if (dump && dump_buf(ctx, buf, id, (file_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE)) status = 1;\n else module_promises.push(JS_ImportModule(ctx, id));\n } else if (eval_buf(ctx, buf, filename, file_flags, dump)) {\n status = 1;\n }\n } else if (expr.length === 0) {\n interactive = true;\n }\n await js_std_loop(ctx);\n for (const p of module_promises) if (check_module(ctx, p)) status = 1;\n if (interactive) await repl(ctx, lang_flags);\n return status;\n}\n\nmain().then(code => process.exit(code), e => { console.error(e); process.exit(2); });\n"]}
1
+ {"version":3,"file":"qjs.js","sourceRoot":"","sources":["../src/qjs.ts"],"names":[],"mappings":";AACA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAC3H,yBAAyB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,cAAc,EAAe,kBAAkB,EAAE,kBAAkB,EACrG,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EACrH,eAAe,EAAE,gBAAgB,EAAkB,iCAAiC,EAAE,MAAM,eAAe,CAAC;AAC9G,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EACnG,gCAAgC,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,WAAW,CAAC;AAEpD,SAAS,IAAI;IACX,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;kEAeoD,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAc,EAAE,GAAW,EAAE,QAAgB,EAAE,UAAkB;IACjF,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,GAAG,yBAAyB,CAAC,CAAC;IAC/E,IAAI,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;QAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC,CAAC;IAAC,CAAC;IAC9D,MAAM,CAAC,GAAG,EAAE,YAAY,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,aAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAE,CAAC,iBAAiB,CAAC;IACpG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,QAAQ,CAAC,GAAc,EAAE,GAAW,EAAE,QAAgB,EAAE,UAAkB,EAAE,IAAa;IAChG,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACpD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,6EAA6E;AAC7E,MAAM,eAAe,GAAc,EAAE,CAAC;AAEtC,qEAAqE;AACrE,SAAS,YAAY,CAAC,GAAc,EAAE,CAAU;IAC9C,IAAI,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,oCAA4B;QAAE,OAAO,CAAC,CAAC;IAClE,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,iDAAiD;AACjD,SAAS,cAAc,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAiC;IACtF,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,KAAK,QAAQ,CAAC;IAC9C,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,GAAc,EAAE,UAAkB;IACpD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxG,EAAE,CAAC,MAAM,EAAE,CAAC;IACZ,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,mBAAmB,GAAG,UAAU,CAAC,CAAC;QAC3E,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACvB,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,WAAW,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,GAAG,KAAK,CAAC;IACtG,IAAI,gCAAgC,GAAG,IAAI,CAAC;IAC5C,IAAI,KAAK,GAA+B,IAAI,CAAC;IAC7C,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,EAAE,CAAC;aACxC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAAC,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;aACvG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,eAAe;YAAE,WAAW,GAAG,IAAI,CAAC;aAChE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,GAAG,IAAI,CAAC;aAClD,IAAI,GAAG,KAAK,UAAU;YAAE,MAAM,GAAG,IAAI,CAAC;aACtC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,UAAU;YAAE,KAAK,GAAG,QAAQ,CAAC;aACzD,IAAI,GAAG,KAAK,UAAU;YAAE,KAAK,GAAG,QAAQ,CAAC;aACzC,IAAI,GAAG,KAAK,eAAe;YAAE,WAAW,GAAG,IAAI,CAAC;aAChD,IAAI,GAAG,KAAK,OAAO;YAAE,GAAG,GAAG,IAAI,CAAC;aAChC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,GAAG,IAAI,CAAC;aAClD,IAAI,GAAG,KAAK,0BAA0B;YAAE,gCAAgC,GAAG,KAAK,CAAC;aACjF,IAAI,GAAG,KAAK,IAAI;YAAE,MAAM;aACxB,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAC;YAAC,IAAI,EAAE,CAAC;QAAC,CAAC;IACjE,CAAC;IACD,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,kBAAkB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;IAC9B,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,IAAI,gCAAgC;QAAE,iCAAiC,CAAC,EAAE,EAAE,gCAAgC,EAAE,IAAI,CAAC,CAAC;IACpH,kBAAkB,CAAC,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC/C,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC;IACnB,MAAM,UAAU,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,UAAU,GAAG,mBAAmB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IACzF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YACvC,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,GAAG,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC,EAAE,CAAC;gBAAC,MAAM,GAAG,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YACxH,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAChE,CAAC;aAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,qBAAqB,QAAQ,MAAO,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,CAAC;QACX,CAAC;QACD;gFACwE;QACxE,MAAM,UAAU,GAAG,UAAU,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClF,IAAI,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YACzC;+BACmB;YACnB,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,UAAU,GAAG,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;gBAAE,MAAM,GAAG,CAAC,CAAC;;gBACrG,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,GAAG,CAAC,CAAC;QACb,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,MAAM,WAAW,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,eAAe;QAAE,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;YAAE,MAAM,GAAG,CAAC,CAAC;IACtE,IAAI,WAAW;QAAE,MAAM,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\n/*\n * qjs: command line interpreter (port of qjs.c)\n */\nimport { JS_NewRuntime, JS_NewContext, JS_Eval, JS_IsException, JS_EVAL_TYPE_GLOBAL, JS_EVAL_TYPE_MODULE, JS_EVAL_FLAG_STRICT,\n JS_EVAL_FLAG_COMPILE_ONLY, JS_EVAL_FLAG_STRIP_TYPES, JS_EVAL_FLAG_JSX, JS_IsUndefined, JS_ToString, JS_GetFunctionData, JS_SetMaxStackSize, formatException,\n JS_GetException, JSContext, JSValue, JSModuleDef, JS_SetModuleLoader, JS_ImportModule, JS_EvalModule, JS_DetectModule,\n JS_PromiseState, JS_PromiseResult, JSPromiseState, JS_SetHostPromiseRejectionTracker } from './jseption.ts';\nimport { js_std_add_helpers, js_std_loop, js_std_dump_error, js_std_dump_error1, js_std_module_loader,\n js_std_promise_rejection_tracker } from './std.ts';\nimport { JS_PrintValueToString } from './print.ts';\nimport { dump_byte_code } from './dump.ts';\nimport { js_module_type_of, js_module_type_flags } from './module.ts';\nimport { readFileSync } from 'node:fs';\nimport { resolve as path_resolve } from 'node:path';\n\nfunction help(): never {\n console.log(`usage: qjs [options] [file [args]]\n-h --help list options\n-e --eval EXPR evaluate EXPR\n-i --interactive go to interactive mode\n-d --dump dump the bytecode of the evaluated code\n-m --module evaluate the file and -e as ES modules (.mjs, .mts, .jsx\n and .tsx files always are; .js and .ts files are when they\n start with import or export)\n --script evaluate the file as a script\n --strict evaluate in strict mode\n --strip-types run -e and the REPL as TypeScript (type syntax is stripped;\n .ts, .mts, .cts and .tsx files always are)\n --jsx compile JSX in -e and the REPL (.jsx and .tsx files always\n are)\n-q --quit just instantiate the interpreter and quit\n --no-unhandled-rejection ignore unhandled promise rejections`);\n process.exit(1);\n}\n\nfunction dump_buf(ctx: JSContext, buf: string, filename: string, eval_flags: number): number {\n const fn = JS_Eval(ctx, buf, filename, eval_flags | JS_EVAL_FLAG_COMPILE_ONLY);\n if (JS_IsException(fn)) { js_std_dump_error(ctx); return -1; }\n const b = fn instanceof JSModuleDef ? fn.func_bytecode! : JS_GetFunctionData(fn)!.function_bytecode;\n process.stdout.write(dump_byte_code(ctx, b));\n return 0;\n}\n\nfunction eval_buf(ctx: JSContext, buf: string, filename: string, eval_flags: number, dump: boolean): number {\n if (dump && dump_buf(ctx, buf, filename, eval_flags)) return -1;\n const val = JS_Eval(ctx, buf, filename, eval_flags);\n if (JS_IsException(val)) {\n js_std_dump_error(ctx);\n return -1;\n }\n return 0;\n}\n\n/* module evaluations whose promise is checked once the event loop is idle */\nconst module_promises: JSValue[] = [];\n\n/* report a module that failed to load, link or evaluate: 0, or -1 */\nfunction check_module(ctx: JSContext, p: JSValue): number {\n if (JS_PromiseState(ctx, p) !== JSPromiseState.REJECTED) return 0;\n js_std_dump_error1(ctx, JS_PromiseResult(ctx, p));\n return -1;\n}\n\n/* is `filename` (with source `buf`) a module? */\nfunction is_module_file(filename: string, buf: string, force: 'module' | 'script' | null): boolean {\n if (force !== null) return force === 'module';\n if (/\\.m[jt]s$/.test(filename) || /\\.[jt]sx$/.test(filename)) return true;\n if (/\\.c[jt]s$/.test(filename)) return false;\n return JS_DetectModule(buf);\n}\n\nasync function repl(ctx: JSContext, eval_flags: number): Promise<void> {\n const readline = await import('readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: 'qjs > ' });\n rl.prompt();\n for await (const line of rl) {\n if (line.trim() === '') { rl.prompt(); continue; }\n const val = JS_Eval(ctx, line, '<repl>', JS_EVAL_TYPE_GLOBAL | eval_flags);\n if (JS_IsException(val)) {\n js_std_dump_error(ctx);\n } else if (!JS_IsUndefined(val)) {\n console.log(JS_PrintValueToString(ctx, val));\n }\n await js_std_loop(ctx);\n rl.prompt();\n }\n}\n\nasync function main(): Promise<number> {\n const argv = process.argv.slice(2);\n let optind = 0;\n const expr: string[] = [];\n let interactive = false, dump = false, strict = false, quit = false, strip_types = false, jsx = false;\n let dump_unhandled_promise_rejection = true;\n let force: 'module' | 'script' | null = null;\n while (optind < argv.length && argv[optind].startsWith('-')) {\n const arg = argv[optind++];\n if (arg === '-h' || arg === '--help') help();\n else if (arg === '-e' || arg === '--eval') { if (optind >= argv.length) help(); expr.push(argv[optind++]); }\n else if (arg === '-i' || arg === '--interactive') interactive = true;\n else if (arg === '-d' || arg === '--dump') dump = true;\n else if (arg === '--strict') strict = true;\n else if (arg === '-m' || arg === '--module') force = 'module';\n else if (arg === '--script') force = 'script';\n else if (arg === '--strip-types') strip_types = true;\n else if (arg === '--jsx') jsx = true;\n else if (arg === '-q' || arg === '--quit') quit = true;\n else if (arg === '--no-unhandled-rejection') dump_unhandled_promise_rejection = false;\n else if (arg === '--') break;\n else { console.error(`qjs: unknown option '${arg}'`); help(); }\n }\n const rt = JS_NewRuntime();\n JS_SetMaxStackSize(rt, 1000);\n const ctx = JS_NewContext(rt);\n js_std_add_helpers(ctx, argv.slice(optind));\n if (dump_unhandled_promise_rejection) JS_SetHostPromiseRejectionTracker(rt, js_std_promise_rejection_tracker, null);\n JS_SetModuleLoader(rt, js_std_module_loader());\n if (quit) return 0;\n const lang_flags = (strip_types ? JS_EVAL_FLAG_STRIP_TYPES : 0) | (jsx ? JS_EVAL_FLAG_JSX : 0);\n const eval_flags = JS_EVAL_TYPE_GLOBAL | (strict ? JS_EVAL_FLAG_STRICT : 0) | lang_flags;\n let status = 0;\n for (const e of expr) {\n if (force === 'module') {\n const name = path_resolve('<cmdline>');\n if (dump && dump_buf(ctx, e, name, (eval_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE)) { status = 1; continue; }\n module_promises.push(JS_EvalModule(ctx, e, name, eval_flags));\n } else if (eval_buf(ctx, e, '<cmdline>', eval_flags, dump)) {\n status = 1;\n }\n }\n if (optind < argv.length) {\n const filename = argv[optind];\n let buf: string;\n try {\n buf = readFileSync(filename, 'utf8');\n } catch (e) {\n console.error(`qjs: cannot load '${filename}': ${(e as Error).message}`);\n return 1;\n }\n /* TypeScript files: erasable type syntax is stripped (Node's strip-only mode); JSX and TSX\n files: JSX is compiled. Modules get the same flags from the loader */\n const file_flags = eval_flags | js_module_type_flags(js_module_type_of(filename));\n if (is_module_file(filename, buf, force)) {\n /* through the loader, so that the module's id is its absolute path and import.meta.url\n its file: URL */\n const id = path_resolve(filename);\n if (dump && dump_buf(ctx, buf, id, (file_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE)) status = 1;\n else module_promises.push(JS_ImportModule(ctx, id));\n } else if (eval_buf(ctx, buf, filename, file_flags, dump)) {\n status = 1;\n }\n } else if (expr.length === 0) {\n interactive = true;\n }\n await js_std_loop(ctx, module_promises);\n for (const p of module_promises) if (check_module(ctx, p)) status = 1;\n if (interactive) await repl(ctx, lang_flags);\n return status;\n}\n\nmain().then(code => process.exit(code), e => { console.error(e); process.exit(2); });\n"]}
package/dist/quickjs.d.ts CHANGED
@@ -82,6 +82,7 @@ export declare class JSContext {
82
82
  user_opaque: any;
83
83
  loaded_modules: Map<string, any>;
84
84
  interrupt_counter: number;
85
+ last_new: unknown;
85
86
  array_iterator_proto: JSObject | null;
86
87
  generator_proto: JSObject | null;
87
88
  async_generator_proto: JSObject | null;
@@ -180,6 +181,8 @@ export declare function JS_ThrowReferenceErrorUninitialized2(ctx: JSContext, b:
180
181
  export declare function JS_ThrowTypeErrorReadOnly(ctx: JSContext, flags: number, atom: JSAtom): number;
181
182
  export declare function JS_ThrowTypeErrorNotAnObject(ctx: JSContext): JSValue;
182
183
  export declare function JS_ThrowTypeErrorNotASymbol(ctx: JSContext): JSValue;
184
+ export declare function JS_ThrowTypeErrorNotAConstructor(ctx: JSContext, f: JSValue): JSValue;
185
+ export declare function js_not_a_constructor_message(f: unknown): string;
183
186
  export declare function JS_ThrowTypeErrorInvalidClass(ctx: JSContext, class_id: JSClassID): JSValue;
184
187
  export declare function JS_ThrowTypeErrorNotAFunction(ctx: JSContext): JSValue;
185
188
  export declare function is_strict_mode(ctx: JSContext): boolean;
@@ -288,6 +291,7 @@ export declare function JS_GetPropertyValue(ctx: JSContext, this_obj: JSValue, p
288
291
  export declare function JS_HasProperty(ctx: JSContext, obj: JSValue, prop: JSAtom): number;
289
292
  export declare function JS_IsExtensible(ctx: JSContext, obj: JSValue): number;
290
293
  export declare function JS_PreventExtensions(ctx: JSContext, obj: JSValue): number;
294
+ export declare function JS_SetImmutablePrototype(ctx: JSContext, obj: JSValue): void;
291
295
  export declare function JS_SetPrototypeInternal(ctx: JSContext, obj: JSValue, proto_val: JSValue, throw_flag: boolean): number;
292
296
  export declare function JS_SetPrototype(ctx: JSContext, obj: JSValue, proto_val: JSValue): number;
293
297
  export declare function js_is_host_error(e: unknown): boolean;
@@ -313,6 +317,10 @@ export interface JSPropertyEnum {
313
317
  is_enumerable: boolean;
314
318
  }
315
319
  export declare function JS_GetOwnPropertyNamesInternal(ctx: JSContext, p: JSObject, flags: number): JSPropertyEnum[] | null;
320
+ export declare function JS_FreePropertyEnum(ctx: JSContext, tab: JSPropertyEnum[] | null, len?: number): void;
321
+ export declare function JS_AtomToCStringLen(ctx: JSContext, plen: {
322
+ v: number;
323
+ } | null, atom: JSAtom): string;
316
324
  export declare function JS_GetOwnPropertyNames(ctx: JSContext, obj: JSValue, flags: number): JSPropertyEnum[] | null;
317
325
  export declare function JS_FromPropertyDescriptor(ctx: JSContext, d: JSPropertyDescriptor): JSValue;
318
326
  export declare function js_obj_to_desc(ctx: JSContext, d: JSPropertyDescriptor, desc: JSValue): number;
package/dist/quickjs.js CHANGED
@@ -15,7 +15,7 @@
15
15
  * WeakMap. Guest functions are strict host wrapper functions.
16
16
  */
17
17
  import { jit_hooks } from "./jit_hook.js";
18
- import { AtomTable, JS_ATOM_NULL, JS_ATOM_TYPE_STRING, JS_ATOM_TYPE_SYMBOL, __JS_AtomIsTaggedInt, __JS_AtomFromUInt32, __JS_AtomToUInt32, JS_ATOM_MAX_INT, JS_ATOM_length, JS_ATOM_prototype, JS_ATOM_constructor, JS_ATOM_message, JS_ATOM_stack, JS_ATOM_toString, JS_ATOM_valueOf, JS_ATOM_Symbol_toPrimitive, JS_ATOM_Symbol_iterator, JS_ATOM_Symbol_hasInstance, JS_ATOM_done, JS_ATOM_value, JS_ATOM_return, JS_ATOM_get, JS_ATOM_set, JS_ATOM_configurable, JS_ATOM_writable, JS_ATOM_enumerable, JS_ATOM_undefined, JS_ATOM_object, JS_ATOM_boolean, JS_ATOM_number, JS_ATOM_string, JS_ATOM_symbol, JS_ATOM_bigint, JS_ATOM_function, JS_ATOM_lineNumber, JS_ATOM_fileName, JS_ATOM_columnNumber, JS_ATOM_Error, JS_ATOM___proto__, JS_ATOM_Symbol_asyncIterator, JS_ATOM_null, JS_ATOM_false, JS_ATOM_true, JS_ATOM_Object, JS_ATOM_Function, JS_ATOM_Array, JS_ATOM_Number, JS_ATOM_String, JS_ATOM_Boolean, JS_ATOM_Symbol, JS_ATOM_Arguments, JS_ATOM_BigInt, JS_ATOM_Date, JS_ATOM_RegExp, JS_ATOM_Map, JS_ATOM_Set, JS_ATOM_WeakMap, JS_ATOM_WeakSet, JS_ATOM_Generator, JS_ATOM_Proxy, JS_ATOM_Promise, JS_ATOM_AsyncFunction, JS_ATOM_AsyncGenerator, JS_ATOM_GeneratorFunction, JS_ATOM_AsyncGeneratorFunction, JS_ATOM_ForInIterator, JS_ATOM_Map_Iterator, JS_ATOM_Set_Iterator, JS_ATOM_Array_Iterator, JS_ATOM_String_Iterator, JS_ATOM_RegExp_String_Iterator, JS_ATOM_PromiseResolveFunction, JS_ATOM_PromiseRejectFunction, JS_ATOM_AsyncFunctionResolve, JS_ATOM_AsyncFunctionReject, JS_ATOM_ArrayBuffer, JS_ATOM_SharedArrayBuffer, JS_ATOM_Uint8ClampedArray, JS_ATOM_Int8Array, JS_ATOM_Uint8Array, JS_ATOM_Int16Array, JS_ATOM_Uint16Array, JS_ATOM_Int32Array, JS_ATOM_Uint32Array, JS_ATOM_BigInt64Array, JS_ATOM_BigUint64Array, JS_ATOM_Float32Array, JS_ATOM_Float64Array, JS_ATOM_DataView, JS_ATOM_WeakRef, JS_ATOM_FinalizationRegistry, JS_ATOM_Module, } from "./atoms.js";
18
+ import { AtomTable, JS_ATOM_NULL, JS_ATOM_TYPE_STRING, JS_ATOM_TYPE_SYMBOL, __JS_AtomIsTaggedInt, __JS_AtomFromUInt32, __JS_AtomToUInt32, JS_ATOM_MAX_INT, JS_ATOM_length, JS_ATOM_prototype, JS_ATOM_constructor, JS_ATOM_message, JS_ATOM_stack, JS_ATOM_toString, JS_ATOM_valueOf, JS_ATOM_Symbol_toPrimitive, JS_ATOM_Symbol_iterator, JS_ATOM_Symbol_hasInstance, JS_ATOM_done, JS_ATOM_value, JS_ATOM_return, JS_ATOM_get, JS_ATOM_set, JS_ATOM_configurable, JS_ATOM_writable, JS_ATOM_enumerable, JS_ATOM_undefined, JS_ATOM_object, JS_ATOM_boolean, JS_ATOM_number, JS_ATOM_string, JS_ATOM_symbol, JS_ATOM_bigint, JS_ATOM_function, JS_ATOM_lineNumber, JS_ATOM_fileName, JS_ATOM_columnNumber, JS_ATOM_Error, JS_ATOM___proto__, JS_ATOM_Symbol_asyncIterator, JS_ATOM_null, JS_ATOM_false, JS_ATOM_true, JS_ATOM_Object, JS_ATOM_Function, JS_ATOM_Array, JS_ATOM_Number, JS_ATOM_String, JS_ATOM_Boolean, JS_ATOM_Symbol, JS_ATOM_Arguments, JS_ATOM_BigInt, JS_ATOM_Date, JS_ATOM_RegExp, JS_ATOM_Map, JS_ATOM_Set, JS_ATOM_WeakMap, JS_ATOM_WeakSet, JS_ATOM_Generator, JS_ATOM_Proxy, JS_ATOM_Promise, JS_ATOM_AsyncFunction, JS_ATOM_AsyncGenerator, JS_ATOM_GeneratorFunction, JS_ATOM_AsyncGeneratorFunction, JS_ATOM_ForInIterator, JS_ATOM_Map_Iterator, JS_ATOM_Set_Iterator, JS_ATOM_Array_Iterator, JS_ATOM_String_Iterator, JS_ATOM_RegExp_String_Iterator, JS_ATOM_PromiseResolveFunction, JS_ATOM_PromiseRejectFunction, JS_ATOM_AsyncFunctionResolve, JS_ATOM_AsyncFunctionReject, JS_ATOM_ArrayBuffer, JS_ATOM_SharedArrayBuffer, JS_ATOM_Uint8ClampedArray, JS_ATOM_Int8Array, JS_ATOM_Uint8Array, JS_ATOM_Int16Array, JS_ATOM_Uint16Array, JS_ATOM_Int32Array, JS_ATOM_Uint32Array, JS_ATOM_BigInt64Array, JS_ATOM_BigUint64Array, JS_ATOM_Float16Array, JS_ATOM_Float32Array, JS_ATOM_Float64Array, JS_ATOM_DataView, JS_ATOM_WeakRef, JS_ATOM_FinalizationRegistry, JS_ATOM_Module, } from "./atoms.js";
19
19
  import { JSSpecial, JS_EXCEPTION, JS_UNINITIALIZED, JS_MODE_BACKTRACE_BARRIER, JS_PROP_CONFIGURABLE, JS_PROP_WRITABLE, JS_PROP_ENUMERABLE, JS_PROP_C_W_E, JS_PROP_TMASK, JS_PROP_GETSET, JS_PROP_HAS_CONFIGURABLE, JS_PROP_HAS_WRITABLE, JS_PROP_HAS_ENUMERABLE, JS_PROP_HAS_GET, JS_PROP_HAS_SET, JS_PROP_HAS_VALUE, JS_PROP_THROW, JS_PROP_THROW_STRICT, JS_PROP_NO_ADD, JS_GPN_STRING_MASK, JS_GPN_SYMBOL_MASK, JS_GPN_ENUM_ONLY, JS_GPN_SET_ENUM, JS_IsException, JS_IsObject, JS_IsUndefined, JSCFunctionRecord, JSCFunctionDataRecord, JSStackFrame, JS_CALL_FLAG_CONSTRUCTOR, JS_CALL_FLAG_COPY_ARGV, JSForInState, JSObjectMeta, JS_MODE_STRICT, JSModuleDef, } from "./values.js";
20
20
  export * from "./values.js";
21
21
  export * from "./atoms.js";
@@ -116,6 +116,10 @@ export class JSContext {
116
116
  user_opaque = null;
117
117
  loaded_modules = new Map();
118
118
  interrupt_counter = 0;
119
+ /* the callee of the native `new` compiled code ran last (stored after its arguments are
120
+ evaluated), so a failing construct is named after the callee's own `name`, as the
121
+ interpreter names it (JS_ThrowTypeErrorNotAConstructor) */
122
+ last_new = undefined;
119
123
  array_iterator_proto = null;
120
124
  generator_proto = null;
121
125
  async_generator_proto = null;
@@ -155,7 +159,7 @@ export function JS_NewClass(rt, class_id, def) {
155
159
  JS_NewClass1(rt, class_id, def);
156
160
  return 0;
157
161
  }
158
- let next_class_id = 56 /* JSClassID.INIT_COUNT */;
162
+ let next_class_id = 60 /* JSClassID.INIT_COUNT */;
159
163
  export function JS_NewClassID() {
160
164
  return next_class_id++;
161
165
  }
@@ -193,32 +197,33 @@ const js_std_class_def = [
193
197
  [27 /* JSClassID.UINT32_ARRAY */, JS_ATOM_Uint32Array],
194
198
  [28 /* JSClassID.BIG_INT64_ARRAY */, JS_ATOM_BigInt64Array],
195
199
  [29 /* JSClassID.BIG_UINT64_ARRAY */, JS_ATOM_BigUint64Array],
196
- [30 /* JSClassID.FLOAT32_ARRAY */, JS_ATOM_Float32Array],
197
- [31 /* JSClassID.FLOAT64_ARRAY */, JS_ATOM_Float64Array],
198
- [32 /* JSClassID.DATAVIEW */, JS_ATOM_DataView],
199
- [33 /* JSClassID.BIG_INT */, JS_ATOM_BigInt],
200
- [34 /* JSClassID.MAP */, JS_ATOM_Map],
201
- [35 /* JSClassID.SET */, JS_ATOM_Set],
202
- [36 /* JSClassID.WEAKMAP */, JS_ATOM_WeakMap],
203
- [37 /* JSClassID.WEAKSET */, JS_ATOM_WeakSet],
204
- [38 /* JSClassID.MAP_ITERATOR */, JS_ATOM_Map_Iterator],
205
- [39 /* JSClassID.SET_ITERATOR */, JS_ATOM_Set_Iterator],
206
- [40 /* JSClassID.ARRAY_ITERATOR */, JS_ATOM_Array_Iterator],
207
- [41 /* JSClassID.STRING_ITERATOR */, JS_ATOM_String_Iterator],
208
- [42 /* JSClassID.REGEXP_STRING_ITERATOR */, JS_ATOM_RegExp_String_Iterator],
209
- [43 /* JSClassID.GENERATOR */, JS_ATOM_Generator],
210
- [44 /* JSClassID.PROXY */, JS_ATOM_Proxy],
211
- [45 /* JSClassID.PROMISE */, JS_ATOM_Promise],
212
- [46 /* JSClassID.PROMISE_RESOLVE_FUNCTION */, JS_ATOM_PromiseResolveFunction],
213
- [47 /* JSClassID.PROMISE_REJECT_FUNCTION */, JS_ATOM_PromiseRejectFunction],
214
- [48 /* JSClassID.ASYNC_FUNCTION */, JS_ATOM_AsyncFunction],
215
- [49 /* JSClassID.ASYNC_FUNCTION_RESOLVE */, JS_ATOM_AsyncFunctionResolve],
216
- [50 /* JSClassID.ASYNC_FUNCTION_REJECT */, JS_ATOM_AsyncFunctionReject],
217
- [51 /* JSClassID.ASYNC_FROM_SYNC_ITERATOR */, JS_ATOM_Object],
218
- [52 /* JSClassID.ASYNC_GENERATOR_FUNCTION */, JS_ATOM_AsyncGeneratorFunction],
219
- [53 /* JSClassID.ASYNC_GENERATOR */, JS_ATOM_AsyncGenerator],
220
- [54 /* JSClassID.WEAK_REF */, JS_ATOM_WeakRef],
221
- [55 /* JSClassID.FINALIZATION_REGISTRY */, JS_ATOM_FinalizationRegistry],
200
+ [30 /* JSClassID.FLOAT16_ARRAY */, JS_ATOM_Float16Array],
201
+ [31 /* JSClassID.FLOAT32_ARRAY */, JS_ATOM_Float32Array],
202
+ [32 /* JSClassID.FLOAT64_ARRAY */, JS_ATOM_Float64Array],
203
+ [33 /* JSClassID.DATAVIEW */, JS_ATOM_DataView],
204
+ [34 /* JSClassID.BIG_INT */, JS_ATOM_BigInt],
205
+ [35 /* JSClassID.MAP */, JS_ATOM_Map],
206
+ [36 /* JSClassID.SET */, JS_ATOM_Set],
207
+ [37 /* JSClassID.WEAKMAP */, JS_ATOM_WeakMap],
208
+ [38 /* JSClassID.WEAKSET */, JS_ATOM_WeakSet],
209
+ [39 /* JSClassID.MAP_ITERATOR */, JS_ATOM_Map_Iterator],
210
+ [40 /* JSClassID.SET_ITERATOR */, JS_ATOM_Set_Iterator],
211
+ [41 /* JSClassID.ARRAY_ITERATOR */, JS_ATOM_Array_Iterator],
212
+ [42 /* JSClassID.STRING_ITERATOR */, JS_ATOM_String_Iterator],
213
+ [43 /* JSClassID.REGEXP_STRING_ITERATOR */, JS_ATOM_RegExp_String_Iterator],
214
+ [44 /* JSClassID.GENERATOR */, JS_ATOM_Generator],
215
+ [45 /* JSClassID.PROXY */, JS_ATOM_Proxy],
216
+ [46 /* JSClassID.PROMISE */, JS_ATOM_Promise],
217
+ [47 /* JSClassID.PROMISE_RESOLVE_FUNCTION */, JS_ATOM_PromiseResolveFunction],
218
+ [48 /* JSClassID.PROMISE_REJECT_FUNCTION */, JS_ATOM_PromiseRejectFunction],
219
+ [49 /* JSClassID.ASYNC_FUNCTION */, JS_ATOM_AsyncFunction],
220
+ [50 /* JSClassID.ASYNC_FUNCTION_RESOLVE */, JS_ATOM_AsyncFunctionResolve],
221
+ [51 /* JSClassID.ASYNC_FUNCTION_REJECT */, JS_ATOM_AsyncFunctionReject],
222
+ [52 /* JSClassID.ASYNC_FROM_SYNC_ITERATOR */, JS_ATOM_Object],
223
+ [53 /* JSClassID.ASYNC_GENERATOR_FUNCTION */, JS_ATOM_AsyncGeneratorFunction],
224
+ [54 /* JSClassID.ASYNC_GENERATOR */, JS_ATOM_AsyncGenerator],
225
+ [55 /* JSClassID.WEAK_REF */, JS_ATOM_WeakRef],
226
+ [56 /* JSClassID.FINALIZATION_REGISTRY */, JS_ATOM_FinalizationRegistry],
222
227
  ];
223
228
  export function JS_NewRuntime() {
224
229
  const rt = new JSRuntime();
@@ -251,6 +256,7 @@ export function JS_NewContextRaw(rt) {
251
256
  const ctx = new JSContext(rt);
252
257
  rt.context_list.push(ctx);
253
258
  ctx.class_proto[1 /* JSClassID.OBJECT */] = JS_NewObjectProto(ctx, null);
259
+ JS_SetImmutablePrototype(ctx, ctx.class_proto[1 /* JSClassID.OBJECT */]);
254
260
  /* placeholder replaced by the builtins (Function.prototype is a function) */
255
261
  ctx.function_proto = JS_NewObjectProtoClass(ctx, ctx.class_proto[1 /* JSClassID.OBJECT */], 1 /* JSClassID.OBJECT */);
256
262
  ctx.global_obj = JS_NewObject(ctx);
@@ -445,11 +451,31 @@ export function js_normalize_host_message(e) {
445
451
  msg = msg.replace(/\s*\((?:evaluating|In) '.*$/, '');
446
452
  return msg;
447
453
  }
454
+ /* A native `new` in compiled code failed: the host's message names generated code. When the
455
+ innermost guest frame is compiled code at a construct site, the callee is the one that site
456
+ stored in ctx.last_new just before constructing (after its arguments ran, so a nested `new`
457
+ in them cannot have overwritten it), and it is named by its own `name` as QuickJS does
458
+ ("G is not a constructor"). null when the failure is not at a compiled construct site. */
459
+ function js_compiled_not_a_constructor(ctx, e) {
460
+ const hooks = jit_hooks.stack;
461
+ if (hooks === null || typeof e.stack !== 'string')
462
+ return null;
463
+ const f = hooks.frames(e.stack)[0];
464
+ if (f === undefined || f.kind !== 'compiled' || f.ctor === undefined)
465
+ return null;
466
+ const fn = ctx.last_new;
467
+ /* JS_CallConstructorInternal: a non-object callee is "not a function" */
468
+ if (typeof fn !== 'function' && (typeof fn !== 'object' || fn === null))
469
+ return 'not a function';
470
+ return js_not_a_constructor_message(fn);
471
+ }
448
472
  export function js_host_exception_to_guest(ctx, e) {
449
473
  if (e === JS_EXCEPTION)
450
474
  return JS_EXCEPTION; /* already pending */
451
475
  if (e instanceof Error) {
452
476
  let msg = js_normalize_host_message(e);
477
+ if (msg === 'not a constructor')
478
+ msg = js_compiled_not_a_constructor(ctx, e) ?? msg;
453
479
  let num;
454
480
  if (e instanceof RangeError) {
455
481
  if (/call stack|stack size|recursion|stack overflow/i.test(msg))
@@ -761,6 +787,31 @@ export function JS_ThrowTypeErrorReadOnly(ctx, flags, atom) {
761
787
  }
762
788
  export function JS_ThrowTypeErrorNotAnObject(ctx) { return JS_ThrowTypeError(ctx, 'not an object'); }
763
789
  export function JS_ThrowTypeErrorNotASymbol(ctx) { return JS_ThrowTypeError(ctx, 'not a symbol'); }
790
+ /* "<name> is not a constructor" when `f` is a function whose `name` is a string data property
791
+ (own, or one level up the prototype chain, as get_prop_string() reads it: no getter runs),
792
+ else "not a constructor" */
793
+ export function JS_ThrowTypeErrorNotAConstructor(ctx, f) {
794
+ return JS_ThrowTypeError(ctx, js_not_a_constructor_message(f));
795
+ }
796
+ export function js_not_a_constructor_message(f) {
797
+ if (typeof f === 'function') {
798
+ let d;
799
+ try {
800
+ d = Reflect.getOwnPropertyDescriptor(f, 'name');
801
+ if (d === undefined) {
802
+ const p = Reflect.getPrototypeOf(f);
803
+ if (p !== null)
804
+ d = Reflect.getOwnPropertyDescriptor(p, 'name');
805
+ }
806
+ }
807
+ catch {
808
+ d = undefined; /* a revoked or throwing proxy: no name */
809
+ }
810
+ if (d !== undefined && 'value' in d && typeof d.value === 'string')
811
+ return `${d.value} is not a constructor`;
812
+ }
813
+ return 'not a constructor';
814
+ }
764
815
  export function JS_ThrowTypeErrorInvalidClass(ctx, class_id) {
765
816
  const name = ctx.rt.class_array[class_id]?.class_name ?? JS_ATOM_Object;
766
817
  return JS_ThrowTypeErrorAtom(ctx, '%s object expected', name);
@@ -783,12 +834,12 @@ function js_is_function_class(class_id) {
783
834
  case 13 /* JSClassID.BYTECODE_FUNCTION */:
784
835
  case 14 /* JSClassID.BOUND_FUNCTION */:
785
836
  case 16 /* JSClassID.GENERATOR_FUNCTION */:
786
- case 48 /* JSClassID.ASYNC_FUNCTION */:
787
- case 52 /* JSClassID.ASYNC_GENERATOR_FUNCTION */:
788
- case 46 /* JSClassID.PROMISE_RESOLVE_FUNCTION */:
789
- case 47 /* JSClassID.PROMISE_REJECT_FUNCTION */:
790
- case 49 /* JSClassID.ASYNC_FUNCTION_RESOLVE */:
791
- case 50 /* JSClassID.ASYNC_FUNCTION_REJECT */:
837
+ case 49 /* JSClassID.ASYNC_FUNCTION */:
838
+ case 53 /* JSClassID.ASYNC_GENERATOR_FUNCTION */:
839
+ case 47 /* JSClassID.PROMISE_RESOLVE_FUNCTION */:
840
+ case 48 /* JSClassID.PROMISE_REJECT_FUNCTION */:
841
+ case 50 /* JSClassID.ASYNC_FUNCTION_RESOLVE */:
842
+ case 51 /* JSClassID.ASYNC_FUNCTION_REJECT */:
792
843
  return true;
793
844
  default:
794
845
  return false;
@@ -950,7 +1001,7 @@ export function JS_SetConstructorBit(ctx, func_obj, val) {
950
1001
  /* IsArray: -1 on exception (revoked proxy) */
951
1002
  export function JS_IsArray(ctx, val) {
952
1003
  const m = js_get_meta(val);
953
- if (m && m.class_id === 44 /* JSClassID.PROXY */) {
1004
+ if (m && m.class_id === 45 /* JSClassID.PROXY */) {
954
1005
  const s = m.u;
955
1006
  if (s.is_revoked) {
956
1007
  JS_ThrowTypeError(ctx, 'revoked proxy');
@@ -1161,10 +1212,12 @@ export function JS_CallFree(ctx, func_obj, this_obj, argv) {
1161
1212
  }
1162
1213
  export function JS_CallConstructorInternal(ctx, func_obj, new_target, argv, flags) {
1163
1214
  flags |= JS_CALL_FLAG_CONSTRUCTOR;
1164
- if (typeof func_obj !== 'function')
1215
+ /* as JS_CallConstructorInternal(): a primitive is "not a function", an object that is not a
1216
+ constructor (including one that cannot be called) "not a constructor" */
1217
+ if (!JS_IsObject(func_obj))
1165
1218
  return JS_ThrowTypeError(ctx, 'not a function');
1166
1219
  if (!JS_IsConstructor(ctx, func_obj))
1167
- return JS_ThrowTypeError(ctx, 'not a constructor');
1220
+ return JS_ThrowTypeErrorNotAConstructor(ctx, func_obj);
1168
1221
  /* bytecode functions, C functions and proxies: the 'this' value is
1169
1222
  created by the callee from new_target */
1170
1223
  return hooks.JS_CallInternal(ctx, func_obj, new_target, new_target, argv, flags);
@@ -1192,12 +1245,12 @@ export function JS_GetFunctionRealm(ctx, func_obj) {
1192
1245
  return m.realm ?? ctx;
1193
1246
  case 13 /* JSClassID.BYTECODE_FUNCTION */:
1194
1247
  case 16 /* JSClassID.GENERATOR_FUNCTION */:
1195
- case 48 /* JSClassID.ASYNC_FUNCTION */:
1196
- case 52 /* JSClassID.ASYNC_GENERATOR_FUNCTION */:
1248
+ case 49 /* JSClassID.ASYNC_FUNCTION */:
1249
+ case 53 /* JSClassID.ASYNC_GENERATOR_FUNCTION */:
1197
1250
  return m.func?.function_bytecode.realm ?? m.realm ?? ctx;
1198
1251
  case 14 /* JSClassID.BOUND_FUNCTION */:
1199
1252
  return JS_GetFunctionRealm(ctx, m.u.func_obj);
1200
- case 44 /* JSClassID.PROXY */: {
1253
+ case 45 /* JSClassID.PROXY */: {
1201
1254
  const s = m.u;
1202
1255
  if (s.is_revoked) {
1203
1256
  JS_ThrowTypeError(ctx, 'revoked proxy');
@@ -1413,7 +1466,7 @@ export function JS_SetPropertyFunctionList(ctx, obj, tab) {
1413
1466
  Properties
1414
1467
  --------------------------------------------------------------------- */
1415
1468
  export function is_typed_array(class_id) {
1416
- return class_id >= 21 /* JSClassID.UINT8C_ARRAY */ && class_id <= 31 /* JSClassID.FLOAT64_ARRAY */;
1469
+ return class_id >= 21 /* JSClassID.UINT8C_ARRAY */ && class_id <= 32 /* JSClassID.FLOAT64_ARRAY */;
1417
1470
  }
1418
1471
  export function JS_ThrowTypeErrorOrFalse(ctx, flags, msg) {
1419
1472
  if ((flags & JS_PROP_THROW) || ((flags & JS_PROP_THROW_STRICT) && is_strict_mode(ctx))) {
@@ -1510,7 +1563,7 @@ export function new_desc() {
1510
1563
  /* prototype of a primitive value (null for undefined/null) */
1511
1564
  export function JS_GetPrototypePrimitive(ctx, val) {
1512
1565
  switch (typeof val) {
1513
- case 'bigint': return ctx.class_proto[33 /* JSClassID.BIG_INT */];
1566
+ case 'bigint': return ctx.class_proto[34 /* JSClassID.BIG_INT */];
1514
1567
  case 'number': return ctx.class_proto[4 /* JSClassID.NUMBER */];
1515
1568
  case 'boolean': return ctx.class_proto[6 /* JSClassID.BOOLEAN */];
1516
1569
  case 'string': return ctx.class_proto[5 /* JSClassID.STRING */];
@@ -1641,6 +1694,13 @@ export function JS_PreventExtensions(ctx, obj) {
1641
1694
  }
1642
1695
  }
1643
1696
  /* SetPrototypeOf: -1 exception, 0 failed (throw_flag false), 1 ok */
1697
+ /* objects whose prototype cannot change (has_immutable_prototype): each context's
1698
+ Object.prototype, an immutable prototype exotic object (ECMAScript 10.4.7) */
1699
+ const js_immutable_prototype = new WeakSet();
1700
+ export function JS_SetImmutablePrototype(ctx, obj) {
1701
+ if (JS_IsObject(obj))
1702
+ js_immutable_prototype.add(obj);
1703
+ }
1644
1704
  export function JS_SetPrototypeInternal(ctx, obj, proto_val, throw_flag) {
1645
1705
  if (!(proto_val === null || JS_IsObject(proto_val))) {
1646
1706
  JS_ThrowTypeErrorNotAnObject(ctx);
@@ -1653,6 +1713,12 @@ export function JS_SetPrototypeInternal(ctx, obj, proto_val, throw_flag) {
1653
1713
  }
1654
1714
  return 1;
1655
1715
  }
1716
+ if (js_immutable_prototype.has(obj) && Reflect.getPrototypeOf(obj) !== proto_val) {
1717
+ if (!throw_flag)
1718
+ return 0;
1719
+ JS_ThrowTypeError(ctx, 'prototype is immutable');
1720
+ return -1;
1721
+ }
1656
1722
  let ok;
1657
1723
  try {
1658
1724
  ok = Reflect.setPrototypeOf(obj, proto_val);
@@ -1668,7 +1734,7 @@ export function JS_SetPrototypeInternal(ctx, obj, proto_val, throw_flag) {
1668
1734
  ext = Reflect.isExtensible(obj);
1669
1735
  }
1670
1736
  catch { /* ignore */ }
1671
- if (JS_GetClassID(obj) === 44 /* JSClassID.PROXY */)
1737
+ if (JS_GetClassID(obj) === 45 /* JSClassID.PROXY */)
1672
1738
  JS_ThrowTypeError(ctx, 'proxy: bad prototype');
1673
1739
  else if (!ext)
1674
1740
  JS_ThrowTypeError(ctx, 'object is not extensible');
@@ -1710,7 +1776,7 @@ export function js_is_host_error(e) {
1710
1776
  }
1711
1777
  function js_set_failed(ctx, obj, key, prop, flags) {
1712
1778
  if ((flags & JS_PROP_THROW) || ((flags & JS_PROP_THROW_STRICT) && is_strict_mode(ctx))) {
1713
- if (JS_GetClassID(obj) === 44 /* JSClassID.PROXY */) {
1779
+ if (JS_GetClassID(obj) === 45 /* JSClassID.PROXY */) {
1714
1780
  JS_ThrowTypeError(ctx, 'proxy: cannot set property');
1715
1781
  }
1716
1782
  else {
@@ -1732,7 +1798,7 @@ function js_set_failed(ctx, obj, key, prop, flags) {
1732
1798
  /* host Proxies: guest proxies and module namespace objects. A refused store must be told
1733
1799
  apart from a throwing trap, which only Reflect.set can do */
1734
1800
  function js_is_proxy_class(class_id) {
1735
- return class_id === 44 /* JSClassID.PROXY */ || class_id === 11 /* JSClassID.MODULE_NS */;
1801
+ return class_id === 45 /* JSClassID.PROXY */ || class_id === 11 /* JSClassID.MODULE_NS */;
1736
1802
  }
1737
1803
  export function JS_SetPropertyInternal(ctx, obj, prop, val, this_obj, flags) {
1738
1804
  const key = JS_AtomToKey(ctx, prop);
@@ -1860,7 +1926,7 @@ export function JS_DefineProperty(ctx, this_obj, prop, val, getter, setter, flag
1860
1926
  }
1861
1927
  if (ok)
1862
1928
  return 1;
1863
- if (JS_GetClassID(this_obj) === 44 /* JSClassID.PROXY */)
1929
+ if (JS_GetClassID(this_obj) === 45 /* JSClassID.PROXY */)
1864
1930
  return JS_ThrowTypeErrorOrFalse(ctx, flags, 'proxy: inconsistent defineProperty');
1865
1931
  return JS_ThrowTypeErrorOrFalse(ctx, flags, 'property is not configurable');
1866
1932
  }
@@ -1952,6 +2018,18 @@ export function JS_GetOwnPropertyNamesInternal(ctx, p, flags) {
1952
2018
  }
1953
2019
  return tab;
1954
2020
  }
2021
+ /* JS_FreePropertyEnum (exported since QuickJS 2025-09-13): the property
2022
+ enumeration is garbage collected, so this does nothing */
2023
+ export function JS_FreePropertyEnum(ctx, tab, len) { }
2024
+ /* JS_AtomToCStringLen: the string of an atom (the description of a symbol);
2025
+ plen, when given, receives its length. jseption's C strings are host
2026
+ strings, so the length counts UTF-16 code units. */
2027
+ export function JS_AtomToCStringLen(ctx, plen, atom) {
2028
+ const str = JS_AtomToString(ctx, atom);
2029
+ if (plen)
2030
+ plen.v = str.length;
2031
+ return str;
2032
+ }
1955
2033
  export function JS_GetOwnPropertyNames(ctx, obj, flags) {
1956
2034
  if (!JS_IsObject(obj)) {
1957
2035
  JS_ThrowTypeErrorNotAnObject(ctx);
@@ -1992,21 +2070,22 @@ export function js_obj_to_desc(ctx, d, desc) {
1992
2070
  return [1, v];
1993
2071
  };
1994
2072
  let r;
1995
- r = get_field(JS_ATOM_configurable);
2073
+ /* ToPropertyDescriptor reads enumerable, configurable, value, writable, get, set in this order */
2074
+ r = get_field(JS_ATOM_enumerable);
1996
2075
  if (r[0] < 0)
1997
2076
  return -1;
1998
2077
  if (r[0]) {
1999
- flags |= JS_PROP_HAS_CONFIGURABLE;
2078
+ flags |= JS_PROP_HAS_ENUMERABLE;
2000
2079
  if (JS_ToBoolFree(ctx, r[1]))
2001
- flags |= JS_PROP_CONFIGURABLE;
2080
+ flags |= JS_PROP_ENUMERABLE;
2002
2081
  }
2003
- r = get_field(JS_ATOM_enumerable);
2082
+ r = get_field(JS_ATOM_configurable);
2004
2083
  if (r[0] < 0)
2005
2084
  return -1;
2006
2085
  if (r[0]) {
2007
- flags |= JS_PROP_HAS_ENUMERABLE;
2086
+ flags |= JS_PROP_HAS_CONFIGURABLE;
2008
2087
  if (JS_ToBoolFree(ctx, r[1]))
2009
- flags |= JS_PROP_ENUMERABLE;
2088
+ flags |= JS_PROP_CONFIGURABLE;
2010
2089
  }
2011
2090
  r = get_field(JS_ATOM_value);
2012
2091
  if (r[0] < 0)
@@ -2721,7 +2800,7 @@ export function JS_ToObject(ctx, val) {
2721
2800
  case 'symbol': return js_new_primitive_wrapper(ctx, ctx.class_proto[7 /* JSClassID.SYMBOL */], 7 /* JSClassID.SYMBOL */, val);
2722
2801
  case 'number': return js_new_primitive_wrapper(ctx, ctx.class_proto[4 /* JSClassID.NUMBER */], 4 /* JSClassID.NUMBER */, val);
2723
2802
  case 'boolean': return js_new_primitive_wrapper(ctx, ctx.class_proto[6 /* JSClassID.BOOLEAN */], 6 /* JSClassID.BOOLEAN */, val);
2724
- case 'bigint': return js_new_primitive_wrapper(ctx, ctx.class_proto[33 /* JSClassID.BIG_INT */], 33 /* JSClassID.BIG_INT */, val);
2803
+ case 'bigint': return js_new_primitive_wrapper(ctx, ctx.class_proto[34 /* JSClassID.BIG_INT */], 34 /* JSClassID.BIG_INT */, val);
2725
2804
  case 'string': return js_new_primitive_wrapper(ctx, ctx.class_proto[5 /* JSClassID.STRING */], 5 /* JSClassID.STRING */, val);
2726
2805
  }
2727
2806
  return JS_ThrowTypeError(ctx, 'cannot convert to object');