jseption 0.0.3 → 0.0.5
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.
- package/README.md +112 -4
- package/dist/bytecode.js +162 -2
- package/dist/bytecode.js.map +1 -1
- package/dist/embed.d.ts +5 -0
- package/dist/embed.js +44 -12
- package/dist/embed.js.map +1 -1
- package/dist/interpreter.js +15 -4
- package/dist/interpreter.js.map +1 -1
- package/dist/jit.js +12 -4
- package/dist/jit.js.map +1 -1
- package/dist/jit_runtime.d.ts +2 -0
- package/dist/jit_runtime.js +11 -0
- package/dist/jit_runtime.js.map +1 -1
- package/dist/jseption.d.ts +6 -0
- package/dist/jseption.js +4 -0
- package/dist/jseption.js.map +1 -1
- package/dist/membrane.d.ts +16 -0
- package/dist/membrane.js +576 -0
- package/dist/membrane.js.map +1 -0
- package/dist/module.d.ts +28 -0
- package/dist/module.js +1166 -0
- package/dist/module.js.map +1 -0
- package/dist/opcodes.js +1 -1
- package/dist/opcodes.js.map +1 -1
- package/dist/parser.d.ts +31 -0
- package/dist/parser.js +2862 -62
- package/dist/parser.js.map +1 -1
- package/dist/qjs.js +86 -17
- package/dist/qjs.js.map +1 -1
- package/dist/quickjs.d.ts +8 -0
- package/dist/quickjs.js +21 -2
- package/dist/quickjs.js.map +1 -1
- package/dist/std.d.ts +2 -0
- package/dist/std.js +34 -0
- package/dist/std.js.map +1 -1
- package/dist/values.d.ts +78 -0
- package/dist/values.js +85 -0
- package/dist/values.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
package/dist/qjs.js
CHANGED
|
@@ -2,29 +2,43 @@
|
|
|
2
2
|
/*
|
|
3
3
|
* qjs: command line interpreter (port of qjs.c)
|
|
4
4
|
*/
|
|
5
|
-
import { JS_NewRuntime, JS_NewContext, JS_Eval, JS_IsException, JS_EVAL_TYPE_GLOBAL, JS_EVAL_FLAG_STRICT, JS_EVAL_FLAG_COMPILE_ONLY, JS_IsUndefined, JS_ToString, JS_GetFunctionData, JS_SetMaxStackSize } from "./jseption.js";
|
|
6
|
-
import { js_std_add_helpers, js_std_loop, js_std_dump_error } from "./std.js";
|
|
5
|
+
import { JS_NewRuntime, JS_NewContext, JS_Eval, JS_IsException, JS_EVAL_TYPE_GLOBAL, JS_EVAL_TYPE_MODULE, JS_EVAL_FLAG_STRICT, JS_EVAL_FLAG_COMPILE_ONLY, JS_EVAL_FLAG_STRIP_TYPES, JS_EVAL_FLAG_JSX, JS_IsUndefined, JS_ToString, JS_GetFunctionData, JS_SetMaxStackSize, formatException, JSModuleDef, JS_SetModuleLoader, JS_ImportModule, JS_EvalModule, JS_DetectModule, JS_PromiseState, JS_PromiseResult } from "./jseption.js";
|
|
6
|
+
import { js_std_add_helpers, js_std_loop, js_std_dump_error, js_std_module_loader } from "./std.js";
|
|
7
7
|
import { dump_byte_code } from "./dump.js";
|
|
8
|
+
import { js_module_type_of, js_module_type_flags } from "./module.js";
|
|
8
9
|
import { readFileSync } from 'node:fs';
|
|
10
|
+
import { resolve as path_resolve } from 'node:path';
|
|
9
11
|
function help() {
|
|
10
12
|
console.log(`usage: qjs [options] [file [args]]
|
|
11
13
|
-h --help list options
|
|
12
14
|
-e --eval EXPR evaluate EXPR
|
|
13
15
|
-i --interactive go to interactive mode
|
|
14
16
|
-d --dump dump the bytecode of the evaluated code
|
|
17
|
+
-m --module evaluate the file and -e as ES modules (.mjs, .mts, .jsx
|
|
18
|
+
and .tsx files always are; .js and .ts files are when they
|
|
19
|
+
start with import or export)
|
|
20
|
+
--script evaluate the file as a script
|
|
15
21
|
--strict evaluate in strict mode
|
|
22
|
+
--strip-types run -e and the REPL as TypeScript (type syntax is stripped;
|
|
23
|
+
.ts, .mts, .cts and .tsx files always are)
|
|
24
|
+
--jsx compile JSX in -e and the REPL (.jsx and .tsx files always
|
|
25
|
+
are)
|
|
16
26
|
-q --quit just instantiate the interpreter and quit`);
|
|
17
27
|
process.exit(1);
|
|
18
28
|
}
|
|
19
|
-
function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return -1;
|
|
25
|
-
}
|
|
26
|
-
process.stdout.write(dump_byte_code(ctx, JS_GetFunctionData(fn).function_bytecode));
|
|
29
|
+
function dump_buf(ctx, buf, filename, eval_flags) {
|
|
30
|
+
const fn = JS_Eval(ctx, buf, filename, eval_flags | JS_EVAL_FLAG_COMPILE_ONLY);
|
|
31
|
+
if (JS_IsException(fn)) {
|
|
32
|
+
js_std_dump_error(ctx);
|
|
33
|
+
return -1;
|
|
27
34
|
}
|
|
35
|
+
const b = fn instanceof JSModuleDef ? fn.func_bytecode : JS_GetFunctionData(fn).function_bytecode;
|
|
36
|
+
process.stdout.write(dump_byte_code(ctx, b));
|
|
37
|
+
return 0;
|
|
38
|
+
}
|
|
39
|
+
function eval_buf(ctx, buf, filename, eval_flags, dump) {
|
|
40
|
+
if (dump && dump_buf(ctx, buf, filename, eval_flags))
|
|
41
|
+
return -1;
|
|
28
42
|
const val = JS_Eval(ctx, buf, filename, eval_flags);
|
|
29
43
|
if (JS_IsException(val)) {
|
|
30
44
|
js_std_dump_error(ctx);
|
|
@@ -32,7 +46,26 @@ function eval_buf(ctx, buf, filename, eval_flags, dump) {
|
|
|
32
46
|
}
|
|
33
47
|
return 0;
|
|
34
48
|
}
|
|
35
|
-
|
|
49
|
+
/* module evaluations whose promise is checked once the event loop is idle */
|
|
50
|
+
const module_promises = [];
|
|
51
|
+
/* report a module that failed to load, link or evaluate: 0, or -1 */
|
|
52
|
+
function check_module(ctx, p) {
|
|
53
|
+
if (JS_PromiseState(ctx, p) !== 2 /* JSPromiseState.REJECTED */)
|
|
54
|
+
return 0;
|
|
55
|
+
process.stderr.write(formatException(ctx, JS_PromiseResult(ctx, p)) + '\n');
|
|
56
|
+
return -1;
|
|
57
|
+
}
|
|
58
|
+
/* is `filename` (with source `buf`) a module? */
|
|
59
|
+
function is_module_file(filename, buf, force) {
|
|
60
|
+
if (force !== null)
|
|
61
|
+
return force === 'module';
|
|
62
|
+
if (/\.m[jt]s$/.test(filename) || /\.[jt]sx$/.test(filename))
|
|
63
|
+
return true;
|
|
64
|
+
if (/\.c[jt]s$/.test(filename))
|
|
65
|
+
return false;
|
|
66
|
+
return JS_DetectModule(buf);
|
|
67
|
+
}
|
|
68
|
+
async function repl(ctx, eval_flags) {
|
|
36
69
|
const readline = await import('readline');
|
|
37
70
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: 'qjs > ' });
|
|
38
71
|
rl.prompt();
|
|
@@ -41,7 +74,7 @@ async function repl(ctx) {
|
|
|
41
74
|
rl.prompt();
|
|
42
75
|
continue;
|
|
43
76
|
}
|
|
44
|
-
const val = JS_Eval(ctx, line, '<repl>', JS_EVAL_TYPE_GLOBAL);
|
|
77
|
+
const val = JS_Eval(ctx, line, '<repl>', JS_EVAL_TYPE_GLOBAL | eval_flags);
|
|
45
78
|
if (JS_IsException(val)) {
|
|
46
79
|
js_std_dump_error(ctx);
|
|
47
80
|
}
|
|
@@ -60,7 +93,8 @@ async function main() {
|
|
|
60
93
|
const argv = process.argv.slice(2);
|
|
61
94
|
let optind = 0;
|
|
62
95
|
const expr = [];
|
|
63
|
-
let interactive = false, dump = false, strict = false, quit = false;
|
|
96
|
+
let interactive = false, dump = false, strict = false, quit = false, strip_types = false, jsx = false;
|
|
97
|
+
let force = null;
|
|
64
98
|
while (optind < argv.length && argv[optind].startsWith('-')) {
|
|
65
99
|
const arg = argv[optind++];
|
|
66
100
|
if (arg === '-h' || arg === '--help')
|
|
@@ -76,6 +110,14 @@ async function main() {
|
|
|
76
110
|
dump = true;
|
|
77
111
|
else if (arg === '--strict')
|
|
78
112
|
strict = true;
|
|
113
|
+
else if (arg === '-m' || arg === '--module')
|
|
114
|
+
force = 'module';
|
|
115
|
+
else if (arg === '--script')
|
|
116
|
+
force = 'script';
|
|
117
|
+
else if (arg === '--strip-types')
|
|
118
|
+
strip_types = true;
|
|
119
|
+
else if (arg === '--jsx')
|
|
120
|
+
jsx = true;
|
|
79
121
|
else if (arg === '-q' || arg === '--quit')
|
|
80
122
|
quit = true;
|
|
81
123
|
else if (arg === '--')
|
|
@@ -89,13 +131,24 @@ async function main() {
|
|
|
89
131
|
JS_SetMaxStackSize(rt, 1000);
|
|
90
132
|
const ctx = JS_NewContext(rt);
|
|
91
133
|
js_std_add_helpers(ctx, argv.slice(optind));
|
|
134
|
+
JS_SetModuleLoader(rt, js_std_module_loader());
|
|
92
135
|
if (quit)
|
|
93
136
|
return 0;
|
|
94
|
-
const
|
|
137
|
+
const lang_flags = (strip_types ? JS_EVAL_FLAG_STRIP_TYPES : 0) | (jsx ? JS_EVAL_FLAG_JSX : 0);
|
|
138
|
+
const eval_flags = JS_EVAL_TYPE_GLOBAL | (strict ? JS_EVAL_FLAG_STRICT : 0) | lang_flags;
|
|
95
139
|
let status = 0;
|
|
96
140
|
for (const e of expr) {
|
|
97
|
-
if (
|
|
141
|
+
if (force === 'module') {
|
|
142
|
+
const name = path_resolve('<cmdline>');
|
|
143
|
+
if (dump && dump_buf(ctx, e, name, (eval_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE)) {
|
|
144
|
+
status = 1;
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
module_promises.push(JS_EvalModule(ctx, e, name, eval_flags));
|
|
148
|
+
}
|
|
149
|
+
else if (eval_buf(ctx, e, '<cmdline>', eval_flags, dump)) {
|
|
98
150
|
status = 1;
|
|
151
|
+
}
|
|
99
152
|
}
|
|
100
153
|
if (optind < argv.length) {
|
|
101
154
|
const filename = argv[optind];
|
|
@@ -107,15 +160,31 @@ async function main() {
|
|
|
107
160
|
console.error(`qjs: cannot load '${filename}': ${e.message}`);
|
|
108
161
|
return 1;
|
|
109
162
|
}
|
|
110
|
-
|
|
163
|
+
/* TypeScript files: erasable type syntax is stripped (Node's strip-only mode); JSX and TSX
|
|
164
|
+
files: JSX is compiled. Modules get the same flags from the loader */
|
|
165
|
+
const file_flags = eval_flags | js_module_type_flags(js_module_type_of(filename));
|
|
166
|
+
if (is_module_file(filename, buf, force)) {
|
|
167
|
+
/* through the loader, so that the module's id is its absolute path and import.meta.url
|
|
168
|
+
its file: URL */
|
|
169
|
+
const id = path_resolve(filename);
|
|
170
|
+
if (dump && dump_buf(ctx, buf, id, (file_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE))
|
|
171
|
+
status = 1;
|
|
172
|
+
else
|
|
173
|
+
module_promises.push(JS_ImportModule(ctx, id));
|
|
174
|
+
}
|
|
175
|
+
else if (eval_buf(ctx, buf, filename, file_flags, dump)) {
|
|
111
176
|
status = 1;
|
|
177
|
+
}
|
|
112
178
|
}
|
|
113
179
|
else if (expr.length === 0) {
|
|
114
180
|
interactive = true;
|
|
115
181
|
}
|
|
116
182
|
await js_std_loop(ctx);
|
|
183
|
+
for (const p of module_promises)
|
|
184
|
+
if (check_module(ctx, p))
|
|
185
|
+
status = 1;
|
|
117
186
|
if (interactive)
|
|
118
|
-
await repl(ctx);
|
|
187
|
+
await repl(ctx, lang_flags);
|
|
119
188
|
return status;
|
|
120
189
|
}
|
|
121
190
|
main().then(code => process.exit(code), e => { console.error(e); process.exit(2); });
|
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_FLAG_STRICT,\n JS_EVAL_FLAG_COMPILE_ONLY, JS_IsUndefined, JS_ToString, JS_GetFunctionData, JS_SetMaxStackSize, formatException,\n JS_GetException, JSContext } from './jseption.ts';\nimport { js_std_add_helpers, js_std_loop, js_std_dump_error } from './std.ts';\nimport { dump_byte_code } from './dump.ts';\nimport { readFileSync } from 'node:fs';\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 --strict evaluate in strict mode\n-q --quit just instantiate the interpreter and quit`);\n process.exit(1);\n}\n\nfunction eval_buf(ctx: JSContext, buf: string, filename: string, eval_flags: number, dump: boolean): number {\n if (dump) {\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 process.stdout.write(dump_byte_code(ctx, JS_GetFunctionData(fn)!.function_bytecode));\n }\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\nasync function repl(ctx: JSContext): 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);\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;\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 === '-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 if (quit) return 0;\n const eval_flags = JS_EVAL_TYPE_GLOBAL | (strict ? JS_EVAL_FLAG_STRICT : 0);\n let status = 0;\n for (const e of expr) {\n if (eval_buf(ctx, e, '<cmdline>', eval_flags, dump)) status = 1;\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 if (eval_buf(ctx, buf, filename, eval_flags, dump)) status = 1;\n } else if (expr.length === 0) {\n interactive = true;\n }\n await js_std_loop(ctx);\n if (interactive) await repl(ctx);\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,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EACtH,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EACrH,eAAe,EAAE,gBAAgB,EAAkB,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACpG,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;;;;;;;;;;;;;;6DAc+C,CAAC,CAAC;IAC7D,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,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5E,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,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAChC,IAAI,cAAc,CAAC,CAAC,CAAC;gBAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;;gBACzC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,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,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,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,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,CAAC,CAAC;IACvB,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 } 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"]}
|
package/dist/quickjs.d.ts
CHANGED
|
@@ -32,6 +32,8 @@ export declare function js_ensure_meta(obj: object, class_id?: JSClassID): JSObj
|
|
|
32
32
|
export declare function JS_GetFunctionData(func: JSValue): JSFunctionData | null;
|
|
33
33
|
export declare class JSRuntime {
|
|
34
34
|
atoms: AtomTable;
|
|
35
|
+
module_loader: any;
|
|
36
|
+
module_async_evaluation_next_timestamp: number;
|
|
35
37
|
class_array: (JSClass | null)[];
|
|
36
38
|
class_count: number;
|
|
37
39
|
current_exception: JSValue;
|
|
@@ -55,6 +57,8 @@ export declare class JSRuntime {
|
|
|
55
57
|
}
|
|
56
58
|
export declare class JSContext {
|
|
57
59
|
rt: JSRuntime;
|
|
60
|
+
module_map: Map<string, any>;
|
|
61
|
+
module_inflight: Map<string, any>;
|
|
58
62
|
class_proto: (JSObject | null)[];
|
|
59
63
|
function_proto: JSObject | null;
|
|
60
64
|
function_ctor: JSObject | null;
|
|
@@ -91,6 +95,10 @@ export interface JSHooks {
|
|
|
91
95
|
js_regexp_constructor_internal: ((ctx: JSContext, ctor: JSValue, pattern: string, flags: string) => JSValue) | null;
|
|
92
96
|
js_borrow_native: (ctx: JSContext, host: Function, name: string, length: number, fix: JSNativeFixer | null) => JSValue;
|
|
93
97
|
init_runtime: ((rt: JSRuntime) => void)[];
|
|
98
|
+
js_module_compiled: ((ctx: JSContext, m: any, b: JSFunctionBytecode, flags: number) => JSValue) | null;
|
|
99
|
+
js_dynamic_import: ((ctx: JSContext, b: JSFunctionBytecode | null, specifier: JSValue, options: JSValue) => JSValue) | null;
|
|
100
|
+
js_import_meta: ((ctx: JSContext, b: JSFunctionBytecode | null) => JSValue) | null;
|
|
101
|
+
js_module_eval_function: ((ctx: JSContext, m: any) => JSValue) | null;
|
|
94
102
|
}
|
|
95
103
|
export declare const hooks: JSHooks;
|
|
96
104
|
export declare function JS_NewClass1(rt: JSRuntime, class_id: JSClassID, def: JSClassDef): void;
|
package/dist/quickjs.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { jit_hooks } from "./jit_hook.js";
|
|
18
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";
|
|
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, } from "./values.js";
|
|
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";
|
|
22
22
|
export class JSClass {
|
|
@@ -59,6 +59,9 @@ export function JS_GetFunctionData(func) {
|
|
|
59
59
|
}
|
|
60
60
|
export class JSRuntime {
|
|
61
61
|
atoms = new AtomTable();
|
|
62
|
+
/* modules (src/module.ts): the embedder's loader, and the order of asynchronous evaluations */
|
|
63
|
+
module_loader = null;
|
|
64
|
+
module_async_evaluation_next_timestamp = 0;
|
|
62
65
|
class_array = [];
|
|
63
66
|
class_count = 0;
|
|
64
67
|
current_exception = undefined;
|
|
@@ -83,6 +86,9 @@ export class JSRuntime {
|
|
|
83
86
|
}
|
|
84
87
|
export class JSContext {
|
|
85
88
|
rt;
|
|
89
|
+
/* modules loaded in this context, by normalized id (and type), and those being fetched */
|
|
90
|
+
module_map = new Map();
|
|
91
|
+
module_inflight = new Map();
|
|
86
92
|
class_proto = [];
|
|
87
93
|
function_proto = null;
|
|
88
94
|
function_ctor = null;
|
|
@@ -129,6 +135,10 @@ export const hooks = {
|
|
|
129
135
|
js_regexp_constructor_internal: null,
|
|
130
136
|
js_borrow_native: () => { throw new Error('native builtins not loaded'); },
|
|
131
137
|
init_runtime: [],
|
|
138
|
+
js_module_compiled: null,
|
|
139
|
+
js_dynamic_import: null,
|
|
140
|
+
js_import_meta: null,
|
|
141
|
+
js_module_eval_function: null,
|
|
132
142
|
};
|
|
133
143
|
export function JS_NewClass1(rt, class_id, def) {
|
|
134
144
|
while (rt.class_array.length <= class_id)
|
|
@@ -1719,10 +1729,15 @@ function js_set_failed(ctx, obj, key, prop, flags) {
|
|
|
1719
1729
|
return 0;
|
|
1720
1730
|
}
|
|
1721
1731
|
/* SetProperty: -1 exception, 0 failed silently, 1 ok. 'this_obj' is the receiver. */
|
|
1732
|
+
/* host Proxies: guest proxies and module namespace objects. A refused store must be told
|
|
1733
|
+
apart from a throwing trap, which only Reflect.set can do */
|
|
1734
|
+
function js_is_proxy_class(class_id) {
|
|
1735
|
+
return class_id === 44 /* JSClassID.PROXY */ || class_id === 11 /* JSClassID.MODULE_NS */;
|
|
1736
|
+
}
|
|
1722
1737
|
export function JS_SetPropertyInternal(ctx, obj, prop, val, this_obj, flags) {
|
|
1723
1738
|
const key = JS_AtomToKey(ctx, prop);
|
|
1724
1739
|
if (JS_IsObject(obj)) {
|
|
1725
|
-
if (this_obj === obj && js_meta.get(obj)?.class_id
|
|
1740
|
+
if (this_obj === obj && !js_is_proxy_class(js_meta.get(obj)?.class_id)) {
|
|
1726
1741
|
/* plain assignment (proxies use Reflect.set below, which tells a refused
|
|
1727
1742
|
trap from an invariant violation): Reflect.set is ~50x slower than an inline-cached
|
|
1728
1743
|
store in JSC (and ~600 ns when appending to an array). A strict
|
|
@@ -3316,6 +3331,10 @@ export function JS_Eval(ctx, input, filename, eval_flags) {
|
|
|
3316
3331
|
}
|
|
3317
3332
|
/* run the function object produced by JS_EVAL_FLAG_COMPILE_ONLY */
|
|
3318
3333
|
export function JS_EvalFunction(ctx, fun_obj) {
|
|
3334
|
+
/* a compiled module (JS_TAG_MODULE in C): load its graph, link and evaluate it */
|
|
3335
|
+
if (hooks.js_module_eval_function !== null && fun_obj instanceof JSModuleDef) {
|
|
3336
|
+
return hooks.js_module_eval_function(ctx, fun_obj);
|
|
3337
|
+
}
|
|
3319
3338
|
return JS_Call(ctx, fun_obj, ctx.global_obj, []);
|
|
3320
3339
|
}
|
|
3321
3340
|
export function JS_RunGC(_rt) { }
|