@scriptc/compiler 0.1.3 → 0.1.4
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/ambient/scriptc-node-fallback.d.ts +200 -51
- package/dist/backend/c/async.d.ts +25 -0
- package/dist/backend/c/async.js +167 -0
- package/dist/backend/c/async.js.map +1 -1
- package/dist/backend/c/c-emitter.d.ts +10 -0
- package/dist/backend/c/c-emitter.js +14 -2
- package/dist/backend/c/c-emitter.js.map +1 -1
- package/dist/backend/c/exprs.js +293 -51
- package/dist/backend/c/exprs.js.map +1 -1
- package/dist/backend/c/types.js +2 -0
- package/dist/backend/c/types.js.map +1 -1
- package/dist/backend/link-plan.d.ts +2 -1
- package/dist/backend/link-plan.js +2 -1
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/emitter.js +20 -6
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +1 -1
- package/dist/backend/llvm/expr-bytes.js +8 -8
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +9 -0
- package/dist/backend/llvm/expr-callbacks.js +125 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +14 -2
- package/dist/backend/llvm/expr-dispatch.js +1 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +30 -9
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.test.d.ts +1 -0
- package/dist/backend/llvm/expr-primitives.test.js +38 -0
- package/dist/backend/llvm/expr-primitives.test.js.map +1 -0
- package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
- package/dist/backend/llvm/expr-stream-callbacks.js +69 -0
- package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +68 -10
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +18 -2
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +156 -6
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +36 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-stream.js +23 -0
- package/dist/backend/llvm/lib-stream.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +3 -0
- package/dist/backend/native-toolchain.js +3 -1
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +28 -10
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/backend/targets.d.ts +4 -0
- package/dist/backend/targets.js +13 -0
- package/dist/backend/targets.js.map +1 -1
- package/dist/backend/targets.test.js +8 -1
- package/dist/backend/targets.test.js.map +1 -1
- package/dist/coverage/surface-manifest.js +8 -0
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.js +1 -1
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +2 -0
- package/dist/executable/executable-cache.js +3 -0
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/frontend/fork-target.d.ts +17 -0
- package/dist/frontend/fork-target.js +256 -0
- package/dist/frontend/fork-target.js.map +1 -0
- package/dist/frontend/lowering/abstract-equality.d.ts +6 -0
- package/dist/frontend/lowering/abstract-equality.js +250 -0
- package/dist/frontend/lowering/abstract-equality.js.map +1 -0
- package/dist/frontend/lowering/lower-assert.js +71 -2
- package/dist/frontend/lowering/lower-assert.js.map +1 -1
- package/dist/frontend/lowering/lower-builtins.d.ts +50 -23
- package/dist/frontend/lowering/lower-builtins.js +939 -106
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +29 -21
- package/dist/frontend/lowering/lower-calls.js +573 -121
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +39 -8
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.js +150 -0
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.js +212 -21
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +135 -83
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
- package/dist/frontend/lowering/lower-inspect.js +1 -1
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +6 -3
- package/dist/frontend/lowering/lower-island.js +165 -6
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.d.ts +6 -0
- package/dist/frontend/lowering/lower-modules.js +184 -38
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-namespaces.js +7 -0
- package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +1 -1
- package/dist/frontend/lowering/lower-server.js +130 -27
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +118 -15
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +3 -0
- package/dist/frontend/lowering/lower-stream.js +7 -0
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +86 -9
- package/dist/frontend/lowering/lowerer.js +412 -72
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +26 -0
- package/dist/frontend/lowering/surfaces.js +140 -77
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/npm-static-declarations.d.ts +4 -0
- package/dist/frontend/npm-static-declarations.js +56 -0
- package/dist/frontend/npm-static-declarations.js.map +1 -1
- package/dist/frontend/npm-static-declarations.test.js +23 -2
- package/dist/frontend/npm-static-declarations.test.js.map +1 -1
- package/dist/frontend/npm-static.js +6 -5
- package/dist/frontend/npm-static.js.map +1 -1
- package/dist/frontend/npm.d.ts +15 -3
- package/dist/frontend/npm.js +80 -8
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/npm.test.js +76 -9
- package/dist/frontend/npm.test.js.map +1 -1
- package/dist/frontend/program.js +92 -10
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/resolve.d.ts +6 -0
- package/dist/frontend/resolve.js +7 -4
- package/dist/frontend/resolve.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +5 -0
- package/dist/frontend/type-mapper.js +64 -24
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/ir/ir.d.ts +93 -47
- package/dist/ir/ir.js +63 -4
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +14 -1
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/serialize.d.ts +1 -1
- package/dist/ir/serialize.js +1 -1
- package/dist/ir/serialize.js.map +1 -1
- package/dist/ir/validate.js +165 -13
- package/dist/ir/validate.js.map +1 -1
- package/dist/library/int-infer.test.js +4 -4
- package/dist/library/int-infer.test.js.map +1 -1
- package/dist/library/library-cache.test.js +5 -5
- package/dist/library/library-cache.test.js.map +1 -1
- package/package.json +17 -17
- package/surface-manifest.json +132 -38
package/dist/backend/c/exprs.js
CHANGED
|
@@ -547,6 +547,10 @@ function emitLiteralExpr(emitter, e) {
|
|
|
547
547
|
const sym = emitter.internLiteral(e.value);
|
|
548
548
|
return emitter.newTemp(e.type, retainCallC(e.type, `(ScrStr *)&${sym}`));
|
|
549
549
|
}
|
|
550
|
+
case "moduleNsRef": {
|
|
551
|
+
const sym = emitter.internLiteral(`module:${e.moduleId}`);
|
|
552
|
+
return emitter.newTemp(e.type, retainCallC(e.type, `(ScrStr *)&${sym}`));
|
|
553
|
+
}
|
|
550
554
|
case "unitLit":
|
|
551
555
|
// unitLits are consumed inline by the unionWrap case (a unit arm is
|
|
552
556
|
// tag-only); one reaching the generic dispatch escaped its wrap.
|
|
@@ -4016,6 +4020,11 @@ function emitDynamicLibCall(state) {
|
|
|
4016
4020
|
// +1 string or NULL with the exception pending (user
|
|
4017
4021
|
// toString/valueOf throws propagate). Borrows the dyn.
|
|
4018
4022
|
return finish(`scr_dyn_string_coerce_js(${arg(0)})`);
|
|
4023
|
+
case "dyn.toNumberCoerce":
|
|
4024
|
+
// JS ToNumber (number-hint valueOf/toString protocol). A
|
|
4025
|
+
// thrown hook leaves the exception pending; the may-throw
|
|
4026
|
+
// epilogue abandons the NaN dummy.
|
|
4027
|
+
return finish(`scr_dyn_number_coerce(${arg(0)})`);
|
|
4019
4028
|
case "global.undefRead":
|
|
4020
4029
|
// A declare-d const nothing defines: Node's catchable
|
|
4021
4030
|
// ReferenceError at the access (always throws — the typed
|
|
@@ -4103,22 +4112,28 @@ function emitFilesystemLibCall(state) {
|
|
|
4103
4112
|
return finish(`scr_fs_rmdir(${arg(0)})`);
|
|
4104
4113
|
case "fs.readdirSync":
|
|
4105
4114
|
return finish(`scr_fs_readdir(${arg(0)})`);
|
|
4106
|
-
case "fs.readdirTypesSync":
|
|
4115
|
+
case "fs.readdirTypesSync":
|
|
4116
|
+
case "fsp.readdirTypes": {
|
|
4107
4117
|
// Dirent rows assembled inline from one scandir snapshot
|
|
4108
4118
|
// (scr_lib.c) — the os.networkInterfaces pattern, flat. The
|
|
4109
4119
|
// frontend/validator pinned the shape ({%dtype, name,
|
|
4110
|
-
// parentPath}); lookups here only guard emitter bugs. The
|
|
4111
|
-
//
|
|
4112
|
-
//
|
|
4113
|
-
//
|
|
4114
|
-
|
|
4115
|
-
|
|
4116
|
-
|
|
4117
|
-
const
|
|
4120
|
+
// parentPath}); lookups here only guard emitter bugs. The sync
|
|
4121
|
+
// form checks the snapshot's scandir error immediately. The
|
|
4122
|
+
// promise form lets NULL flow through the null-tolerant count/
|
|
4123
|
+
// free accessors, builds an empty dummy array, and moves it to
|
|
4124
|
+
// settled_ref: the pending exception becomes the rejection and
|
|
4125
|
+
// settled_ref releases that dummy.
|
|
4126
|
+
const promiseForm = e.fn === "fsp.readdirTypes";
|
|
4127
|
+
const arrayT = promiseForm && e.type.kind === "promise" ? e.type.inner : e.type;
|
|
4128
|
+
if (arrayT.kind !== "array" || arrayT.elem.kind !== "record") {
|
|
4129
|
+
throw new InternalCompilerError(`emitter bug: ${e.fn} result is not a Dirent record array`);
|
|
4130
|
+
}
|
|
4131
|
+
const recT = arrayT.elem;
|
|
4118
4132
|
const snap = `sc_t${emitter.tempCounter++}`;
|
|
4119
4133
|
emitter.line(`ScrScandir *${snap} = scr_fs_scandir(${arg(0)});${emitter.srcComment(e.loc)}`);
|
|
4120
|
-
|
|
4121
|
-
|
|
4134
|
+
if (!promiseForm)
|
|
4135
|
+
emitter.emitPendingCheck();
|
|
4136
|
+
const out = emitter.newTemp(arrayT, emitter.arrNewC(recT, `scr_fs_scandir_count(${snap})`));
|
|
4122
4137
|
const i = `sc_t${emitter.tempCounter++}`;
|
|
4123
4138
|
const n = `sc_t${emitter.tempCounter++}`;
|
|
4124
4139
|
emitter.line(`for (size_t ${i} = 0, ${n} = scr_fs_scandir_count(${snap}); ${i} < ${n}; ${i}++) {`);
|
|
@@ -4132,6 +4147,11 @@ function emitFilesystemLibCall(state) {
|
|
|
4132
4147
|
emitter.indent--;
|
|
4133
4148
|
emitter.line(`}`);
|
|
4134
4149
|
emitter.line(`scr_fs_scandir_free(${snap});`);
|
|
4150
|
+
if (promiseForm) {
|
|
4151
|
+
const rc = vAdapters(arrayT);
|
|
4152
|
+
emitter.moveTemp(out); // promise fulfillment owns the result array
|
|
4153
|
+
return finish(`scr_promise_settled_ref(${out.name}, &${rc.retain}, &${rc.release}, ${emitter.traceArgC(arrayT)})`);
|
|
4154
|
+
}
|
|
4135
4155
|
return out;
|
|
4136
4156
|
}
|
|
4137
4157
|
// Stats (scr_lib.c): statSync throws like the other sync fs
|
|
@@ -4140,6 +4160,16 @@ function emitFilesystemLibCall(state) {
|
|
|
4140
4160
|
// Throws Node-shaped fs errors (may-throw seed set); the fd
|
|
4141
4161
|
// comes back as f64.
|
|
4142
4162
|
return finish(`scr_fs_open(${arg(0)}, ${arg(1)})`);
|
|
4163
|
+
case "fs.openNumericSync":
|
|
4164
|
+
return finish(`scr_fs_open_numeric(${arg(0)}, ${arg(1)}, ${arg(2)})`);
|
|
4165
|
+
case "fs.fstatSync":
|
|
4166
|
+
return finish(`scr_fs_fstat(${arg(0)})`);
|
|
4167
|
+
case "fs.fchmodSync":
|
|
4168
|
+
return finish(`scr_fs_fchmod(${arg(0)}, ${arg(1)})`);
|
|
4169
|
+
case "fs.fsyncSync":
|
|
4170
|
+
return finish(`scr_fs_fsync(${arg(0)})`);
|
|
4171
|
+
case "fs.linkSync":
|
|
4172
|
+
return finish(`scr_fs_link(${arg(0)}, ${arg(1)})`);
|
|
4143
4173
|
case "fs.readSync":
|
|
4144
4174
|
return finish(`scr_fs_read_sync(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)})`);
|
|
4145
4175
|
case "fs.writeSync":
|
|
@@ -4182,12 +4212,18 @@ function emitFilesystemLibCall(state) {
|
|
|
4182
4212
|
return finish(`scr_stats_atime_ms(${arg(0)})`);
|
|
4183
4213
|
case "stats.mtimeMs":
|
|
4184
4214
|
return finish(`scr_stats_mtime_ms(${arg(0)})`);
|
|
4215
|
+
case "stats.ctimeMs":
|
|
4216
|
+
return finish(`scr_stats_ctime_ms(${arg(0)})`);
|
|
4185
4217
|
case "stats.isFile":
|
|
4186
4218
|
return finish(`scr_stats_is_file(${arg(0)})`);
|
|
4187
4219
|
case "stats.isDirectory":
|
|
4188
4220
|
return finish(`scr_stats_is_dir(${arg(0)})`);
|
|
4189
4221
|
case "stats.size":
|
|
4190
4222
|
return finish(`scr_stats_size(${arg(0)})`);
|
|
4223
|
+
case "stats.dev":
|
|
4224
|
+
return finish(`scr_stats_dev(${arg(0)})`);
|
|
4225
|
+
case "stats.ino":
|
|
4226
|
+
return finish(`scr_stats_ino(${arg(0)})`);
|
|
4191
4227
|
case "fs.toUnixTimestamp":
|
|
4192
4228
|
return finish(`scr_fs_to_unix_timestamp(${arg(0)})`);
|
|
4193
4229
|
// The fs argument-validation ladders: the always-throw Chk
|
|
@@ -4246,6 +4282,43 @@ function emitFilesystemLibCall(state) {
|
|
|
4246
4282
|
return finish(`scr_zlib_deflate(${arg(0)})`);
|
|
4247
4283
|
case "zlib.inflateSync":
|
|
4248
4284
|
return finish(`scr_zlib_inflate(${arg(0)})`);
|
|
4285
|
+
case "zlib.deflateRawSync":
|
|
4286
|
+
return finish(`scr_zlib_deflate_mode(${arg(0)}, 1.0, -1.0)`);
|
|
4287
|
+
case "zlib.inflateRawSync":
|
|
4288
|
+
return finish(`scr_zlib_inflate_mode(${arg(0)}, 1.0)`);
|
|
4289
|
+
case "zlib.gzipSync":
|
|
4290
|
+
return finish(`scr_zlib_deflate_mode(${arg(0)}, 2.0, -1.0)`);
|
|
4291
|
+
case "zlib.gunzipSync":
|
|
4292
|
+
return finish(`scr_zlib_inflate_mode(${arg(0)}, 2.0)`);
|
|
4293
|
+
case "zlib.unzipSync":
|
|
4294
|
+
return finish(`scr_zlib_inflate_mode(${arg(0)}, 3.0)`);
|
|
4295
|
+
case "zlib.crc32":
|
|
4296
|
+
return finish(`scr_zlib_crc32(${arg(0)}, ${arg(1)})`);
|
|
4297
|
+
case "zlib.deflateCb":
|
|
4298
|
+
case "zlib.inflateCb":
|
|
4299
|
+
case "zlib.deflateRawCb":
|
|
4300
|
+
case "zlib.inflateRawCb":
|
|
4301
|
+
case "zlib.gzipCb":
|
|
4302
|
+
case "zlib.gunzipCb":
|
|
4303
|
+
case "zlib.unzipCb": {
|
|
4304
|
+
emitter.usesTimers = true;
|
|
4305
|
+
const cbT = e.args[1].type;
|
|
4306
|
+
if (cbT.kind !== "func")
|
|
4307
|
+
throw new InternalCompilerError("emitter bug: zlib callback not a func");
|
|
4308
|
+
const callback = args[1];
|
|
4309
|
+
emitter.moveTemp(callback);
|
|
4310
|
+
const adapter = emitter.zlibBytesThunkFor(cbT);
|
|
4311
|
+
const compressing = fn === "zlib.deflateCb" || fn === "zlib.deflateRawCb" || fn === "zlib.gzipCb";
|
|
4312
|
+
const mode = fn === "zlib.deflateRawCb" || fn === "zlib.inflateRawCb"
|
|
4313
|
+
? 1
|
|
4314
|
+
: fn === "zlib.gzipCb" || fn === "zlib.gunzipCb"
|
|
4315
|
+
? 2
|
|
4316
|
+
: fn === "zlib.unzipCb"
|
|
4317
|
+
? 3
|
|
4318
|
+
: 0;
|
|
4319
|
+
emitter.line(`scr_zlib_codec_async(${arg(0)}, ${mode}.0, ${compressing ? "true" : "false"}, ${callback.name}, &${adapter});${emitter.srcComment(e.loc)}`);
|
|
4320
|
+
return { name: "", type: e.type };
|
|
4321
|
+
}
|
|
4249
4322
|
case "fsp.readFile":
|
|
4250
4323
|
return finish(`scr_fsp_read_file(${arg(0)})`);
|
|
4251
4324
|
case "fsp.writeFile":
|
|
@@ -4272,6 +4345,10 @@ function emitFilesystemLibCall(state) {
|
|
|
4272
4345
|
return finish(`scr_fsp_rm(${arg(0)})`);
|
|
4273
4346
|
case "fsp.stat":
|
|
4274
4347
|
return finish(`scr_fsp_stat(${arg(0)})`);
|
|
4348
|
+
case "fsp.realpath":
|
|
4349
|
+
return finish(`scr_fsp_realpath(${arg(0)})`);
|
|
4350
|
+
case "fsp.lstat":
|
|
4351
|
+
return finish(`scr_fsp_lstat(${arg(0)})`);
|
|
4275
4352
|
case "fsp.open":
|
|
4276
4353
|
return finish(`scr_fsp_open(${arg(0)}, ${arg(1)}, ${arg(2)})`);
|
|
4277
4354
|
case "fileHandle.fd":
|
|
@@ -4535,10 +4612,18 @@ function emitPathUrlLibCall(state) {
|
|
|
4535
4612
|
return finish(`scr_url_new(${arg(0)})`);
|
|
4536
4613
|
case "url.protocol":
|
|
4537
4614
|
return finish(`scr_url_protocol(${arg(0)})`);
|
|
4615
|
+
case "url.origin":
|
|
4616
|
+
return finish(`scr_url_origin(${arg(0)})`);
|
|
4617
|
+
case "url.username":
|
|
4618
|
+
return finish(`scr_url_username(${arg(0)})`);
|
|
4619
|
+
case "url.password":
|
|
4620
|
+
return finish(`scr_url_password(${arg(0)})`);
|
|
4538
4621
|
case "url.host":
|
|
4539
4622
|
return finish(`scr_url_host(${arg(0)})`);
|
|
4540
4623
|
case "url.hostname":
|
|
4541
4624
|
return finish(`scr_url_hostname(${arg(0)})`);
|
|
4625
|
+
case "url.port":
|
|
4626
|
+
return finish(`scr_url_port(${arg(0)})`);
|
|
4542
4627
|
case "url.pathname":
|
|
4543
4628
|
return finish(`scr_url_pathname(${arg(0)})`);
|
|
4544
4629
|
case "url.href":
|
|
@@ -4572,6 +4657,8 @@ function emitPathUrlLibCall(state) {
|
|
|
4572
4657
|
return finish(`scr_url_search_params(${arg(0)})`);
|
|
4573
4658
|
case "url.search":
|
|
4574
4659
|
return finish(`scr_url_search(${arg(0)})`);
|
|
4660
|
+
case "url.hash":
|
|
4661
|
+
return finish(`scr_url_hash(${arg(0)})`);
|
|
4575
4662
|
case "sp.get": {
|
|
4576
4663
|
// `string | null` — the sym.desc pattern with a null arm: the
|
|
4577
4664
|
// runtime answers a +1 string or NULL.
|
|
@@ -4796,6 +4883,8 @@ function emitPrimitiveLibCall(state) {
|
|
|
4796
4883
|
return finish(`scr_bigint_shr(${arg(0)}, ${arg(1)})`);
|
|
4797
4884
|
case "bigint.eq":
|
|
4798
4885
|
return finish(`scr_bigint_eq(${arg(0)}, ${arg(1)})`);
|
|
4886
|
+
case "bigint.eqString":
|
|
4887
|
+
return finish(`scr_bigint_eq_string(${arg(0)}, ${arg(1)})`);
|
|
4799
4888
|
case "bigint.cmp":
|
|
4800
4889
|
return finish(`scr_bigint_cmp_f64(${arg(0)}, ${arg(1)})`);
|
|
4801
4890
|
case "bigint.cmpNumber":
|
|
@@ -4868,6 +4957,7 @@ function emitPrimitiveLibCall(state) {
|
|
|
4868
4957
|
// +1 string, or Node's "Invalid time value" RangeError
|
|
4869
4958
|
// (may-throw seed set).
|
|
4870
4959
|
return finish(`scr_date_to_iso(${arg(0)})`);
|
|
4960
|
+
case "date.parse":
|
|
4871
4961
|
case "date.parseGetTime":
|
|
4872
4962
|
// The bounded date-string parse (X509 validity + ECMA format);
|
|
4873
4963
|
// NaN elsewhere. Never throws.
|
|
@@ -5244,20 +5334,37 @@ function emitChildProcessLibCall(state) {
|
|
|
5244
5334
|
case "cp.spawn":
|
|
5245
5335
|
emitter.usesTimers = true; // the loop must run to reap the child
|
|
5246
5336
|
return finish(`scr_spawn(${arg(0)}, ${arg(1)})`);
|
|
5337
|
+
case "cp.fork":
|
|
5338
|
+
emitter.usesTimers = true;
|
|
5339
|
+
return finish(`scr_fork(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)}, ${arg(7)})`);
|
|
5247
5340
|
case "cp.spawnOpts":
|
|
5248
5341
|
// The options form: per-slot stdio (ignore/inherit/fd — the
|
|
5249
5342
|
// fds dup2 into the child), detached (setsid), env
|
|
5250
5343
|
// replacement, cwd. Same loop/reap story as cp.spawn.
|
|
5251
5344
|
emitter.usesTimers = true;
|
|
5252
|
-
return finish(`scr_spawn_opts(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)}, ${arg(7)}, ${arg(8)}, ${arg(9)}, ${arg(10)})`);
|
|
5253
|
-
case "
|
|
5345
|
+
return finish(`scr_spawn_opts(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)}, ${arg(7)}, ${arg(8)}, ${arg(9)}, ${arg(10)}, ${arg(11)})`);
|
|
5346
|
+
case "cp.execFile": {
|
|
5347
|
+
const callbackArg = e.args[2];
|
|
5348
|
+
const cb = args[2];
|
|
5349
|
+
if (!callbackArg || !cb)
|
|
5350
|
+
throw new InternalCompilerError("emitter bug: execFile callback missing");
|
|
5351
|
+
const cbT = callbackArg.type;
|
|
5352
|
+
if (cbT.kind !== "func")
|
|
5353
|
+
throw new InternalCompilerError("emitter bug: execFile callback not a func");
|
|
5354
|
+
emitter.moveTemp(cb);
|
|
5355
|
+
const adapter = emitter.execFileThunkFor(cbT);
|
|
5356
|
+
emitter.usesTimers = true;
|
|
5357
|
+
return finish(`scr_exec_file(${arg(0)}, ${arg(1)}, ${cb.name}, &${adapter})`);
|
|
5358
|
+
}
|
|
5359
|
+
case "child.onExit":
|
|
5360
|
+
case "child.onClose": {
|
|
5254
5361
|
// The callback MOVES into the child's registry; the third
|
|
5255
5362
|
// ingredient is the ADAPTER — emitted per callback shape,
|
|
5256
5363
|
// because the `number | null` union's tags are program data
|
|
5257
5364
|
// (a zero-param listener gets the runtime's ignoring thunk).
|
|
5258
5365
|
const cbT = e.args[1].type;
|
|
5259
5366
|
if (cbT.kind !== "func")
|
|
5260
|
-
throw new InternalCompilerError(
|
|
5367
|
+
throw new InternalCompilerError(`emitter bug: ${e.fn} callback not a func`);
|
|
5261
5368
|
const cb = args[1];
|
|
5262
5369
|
emitter.moveTemp(cb);
|
|
5263
5370
|
const adapter = cbT.params.length === 0
|
|
@@ -5265,7 +5372,7 @@ function emitChildProcessLibCall(state) {
|
|
|
5265
5372
|
: cbT.params.length === 1
|
|
5266
5373
|
? emitter.childExitThunkFor(cbT.params[0])
|
|
5267
5374
|
: emitter.childExitSignalThunkFor(cbT.params[0], cbT.params[1]);
|
|
5268
|
-
emitter.line(
|
|
5375
|
+
emitter.line(`${e.fn === "child.onClose" ? "scr_child_on_close" : "scr_child_on_exit"}(${arg(0)}, ${cb.name}, &${adapter});${emitter.srcComment(e.loc)}`);
|
|
5269
5376
|
return { name: "", type: e.type };
|
|
5270
5377
|
}
|
|
5271
5378
|
case "child.onError": {
|
|
@@ -5280,6 +5387,43 @@ function emitChildProcessLibCall(state) {
|
|
|
5280
5387
|
emitter.line(`scr_child_on_error(${arg(0)}, ${cb.name}, &${adapter});${emitter.srcComment(e.loc)}`);
|
|
5281
5388
|
return { name: "", type: e.type };
|
|
5282
5389
|
}
|
|
5390
|
+
case "child.connected":
|
|
5391
|
+
return finish(`scr_child_ipc_connected(${arg(0)})`);
|
|
5392
|
+
case "child.send":
|
|
5393
|
+
emitter.usesTimers = true;
|
|
5394
|
+
return finish(`scr_child_ipc_send(${arg(0)}, ${arg(1)})`);
|
|
5395
|
+
case "child.sendCb": {
|
|
5396
|
+
const cbT = e.args[2].type;
|
|
5397
|
+
if (cbT.kind !== "func")
|
|
5398
|
+
throw new InternalCompilerError("emitter bug: child.send callback not a func");
|
|
5399
|
+
const cb = args[2];
|
|
5400
|
+
emitter.moveTemp(cb);
|
|
5401
|
+
emitter.usesTimers = true;
|
|
5402
|
+
return finish(`scr_child_ipc_send_cb(${arg(0)}, ${arg(1)}, ${cb.name}, &${emitter.ipcSendThunkFor(cbT)})`);
|
|
5403
|
+
}
|
|
5404
|
+
case "child.disconnect":
|
|
5405
|
+
emitter.usesTimers = true;
|
|
5406
|
+
return finish(`scr_child_ipc_disconnect(${arg(0)})`);
|
|
5407
|
+
case "child.onMessage": {
|
|
5408
|
+
const cbT = e.args[1].type;
|
|
5409
|
+
if (cbT.kind !== "func")
|
|
5410
|
+
throw new InternalCompilerError("emitter bug: child message listener not a func");
|
|
5411
|
+
const cb = args[1];
|
|
5412
|
+
emitter.moveTemp(cb);
|
|
5413
|
+
emitter.usesTimers = true;
|
|
5414
|
+
emitter.line(`scr_child_ipc_on_message(${arg(0)}, ${cb.name}, &${emitter.ipcMessageThunkFor(cbT)}, ${arg(2)});${emitter.srcComment(e.loc)}`);
|
|
5415
|
+
return { name: "", type: e.type };
|
|
5416
|
+
}
|
|
5417
|
+
case "child.onDisconnect": {
|
|
5418
|
+
const cbT = e.args[1].type;
|
|
5419
|
+
if (cbT.kind !== "func")
|
|
5420
|
+
throw new InternalCompilerError("emitter bug: child disconnect listener not a func");
|
|
5421
|
+
const cb = args[1];
|
|
5422
|
+
emitter.moveTemp(cb);
|
|
5423
|
+
emitter.usesTimers = true;
|
|
5424
|
+
emitter.line(`scr_child_ipc_on_disconnect(${arg(0)}, ${cb.name}, ${arg(2)});${emitter.srcComment(e.loc)}`);
|
|
5425
|
+
return { name: "", type: e.type };
|
|
5426
|
+
}
|
|
5283
5427
|
default:
|
|
5284
5428
|
throw new InternalCompilerError(`emitter bug: childProcess libCall dispatch for ${fn}`);
|
|
5285
5429
|
}
|
|
@@ -5857,7 +6001,8 @@ function emitHttpLibCall(state) {
|
|
|
5857
6001
|
return finish(`scr_http_req_aborted_flag(${arg(0)})`);
|
|
5858
6002
|
case "http.reqComplete":
|
|
5859
6003
|
return finish(`scr_http_req_complete(${arg(0)})`);
|
|
5860
|
-
case "http.reqHeader":
|
|
6004
|
+
case "http.reqHeader":
|
|
6005
|
+
case "http.reqTrailer": {
|
|
5861
6006
|
// string|undefined, type-directed exactly like process.envGet:
|
|
5862
6007
|
// the runtime answers +1 or NULL; NULL takes the undefined arm.
|
|
5863
6008
|
if (e.type.kind !== "union")
|
|
@@ -5868,12 +6013,29 @@ function emitHttpLibCall(state) {
|
|
|
5868
6013
|
if (strTag < 0 || undefTag < 0) {
|
|
5869
6014
|
throw new InternalCompilerError("emitter bug: http.reqHeader union lacks its arms");
|
|
5870
6015
|
}
|
|
5871
|
-
const
|
|
6016
|
+
const entry = e.fn === "http.reqHeader" ? "scr_http_req_header" : "scr_http_req_trailer";
|
|
6017
|
+
const s = emitter.newTemp(STRING, `${entry}(${arg(0)}, ${arg(1)})`);
|
|
5872
6018
|
emitter.moveTemp(s); // moves into the box when present; NULL otherwise
|
|
5873
6019
|
const present = `scr_union_new_ref(${strTag}, ${s.name}, &scr_str_retain_v, &scr_str_release_v, NULL)`;
|
|
5874
6020
|
const absent = emitter.unitInstanceRef(e.type.unionId, undefTag);
|
|
5875
6021
|
return emitter.newTemp(e.type, `${s.name} ? ${present} : ${absent}`);
|
|
5876
6022
|
}
|
|
6023
|
+
case "http.reqHeaderValues":
|
|
6024
|
+
case "http.reqTrailerValues": {
|
|
6025
|
+
if (e.type.kind !== "union")
|
|
6026
|
+
throw new InternalCompilerError("emitter bug: distinct header result is not a union");
|
|
6027
|
+
const def = emitter.unionsById.get(e.type.unionId);
|
|
6028
|
+
const arrTag = def ? def.arms.findIndex((a) => a.kind === "array") : -1;
|
|
6029
|
+
const undefTag = undefinedArmTag(e.type, emitter.unionsById);
|
|
6030
|
+
if (arrTag < 0 || undefTag < 0)
|
|
6031
|
+
throw new InternalCompilerError("emitter bug: distinct header union lacks its arms");
|
|
6032
|
+
const entry = e.fn === "http.reqHeaderValues" ? "scr_http_req_header_values" : "scr_http_req_trailer_values";
|
|
6033
|
+
const values = emitter.newTemp(arrayOf(STRING), `${entry}(${arg(0)}, ${arg(1)})`);
|
|
6034
|
+
emitter.moveTemp(values);
|
|
6035
|
+
const present = `scr_union_new_ref(${arrTag}, ${values.name}, &scr_arr_retain_v, &scr_arr_release_v, NULL)`;
|
|
6036
|
+
const absent = emitter.unitInstanceRef(e.type.unionId, undefTag);
|
|
6037
|
+
return emitter.newTemp(e.type, `${values.name} ? ${present} : ${absent}`);
|
|
6038
|
+
}
|
|
5877
6039
|
case "http.reqOnData": {
|
|
5878
6040
|
const cbT = e.args[1].type;
|
|
5879
6041
|
if (cbT.kind !== "func")
|
|
@@ -5897,34 +6059,36 @@ function emitHttpLibCall(state) {
|
|
|
5897
6059
|
emitter.line(`scr_http_res_set_header(${arg(0)}, ${arg(1)}, ${arg(2)});${emitter.srcComment(e.loc)}`);
|
|
5898
6060
|
return { name: "", type: e.type };
|
|
5899
6061
|
case "http.resWriteHead":
|
|
5900
|
-
|
|
5901
|
-
return { name: "", type: e.type };
|
|
6062
|
+
return finish(`scr_http_res_write_head(${arg(0)}, ${arg(1)})`);
|
|
5902
6063
|
case "http.resWriteHeadN":
|
|
5903
|
-
|
|
5904
|
-
return { name: "", type: e.type };
|
|
6064
|
+
return finish(`scr_http_res_write_head_n(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)})`);
|
|
5905
6065
|
case "http.resWrite":
|
|
5906
|
-
|
|
5907
|
-
return { name: "", type: e.type };
|
|
6066
|
+
return finish(`scr_http_res_write_str(${arg(0)}, ${arg(1)})`);
|
|
5908
6067
|
case "http.resWriteBytes":
|
|
5909
|
-
|
|
5910
|
-
return { name: "", type: e.type };
|
|
6068
|
+
return finish(`scr_http_res_write_bytes(${arg(0)}, ${arg(1)})`);
|
|
5911
6069
|
case "http.resEnd":
|
|
5912
|
-
|
|
5913
|
-
return { name: "", type: e.type };
|
|
6070
|
+
return finish(`scr_http_res_end(${arg(0)})`);
|
|
5914
6071
|
case "http.resEndStr":
|
|
5915
|
-
|
|
5916
|
-
return { name: "", type: e.type };
|
|
6072
|
+
return finish(`scr_http_res_end_str(${arg(0)}, ${arg(1)})`);
|
|
5917
6073
|
case "http.resEndBytes":
|
|
5918
|
-
|
|
5919
|
-
return { name: "", type: e.type };
|
|
6074
|
+
return finish(`scr_http_res_end_bytes(${arg(0)}, ${arg(1)})`);
|
|
5920
6075
|
case "http.resWriteDyn":
|
|
5921
|
-
|
|
5922
|
-
return { name: "", type: e.type };
|
|
6076
|
+
return finish(`scr_http_res_write_dynv(${arg(0)}, ${arg(1)})`);
|
|
5923
6077
|
case "http.resEndDyn":
|
|
5924
|
-
|
|
5925
|
-
return { name: "", type: e.type };
|
|
6078
|
+
return finish(`scr_http_res_end_dynv(${arg(0)}, ${arg(1)})`);
|
|
5926
6079
|
case "http.resHeadersSent":
|
|
5927
6080
|
return finish(`scr_http_res_headers_sent(${arg(0)})`);
|
|
6081
|
+
case "http.resFlushHeaders":
|
|
6082
|
+
return finish(`scr_http_res_flush_headers(${arg(0)})`);
|
|
6083
|
+
case "http.resAddTrailers":
|
|
6084
|
+
return finish(`scr_http_res_add_trailers(${arg(0)}, ${arg(1)})`);
|
|
6085
|
+
case "http.resCork":
|
|
6086
|
+
emitter.line(`scr_http_res_cork(${arg(0)});${emitter.srcComment(e.loc)}`);
|
|
6087
|
+
return { name: "", type: e.type };
|
|
6088
|
+
case "http.resUncork":
|
|
6089
|
+
return finish(`scr_http_res_uncork(${arg(0)})`);
|
|
6090
|
+
case "http.resWritableCorked":
|
|
6091
|
+
return finish(`scr_http_res_writable_corked(${arg(0)})`);
|
|
5928
6092
|
// The server-surface member follow-ups.
|
|
5929
6093
|
case "http.reqStatusCode": {
|
|
5930
6094
|
// number | undefined, type-directed like process.columns: the
|
|
@@ -5961,8 +6125,12 @@ function emitHttpLibCall(state) {
|
|
|
5961
6125
|
return finish(`scr_http_req_h2_stream_or_throw(${arg(0)}, ${arg(1)})`);
|
|
5962
6126
|
case "http.reqRawHeaders":
|
|
5963
6127
|
return finish(`scr_http_req_raw_headers(${arg(0)})`);
|
|
6128
|
+
case "http.reqRawTrailers":
|
|
6129
|
+
return finish(`scr_http_req_raw_trailers(${arg(0)})`);
|
|
5964
6130
|
case "http.reqHeaderPairs":
|
|
5965
6131
|
return finish(`scr_http_req_header_pairs(${arg(0)})`);
|
|
6132
|
+
case "http.reqTrailerPairs":
|
|
6133
|
+
return finish(`scr_http_req_trailer_pairs(${arg(0)})`);
|
|
5966
6134
|
case "http.reqStatusMessage": {
|
|
5967
6135
|
// string | undefined: a reason phrase on client responses,
|
|
5968
6136
|
// NULL (the undefined arm) on server requests — the
|
|
@@ -6074,6 +6242,9 @@ function emitHttpLibCall(state) {
|
|
|
6074
6242
|
case "http.serverJoinDupHeaders":
|
|
6075
6243
|
emitter.line(`scr_http_server_join_duplicate_headers(${arg(0)});${emitter.srcComment(e.loc)}`);
|
|
6076
6244
|
return { name: "", type: e.type };
|
|
6245
|
+
case "http.serverAllowMissingHostHeader":
|
|
6246
|
+
emitter.line(`scr_http_server_allow_missing_host_header(${arg(0)});${emitter.srcComment(e.loc)}`);
|
|
6247
|
+
return { name: "", type: e.type };
|
|
6077
6248
|
case "http.serverTimeoutGet":
|
|
6078
6249
|
return finish(`scr_net_server_timeout_get(${arg(0)}, ${arg(1)})`);
|
|
6079
6250
|
case "http.serverTimeoutSet":
|
|
@@ -6119,8 +6290,7 @@ function emitHttpLibCall(state) {
|
|
|
6119
6290
|
return { name: "", type: e.type };
|
|
6120
6291
|
}
|
|
6121
6292
|
case "http.resWriteHeadPairs":
|
|
6122
|
-
|
|
6123
|
-
return { name: "", type: e.type };
|
|
6293
|
+
return finish(`scr_http_res_write_head_pairs(${arg(0)}, ${arg(1)}, ${arg(2)})`);
|
|
6124
6294
|
case "http.resWriteHeadDyn":
|
|
6125
6295
|
return finish(`scr_http_res_write_head_dyn(${arg(0)}, ${arg(1)}, ${arg(2)})`);
|
|
6126
6296
|
case "http.reqSetEncoding":
|
|
@@ -6293,26 +6463,30 @@ function emitHttpLibCall(state) {
|
|
|
6293
6463
|
return finish(`(${arg(0)} ? scr_https_request(${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)}, ${arg(7)}, ${arg(8)}, (const char *)${arg(9)}->data, ${arg(9)}->len, ${cbExpr}, ${adapter}) : scr_http_request_ex(${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)}, ${arg(7)}, ${cbExpr}, ${adapter}, 80, NULL, NULL))`);
|
|
6294
6464
|
}
|
|
6295
6465
|
case "http.clientWrite":
|
|
6296
|
-
|
|
6297
|
-
return { name: "", type: e.type };
|
|
6466
|
+
return finish(`scr_http_client_write_str(${arg(0)}, ${arg(1)})`);
|
|
6298
6467
|
case "http.clientWriteBytes":
|
|
6299
|
-
|
|
6300
|
-
return { name: "", type: e.type };
|
|
6468
|
+
return finish(`scr_http_client_write_bytes(${arg(0)}, ${arg(1)})`);
|
|
6301
6469
|
case "http.clientEnd":
|
|
6302
|
-
|
|
6303
|
-
return { name: "", type: e.type };
|
|
6470
|
+
return finish(`scr_http_client_end(${arg(0)})`);
|
|
6304
6471
|
case "http.clientEndStr":
|
|
6305
|
-
|
|
6306
|
-
return { name: "", type: e.type };
|
|
6472
|
+
return finish(`scr_http_client_end_str(${arg(0)}, ${arg(1)})`);
|
|
6307
6473
|
case "http.clientEndBytes":
|
|
6308
|
-
|
|
6309
|
-
return { name: "", type: e.type };
|
|
6474
|
+
return finish(`scr_http_client_end_bytes(${arg(0)}, ${arg(1)})`);
|
|
6310
6475
|
case "http.clientWriteDyn":
|
|
6311
|
-
|
|
6312
|
-
return { name: "", type: e.type };
|
|
6476
|
+
return finish(`scr_http_client_write_dynv(${arg(0)}, ${arg(1)})`);
|
|
6313
6477
|
case "http.clientEndDyn":
|
|
6314
|
-
|
|
6315
|
-
|
|
6478
|
+
return finish(`scr_http_client_end_dynv(${arg(0)}, ${arg(1)})`);
|
|
6479
|
+
case "http.clientFlushHeaders":
|
|
6480
|
+
return finish(`scr_http_client_flush_headers(${arg(0)})`);
|
|
6481
|
+
case "http.clientAddTrailers":
|
|
6482
|
+
return finish(`scr_http_client_add_trailers(${arg(0)}, ${arg(1)})`);
|
|
6483
|
+
case "http.clientCork":
|
|
6484
|
+
emitter.line(`scr_http_client_cork(${arg(0)});${emitter.srcComment(e.loc)}`);
|
|
6485
|
+
return { name: "", type: e.type };
|
|
6486
|
+
case "http.clientUncork":
|
|
6487
|
+
return finish(`scr_http_client_uncork(${arg(0)})`);
|
|
6488
|
+
case "http.clientWritableCorked":
|
|
6489
|
+
return finish(`scr_http_client_writable_corked(${arg(0)})`);
|
|
6316
6490
|
case "http.clientDestroy":
|
|
6317
6491
|
emitter.line(`scr_http_client_destroy(${arg(0)});${emitter.srcComment(e.loc)}`);
|
|
6318
6492
|
return { name: "", type: e.type };
|
|
@@ -7126,6 +7300,45 @@ function emitProcessLibCall(state) {
|
|
|
7126
7300
|
return finish(`scr_process_getgid()`);
|
|
7127
7301
|
case "process.execPath":
|
|
7128
7302
|
return finish(`scr_process_exec_path()`);
|
|
7303
|
+
case "process.forkTarget":
|
|
7304
|
+
return finish(`scr_process_fork_target(${arg(0)})`);
|
|
7305
|
+
case "process.connected":
|
|
7306
|
+
return finish(`scr_process_ipc_connected()`);
|
|
7307
|
+
case "process.send":
|
|
7308
|
+
emitter.usesTimers = true;
|
|
7309
|
+
return finish(`scr_process_ipc_send(${arg(0)})`);
|
|
7310
|
+
case "process.sendCb": {
|
|
7311
|
+
const cbT = e.args[1].type;
|
|
7312
|
+
if (cbT.kind !== "func")
|
|
7313
|
+
throw new InternalCompilerError("emitter bug: process.send callback not a func");
|
|
7314
|
+
const cb = args[1];
|
|
7315
|
+
emitter.moveTemp(cb);
|
|
7316
|
+
emitter.usesTimers = true;
|
|
7317
|
+
return finish(`scr_process_ipc_send_cb(${arg(0)}, ${cb.name}, &${emitter.ipcSendThunkFor(cbT)})`);
|
|
7318
|
+
}
|
|
7319
|
+
case "process.disconnect":
|
|
7320
|
+
emitter.usesTimers = true;
|
|
7321
|
+
return finish(`scr_process_ipc_disconnect()`);
|
|
7322
|
+
case "process.onMessage": {
|
|
7323
|
+
const cbT = e.args[0].type;
|
|
7324
|
+
if (cbT.kind !== "func")
|
|
7325
|
+
throw new InternalCompilerError("emitter bug: process message listener not a func");
|
|
7326
|
+
const cb = args[0];
|
|
7327
|
+
emitter.moveTemp(cb);
|
|
7328
|
+
emitter.usesTimers = true;
|
|
7329
|
+
emitter.line(`scr_process_ipc_on_message(${cb.name}, &${emitter.ipcMessageThunkFor(cbT)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
|
|
7330
|
+
return { name: "", type: e.type };
|
|
7331
|
+
}
|
|
7332
|
+
case "process.onDisconnect": {
|
|
7333
|
+
const cbT = e.args[0].type;
|
|
7334
|
+
if (cbT.kind !== "func")
|
|
7335
|
+
throw new InternalCompilerError("emitter bug: process disconnect listener not a func");
|
|
7336
|
+
const cb = args[0];
|
|
7337
|
+
emitter.moveTemp(cb);
|
|
7338
|
+
emitter.usesTimers = true;
|
|
7339
|
+
emitter.line(`scr_process_ipc_on_disconnect(${cb.name}, ${arg(1)});${emitter.srcComment(e.loc)}`);
|
|
7340
|
+
return { name: "", type: e.type };
|
|
7341
|
+
}
|
|
7129
7342
|
case "process.arch":
|
|
7130
7343
|
return finish(`scr_process_arch()`);
|
|
7131
7344
|
case "process.versionsNode":
|
|
@@ -7149,6 +7362,10 @@ function emitProcessLibCall(state) {
|
|
|
7149
7362
|
// Flushes stdout and _Exit()s — never returns (exit handlers,
|
|
7150
7363
|
// including the RC audit, deliberately do not run).
|
|
7151
7364
|
return finish(`scr_process_exit(${arg(0)})`);
|
|
7365
|
+
case "process.setExitCode":
|
|
7366
|
+
return finish(`scr_process_set_exit_code(${arg(0)})`);
|
|
7367
|
+
case "process.currentExitCode":
|
|
7368
|
+
return finish(`scr_process_exit_code_or_zero()`);
|
|
7152
7369
|
case "process.nextTick": {
|
|
7153
7370
|
// The tick queue owns the callback until the drain fires it;
|
|
7154
7371
|
// ticks run before promise jobs at every loop checkpoint and
|
|
@@ -7362,6 +7579,8 @@ function emitErrorsEventsLibCall(state) {
|
|
|
7362
7579
|
const dynThunk = emitter.emitterInvokeThunkFor(adT);
|
|
7363
7580
|
return finish(`(${cType(e.type).trim()})scr_emitter_on_dyn((ScrEmitter *)${arg(0)}, ${arg(1)}, ${arg(2)}, ${adapter.name}, &${dynThunk}, ${arg(4)}, ${arg(5)})`);
|
|
7364
7581
|
}
|
|
7582
|
+
case "emitter.onFlex":
|
|
7583
|
+
return finish(`(${cType(e.type).trim()})scr_emitter_on_flex((ScrEmitter *)${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)})`);
|
|
7365
7584
|
case "emitter.onData": {
|
|
7366
7585
|
// The stream-'data' registration: same runtime entry as
|
|
7367
7586
|
// emitter.on, but the DATA invoke thunk (the two-slot payload
|
|
@@ -7401,6 +7620,13 @@ function emitErrorsEventsLibCall(state) {
|
|
|
7401
7620
|
// C variadic tail, every argument borrowed (the invoke
|
|
7402
7621
|
// adapters retain each callee's +1). May-throw (listeners).
|
|
7403
7622
|
return finish(`scr_emitter_emit((ScrEmitter *)${arg(0)}, ${arg(1)}${e.args.slice(2).map((_, i) => `, ${arg(i + 2)}`).join("")})`);
|
|
7623
|
+
case "emitter.emitFlex": {
|
|
7624
|
+
const count = e.args.length - 2;
|
|
7625
|
+
const payload = count === 0
|
|
7626
|
+
? "NULL"
|
|
7627
|
+
: `(ScrDyn *const[]){${e.args.slice(2).map((_, i) => arg(i + 2)).join(", ")}}`;
|
|
7628
|
+
return finish(`scr_emitter_emit_flex((ScrEmitter *)${arg(0)}, ${arg(1)}, ${payload}, ${count})`);
|
|
7629
|
+
}
|
|
7404
7630
|
case "emitter.emitError":
|
|
7405
7631
|
// emit('error', err): unhandled ⇒ the runtime throws the
|
|
7406
7632
|
// payload through the exception cell (may-throw seed).
|
|
@@ -7479,12 +7705,25 @@ function emitStreamLibCall(state) {
|
|
|
7479
7705
|
emitter.line(`scr_child_stream_on_data(${arg(0)}, ${cb.name}, &${adapter}, ${arg(2)});${emitter.srcComment(e.loc)}`);
|
|
7480
7706
|
return { name: "", type: e.type };
|
|
7481
7707
|
}
|
|
7708
|
+
case "stream.onDataStr": {
|
|
7709
|
+
emitter.usesTimers = true;
|
|
7710
|
+
const cbT = e.args[1].type;
|
|
7711
|
+
if (cbT.kind !== "func" || cbT.params[0]?.kind !== "string") {
|
|
7712
|
+
throw new InternalCompilerError("emitter bug: stream.onDataStr callback not a string func");
|
|
7713
|
+
}
|
|
7714
|
+
const cb = args[1];
|
|
7715
|
+
emitter.moveTemp(cb);
|
|
7716
|
+
emitter.line(`scr_child_stream_on_data_str(${arg(0)}, ${cb.name}, &scr_child_stream_thunk_str, ${arg(2)});${emitter.srcComment(e.loc)}`);
|
|
7717
|
+
return { name: "", type: e.type };
|
|
7718
|
+
}
|
|
7482
7719
|
case "stream.onEnd": {
|
|
7483
7720
|
const cb = args[1];
|
|
7484
7721
|
emitter.moveTemp(cb);
|
|
7485
7722
|
emitter.line(`scr_child_stream_on_end(${arg(0)}, ${cb.name}, ${arg(2)});${emitter.srcComment(e.loc)}`);
|
|
7486
7723
|
return { name: "", type: e.type };
|
|
7487
7724
|
}
|
|
7725
|
+
case "stream.childSetEncoding":
|
|
7726
|
+
return finish(`scr_child_stream_set_encoding(${arg(0)}, ${arg(1)})`);
|
|
7488
7727
|
// node:stream (scr_stream.c — linked exactly when these appear,
|
|
7489
7728
|
// moduleUsesStream). Receivers reinterpret to the shared
|
|
7490
7729
|
// ScrStream layout (the ScrEmitter prefix plus the stream-state
|
|
@@ -7895,6 +8134,8 @@ function emitAssertInspectLibCall(state) {
|
|
|
7895
8134
|
// The quartet over checked-dynamic operands: SameValue /
|
|
7896
8135
|
// dyn-walk deep equality, assertion_error.js messages.
|
|
7897
8136
|
return finish(`scr_assert_eq_dyn(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)})`);
|
|
8137
|
+
case "assert.looseResult":
|
|
8138
|
+
return finish(`scr_assert_loose_result(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)})`);
|
|
7898
8139
|
case "assert.deepResult":
|
|
7899
8140
|
return finish(`scr_assert_deep_result(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)})`);
|
|
7900
8141
|
case "assert.deqEnter":
|
|
@@ -8175,6 +8416,7 @@ export function emitExpr(emitter, e) {
|
|
|
8175
8416
|
case "numLit":
|
|
8176
8417
|
case "boolLit":
|
|
8177
8418
|
case "strLit":
|
|
8419
|
+
case "moduleNsRef":
|
|
8178
8420
|
case "unitLit":
|
|
8179
8421
|
case "varRef":
|
|
8180
8422
|
return emitLiteralExpr(emitter, e);
|