@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.
Files changed (147) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +200 -51
  2. package/dist/backend/c/async.d.ts +25 -0
  3. package/dist/backend/c/async.js +167 -0
  4. package/dist/backend/c/async.js.map +1 -1
  5. package/dist/backend/c/c-emitter.d.ts +10 -0
  6. package/dist/backend/c/c-emitter.js +14 -2
  7. package/dist/backend/c/c-emitter.js.map +1 -1
  8. package/dist/backend/c/exprs.js +293 -51
  9. package/dist/backend/c/exprs.js.map +1 -1
  10. package/dist/backend/c/types.js +2 -0
  11. package/dist/backend/c/types.js.map +1 -1
  12. package/dist/backend/link-plan.d.ts +2 -1
  13. package/dist/backend/link-plan.js +2 -1
  14. package/dist/backend/link-plan.js.map +1 -1
  15. package/dist/backend/llvm/emitter.js +20 -6
  16. package/dist/backend/llvm/emitter.js.map +1 -1
  17. package/dist/backend/llvm/expr-bytes.d.ts +1 -1
  18. package/dist/backend/llvm/expr-bytes.js +8 -8
  19. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  20. package/dist/backend/llvm/expr-callbacks.d.ts +9 -0
  21. package/dist/backend/llvm/expr-callbacks.js +125 -0
  22. package/dist/backend/llvm/expr-callbacks.js.map +1 -1
  23. package/dist/backend/llvm/expr-context.d.ts +14 -2
  24. package/dist/backend/llvm/expr-dispatch.js +1 -0
  25. package/dist/backend/llvm/expr-dispatch.js.map +1 -1
  26. package/dist/backend/llvm/expr-primitives.d.ts +1 -1
  27. package/dist/backend/llvm/expr-primitives.js +30 -9
  28. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  29. package/dist/backend/llvm/expr-primitives.test.d.ts +1 -0
  30. package/dist/backend/llvm/expr-primitives.test.js +38 -0
  31. package/dist/backend/llvm/expr-primitives.test.js.map +1 -0
  32. package/dist/backend/llvm/expr-stream-callbacks.d.ts +3 -0
  33. package/dist/backend/llvm/expr-stream-callbacks.js +69 -0
  34. package/dist/backend/llvm/expr-stream-callbacks.js.map +1 -1
  35. package/dist/backend/llvm/lib-filesystem.js +68 -10
  36. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  37. package/dist/backend/llvm/lib-network.js +18 -2
  38. package/dist/backend/llvm/lib-network.js.map +1 -1
  39. package/dist/backend/llvm/lib-process.js +156 -6
  40. package/dist/backend/llvm/lib-process.js.map +1 -1
  41. package/dist/backend/llvm/lib-shared.js +36 -0
  42. package/dist/backend/llvm/lib-shared.js.map +1 -1
  43. package/dist/backend/llvm/lib-stream.js +23 -0
  44. package/dist/backend/llvm/lib-stream.js.map +1 -1
  45. package/dist/backend/native-toolchain.d.ts +3 -0
  46. package/dist/backend/native-toolchain.js +3 -1
  47. package/dist/backend/native-toolchain.js.map +1 -1
  48. package/dist/backend/runtime-pack.test.js +28 -10
  49. package/dist/backend/runtime-pack.test.js.map +1 -1
  50. package/dist/backend/targets.d.ts +4 -0
  51. package/dist/backend/targets.js +13 -0
  52. package/dist/backend/targets.js.map +1 -1
  53. package/dist/backend/targets.test.js +8 -1
  54. package/dist/backend/targets.test.js.map +1 -1
  55. package/dist/coverage/surface-manifest.js +8 -0
  56. package/dist/coverage/surface-manifest.js.map +1 -1
  57. package/dist/diagnostics/diagnostic.js +1 -1
  58. package/dist/diagnostics/diagnostic.js.map +1 -1
  59. package/dist/executable/executable-cache.d.ts +2 -0
  60. package/dist/executable/executable-cache.js +3 -0
  61. package/dist/executable/executable-cache.js.map +1 -1
  62. package/dist/frontend/fork-target.d.ts +17 -0
  63. package/dist/frontend/fork-target.js +256 -0
  64. package/dist/frontend/fork-target.js.map +1 -0
  65. package/dist/frontend/lowering/abstract-equality.d.ts +6 -0
  66. package/dist/frontend/lowering/abstract-equality.js +250 -0
  67. package/dist/frontend/lowering/abstract-equality.js.map +1 -0
  68. package/dist/frontend/lowering/lower-assert.js +71 -2
  69. package/dist/frontend/lowering/lower-assert.js.map +1 -1
  70. package/dist/frontend/lowering/lower-builtins.d.ts +50 -23
  71. package/dist/frontend/lowering/lower-builtins.js +939 -106
  72. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  73. package/dist/frontend/lowering/lower-calls.d.ts +29 -21
  74. package/dist/frontend/lowering/lower-calls.js +573 -121
  75. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  76. package/dist/frontend/lowering/lower-classes.js +39 -8
  77. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  78. package/dist/frontend/lowering/lower-containers.js +150 -0
  79. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  80. package/dist/frontend/lowering/lower-event-emitter.js +212 -21
  81. package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
  82. package/dist/frontend/lowering/lower-exprs.js +135 -83
  83. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  84. package/dist/frontend/lowering/lower-inspect.d.ts +4 -0
  85. package/dist/frontend/lowering/lower-inspect.js +1 -1
  86. package/dist/frontend/lowering/lower-inspect.js.map +1 -1
  87. package/dist/frontend/lowering/lower-island.d.ts +6 -3
  88. package/dist/frontend/lowering/lower-island.js +165 -6
  89. package/dist/frontend/lowering/lower-island.js.map +1 -1
  90. package/dist/frontend/lowering/lower-modules.d.ts +6 -0
  91. package/dist/frontend/lowering/lower-modules.js +184 -38
  92. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  93. package/dist/frontend/lowering/lower-namespaces.js +7 -0
  94. package/dist/frontend/lowering/lower-namespaces.js.map +1 -1
  95. package/dist/frontend/lowering/lower-server.d.ts +1 -1
  96. package/dist/frontend/lowering/lower-server.js +130 -27
  97. package/dist/frontend/lowering/lower-server.js.map +1 -1
  98. package/dist/frontend/lowering/lower-stmts.js +118 -15
  99. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  100. package/dist/frontend/lowering/lower-stream.d.ts +3 -0
  101. package/dist/frontend/lowering/lower-stream.js +7 -0
  102. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  103. package/dist/frontend/lowering/lowerer.d.ts +86 -9
  104. package/dist/frontend/lowering/lowerer.js +412 -72
  105. package/dist/frontend/lowering/lowerer.js.map +1 -1
  106. package/dist/frontend/lowering/surfaces.d.ts +26 -0
  107. package/dist/frontend/lowering/surfaces.js +140 -77
  108. package/dist/frontend/lowering/surfaces.js.map +1 -1
  109. package/dist/frontend/npm-static-declarations.d.ts +4 -0
  110. package/dist/frontend/npm-static-declarations.js +56 -0
  111. package/dist/frontend/npm-static-declarations.js.map +1 -1
  112. package/dist/frontend/npm-static-declarations.test.js +23 -2
  113. package/dist/frontend/npm-static-declarations.test.js.map +1 -1
  114. package/dist/frontend/npm-static.js +6 -5
  115. package/dist/frontend/npm-static.js.map +1 -1
  116. package/dist/frontend/npm.d.ts +15 -3
  117. package/dist/frontend/npm.js +80 -8
  118. package/dist/frontend/npm.js.map +1 -1
  119. package/dist/frontend/npm.test.js +76 -9
  120. package/dist/frontend/npm.test.js.map +1 -1
  121. package/dist/frontend/program.js +92 -10
  122. package/dist/frontend/program.js.map +1 -1
  123. package/dist/frontend/resolve.d.ts +6 -0
  124. package/dist/frontend/resolve.js +7 -4
  125. package/dist/frontend/resolve.js.map +1 -1
  126. package/dist/frontend/type-mapper.d.ts +5 -0
  127. package/dist/frontend/type-mapper.js +64 -24
  128. package/dist/frontend/type-mapper.js.map +1 -1
  129. package/dist/index.d.ts +5 -0
  130. package/dist/index.js +24 -3
  131. package/dist/index.js.map +1 -1
  132. package/dist/ir/ir.d.ts +93 -47
  133. package/dist/ir/ir.js +63 -4
  134. package/dist/ir/ir.js.map +1 -1
  135. package/dist/ir/ir.test.js +14 -1
  136. package/dist/ir/ir.test.js.map +1 -1
  137. package/dist/ir/serialize.d.ts +1 -1
  138. package/dist/ir/serialize.js +1 -1
  139. package/dist/ir/serialize.js.map +1 -1
  140. package/dist/ir/validate.js +165 -13
  141. package/dist/ir/validate.js.map +1 -1
  142. package/dist/library/int-infer.test.js +4 -4
  143. package/dist/library/int-infer.test.js.map +1 -1
  144. package/dist/library/library-cache.test.js +5 -5
  145. package/dist/library/library-cache.test.js.map +1 -1
  146. package/package.json +17 -17
  147. package/surface-manifest.json +132 -38
@@ -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
- // snapshot call throws Node's scandir error (may-throw seed
4112
- // set) and answers NULL then, so the pending check runs
4113
- // before any allocation.
4114
- if (e.type.kind !== "array" || e.type.elem.kind !== "record") {
4115
- throw new InternalCompilerError("emitter bug: readdirTypesSync result is not a record array");
4116
- }
4117
- const recT = e.type.elem;
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
- emitter.emitPendingCheck();
4121
- const out = emitter.newTemp(e.type, emitter.arrNewC(recT, `scr_fs_scandir_count(${snap})`));
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 "child.onExit": {
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("emitter bug: child.onExit callback not a func");
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(`scr_child_on_exit(${arg(0)}, ${cb.name}, &${adapter});${emitter.srcComment(e.loc)}`);
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 s = emitter.newTemp(STRING, `scr_http_req_header(${arg(0)}, ${arg(1)})`);
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
- emitter.line(`scr_http_res_write_head(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
5901
- return { name: "", type: e.type };
6062
+ return finish(`scr_http_res_write_head(${arg(0)}, ${arg(1)})`);
5902
6063
  case "http.resWriteHeadN":
5903
- emitter.line(`scr_http_res_write_head_n(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)});${emitter.srcComment(e.loc)}`);
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
- emitter.line(`scr_http_res_write_str(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
5907
- return { name: "", type: e.type };
6066
+ return finish(`scr_http_res_write_str(${arg(0)}, ${arg(1)})`);
5908
6067
  case "http.resWriteBytes":
5909
- emitter.line(`scr_http_res_write_bytes(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
5910
- return { name: "", type: e.type };
6068
+ return finish(`scr_http_res_write_bytes(${arg(0)}, ${arg(1)})`);
5911
6069
  case "http.resEnd":
5912
- emitter.line(`scr_http_res_end(${arg(0)});${emitter.srcComment(e.loc)}`);
5913
- return { name: "", type: e.type };
6070
+ return finish(`scr_http_res_end(${arg(0)})`);
5914
6071
  case "http.resEndStr":
5915
- emitter.line(`scr_http_res_end_str(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
5916
- return { name: "", type: e.type };
6072
+ return finish(`scr_http_res_end_str(${arg(0)}, ${arg(1)})`);
5917
6073
  case "http.resEndBytes":
5918
- emitter.line(`scr_http_res_end_bytes(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
5919
- return { name: "", type: e.type };
6074
+ return finish(`scr_http_res_end_bytes(${arg(0)}, ${arg(1)})`);
5920
6075
  case "http.resWriteDyn":
5921
- emitter.line(`scr_http_res_write_dynv(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
5922
- return { name: "", type: e.type };
6076
+ return finish(`scr_http_res_write_dynv(${arg(0)}, ${arg(1)})`);
5923
6077
  case "http.resEndDyn":
5924
- emitter.line(`scr_http_res_end_dynv(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
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
- emitter.line(`scr_http_res_write_head_pairs(${arg(0)}, ${arg(1)}, ${arg(2)});${emitter.srcComment(e.loc)}`);
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
- emitter.line(`scr_http_client_write_str(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
6297
- return { name: "", type: e.type };
6466
+ return finish(`scr_http_client_write_str(${arg(0)}, ${arg(1)})`);
6298
6467
  case "http.clientWriteBytes":
6299
- emitter.line(`scr_http_client_write_bytes(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
6300
- return { name: "", type: e.type };
6468
+ return finish(`scr_http_client_write_bytes(${arg(0)}, ${arg(1)})`);
6301
6469
  case "http.clientEnd":
6302
- emitter.line(`scr_http_client_end(${arg(0)});${emitter.srcComment(e.loc)}`);
6303
- return { name: "", type: e.type };
6470
+ return finish(`scr_http_client_end(${arg(0)})`);
6304
6471
  case "http.clientEndStr":
6305
- emitter.line(`scr_http_client_end_str(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
6306
- return { name: "", type: e.type };
6472
+ return finish(`scr_http_client_end_str(${arg(0)}, ${arg(1)})`);
6307
6473
  case "http.clientEndBytes":
6308
- emitter.line(`scr_http_client_end_bytes(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
6309
- return { name: "", type: e.type };
6474
+ return finish(`scr_http_client_end_bytes(${arg(0)}, ${arg(1)})`);
6310
6475
  case "http.clientWriteDyn":
6311
- emitter.line(`scr_http_client_write_dynv(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
6312
- return { name: "", type: e.type };
6476
+ return finish(`scr_http_client_write_dynv(${arg(0)}, ${arg(1)})`);
6313
6477
  case "http.clientEndDyn":
6314
- emitter.line(`scr_http_client_end_dynv(${arg(0)}, ${arg(1)});${emitter.srcComment(e.loc)}`);
6315
- return { name: "", type: e.type };
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);