@scriptc/compiler 0.0.12 → 0.0.14

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 (46) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +162 -19
  2. package/dist/backend/cc.d.ts +8 -0
  3. package/dist/backend/cc.js +12 -0
  4. package/dist/backend/cc.js.map +1 -1
  5. package/dist/backend/emission/emit-exprs.js +146 -16
  6. package/dist/backend/emission/emit-exprs.js.map +1 -1
  7. package/dist/backend/llvm/emitter.js +54 -7
  8. package/dist/backend/llvm/emitter.js.map +1 -1
  9. package/dist/frontend/lowering/crypto-tables.d.ts +7 -0
  10. package/dist/frontend/lowering/crypto-tables.js +139 -0
  11. package/dist/frontend/lowering/crypto-tables.js.map +1 -0
  12. package/dist/frontend/lowering/lower-builtins.d.ts +38 -20
  13. package/dist/frontend/lowering/lower-builtins.js +111 -39
  14. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  15. package/dist/frontend/lowering/lower-calls.js +8 -0
  16. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  17. package/dist/frontend/lowering/lower-classes.js +10 -2
  18. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  19. package/dist/frontend/lowering/lower-exprs.js +69 -7
  20. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  21. package/dist/frontend/lowering/lower-modules.js +1 -1
  22. package/dist/frontend/lowering/lower-modules.js.map +1 -1
  23. package/dist/frontend/lowering/lower-server.d.ts +21 -0
  24. package/dist/frontend/lowering/lower-server.js +294 -23
  25. package/dist/frontend/lowering/lower-server.js.map +1 -1
  26. package/dist/frontend/lowering/lower-stmts.js +4 -4
  27. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  28. package/dist/frontend/lowering/lower-stream.js +1 -1
  29. package/dist/frontend/lowering/lower-stream.js.map +1 -1
  30. package/dist/frontend/lowering/lowerer.d.ts +21 -3
  31. package/dist/frontend/lowering/lowerer.js +48 -8
  32. package/dist/frontend/lowering/lowerer.js.map +1 -1
  33. package/dist/frontend/lowering/surfaces.d.ts +6 -0
  34. package/dist/frontend/lowering/surfaces.js +76 -0
  35. package/dist/frontend/lowering/surfaces.js.map +1 -1
  36. package/dist/frontend/types.js +12 -0
  37. package/dist/frontend/types.js.map +1 -1
  38. package/dist/index.js +6 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/ir/nodes.d.ts +103 -9
  41. package/dist/ir/nodes.js +56 -1
  42. package/dist/ir/nodes.js.map +1 -1
  43. package/dist/ir/validate.js +55 -4
  44. package/dist/ir/validate.js.map +1 -1
  45. package/package.json +2 -2
  46. package/surface-manifest.json +286 -1
@@ -441,14 +441,25 @@ export function emitExpr(E, e) {
441
441
  E.line(`${cDecl(e.type, name)};`);
442
442
  E.line(`if (${E.unionTruthyHelper(e.left.type.unionId)}(${l.name})) {`);
443
443
  E.indent++;
444
- const arm = e.type;
445
- const read = arm.kind === "f64"
446
- ? `scr_union_get_f64(${l.name})`
447
- : arm.kind === "bool"
448
- ? `scr_union_get_bool(${l.name})`
449
- : retainCallC(arm, `(${cType(arm).trim()})scr_union_peek(${l.name})`);
450
- E.line(`${name} = ${read};`);
451
- E.releaseValue(l.name, e.left.type);
444
+ if (e.retag !== undefined) {
445
+ // The helper CONSUMES the left box (callees own their params), so
446
+ // no release on this side — the falsy side still owns and frees it.
447
+ // An unwind here produces the NULL dummy and never reaches the
448
+ // frame push below, so the slot needs no early registration.
449
+ E.line(`${name} = ${E.callTargetC(e.retag)}(${l.name});`);
450
+ if (E.mayThrow.has(e.retag))
451
+ E.emitPendingCheck();
452
+ }
453
+ else {
454
+ const arm = e.type;
455
+ const read = arm.kind === "f64"
456
+ ? `scr_union_get_f64(${l.name})`
457
+ : arm.kind === "bool"
458
+ ? `scr_union_get_bool(${l.name})`
459
+ : retainCallC(arm, `(${cType(arm).trim()})scr_union_peek(${l.name})`);
460
+ E.line(`${name} = ${read};`);
461
+ E.releaseValue(l.name, e.left.type);
462
+ }
452
463
  E.indent--;
453
464
  E.line(`} else {`);
454
465
  E.indent++;
@@ -2237,6 +2248,10 @@ export function emitExpr(E, e) {
2237
2248
  // Object.defineProperties over dyn values: both borrowed,
2238
2249
  // result the target (+1); throws catchably (may-throw seed).
2239
2250
  return finish(`scr_dyn_define_props(${arg(0)}, ${arg(1)})`);
2251
+ case "dyn.hasKey":
2252
+ // `k in v` with a runtime key: the dyn presence answer (both
2253
+ // borrowed, no allocation, never throws).
2254
+ return finish(`scr_dyn_has_key(${arg(0)}, ${arg(1)})`);
2240
2255
  case "dyn.keySet":
2241
2256
  // Keyed write on a dyn receiver: all three borrowed (the
2242
2257
  // member retains the value in); throws Node's TypeErrors on
@@ -3169,6 +3184,25 @@ export function emitExpr(E, e) {
3169
3184
  case "net.sockDestroy":
3170
3185
  E.line(`scr_net_sock_destroy(${arg(0)});${E.srcComment(e.loc)}`);
3171
3186
  return { name: "", type: e.type };
3187
+ case "net.sockPause":
3188
+ return finish(`scr_net_sock_pause(${arg(0)})`);
3189
+ case "net.sockResume":
3190
+ return finish(`scr_net_sock_resume(${arg(0)})`);
3191
+ case "net.sockSetNoDelay":
3192
+ return finish(`scr_net_sock_set_nodelay(${arg(0)}, ${arg(1)})`);
3193
+ case "net.sockDestroySoon":
3194
+ E.line(`scr_net_sock_destroy_soon(${arg(0)});${E.srcComment(e.loc)}`);
3195
+ return { name: "", type: e.type };
3196
+ case "net.sockBytesWritten":
3197
+ return finish(`scr_net_sock_bytes_written(${arg(0)})`);
3198
+ case "net.sockReadable":
3199
+ return finish(`scr_net_sock_readable(${arg(0)})`);
3200
+ case "net.sockOnFinish": {
3201
+ const cb = args[1];
3202
+ E.moveTemp(cb);
3203
+ E.line(`scr_net_sock_on_finish(${arg(0)}, ${cb.name});${E.srcComment(e.loc)}`);
3204
+ return { name: "", type: e.type };
3205
+ }
3172
3206
  case "net.sockPipe":
3173
3207
  E.line(`scr_net_sock_pipe(${arg(0)}, ${arg(1)});${E.srcComment(e.loc)}`);
3174
3208
  return { name: "", type: e.type };
@@ -3180,7 +3214,8 @@ export function emitExpr(E, e) {
3180
3214
  E.moveTemp(cb);
3181
3215
  const adapter = cbT.params.length === 0 ? "scr_net_data_thunk0"
3182
3216
  : cbT.params[0].kind === "dyn" ? "scr_net_data_thunk_dyn"
3183
- : "scr_net_data_thunk_bytes";
3217
+ : cbT.params[0].kind === "string" ? "scr_net_data_thunk_str"
3218
+ : "scr_net_data_thunk_bytes";
3184
3219
  E.line(`scr_net_sock_on_data(${arg(0)}, ${cb.name}, &${adapter}, ${arg(2)});${E.srcComment(e.loc)}`);
3185
3220
  return { name: "", type: e.type };
3186
3221
  }
@@ -3406,7 +3441,8 @@ export function emitExpr(E, e) {
3406
3441
  E.moveTemp(cb);
3407
3442
  const adapter = cbT.params.length === 0 ? "scr_net_data_thunk0"
3408
3443
  : cbT.params[0].kind === "dyn" ? "scr_net_data_thunk_dyn"
3409
- : "scr_net_data_thunk_bytes";
3444
+ : cbT.params[0].kind === "string" ? "scr_net_data_thunk_str"
3445
+ : "scr_net_data_thunk_bytes";
3410
3446
  E.line(`scr_http_req_on_data(${arg(0)}, ${cb.name}, &${adapter}, ${arg(2)});${E.srcComment(e.loc)}`);
3411
3447
  return { name: "", type: e.type };
3412
3448
  }
@@ -3726,21 +3762,44 @@ export function emitExpr(E, e) {
3726
3762
  }
3727
3763
  return finish(`scr_http_request(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)}, ${cbExpr}, ${adapter})`);
3728
3764
  }
3765
+ case "http.agentNew":
3766
+ E.usesTimers = true; // queued dials hold the loop open
3767
+ return finish(`scr_http_agent_new(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)})`);
3768
+ case "http.requestAgent":
3769
+ case "http.requestAgentCb": {
3770
+ E.usesTimers = true;
3771
+ let cbExpr = "NULL";
3772
+ let adapter = "NULL";
3773
+ if (e.fn === "http.requestAgentCb") {
3774
+ const cbT = e.args[8].type;
3775
+ if (cbT.kind !== "func")
3776
+ throw new Error("emitter bug: http.requestAgentCb callback not a func");
3777
+ const cb = args[8];
3778
+ E.moveTemp(cb);
3779
+ cbExpr = cb.name;
3780
+ adapter = cbT.params.length === 0 ? "&scr_http_resp_thunk0" : "&scr_http_resp_thunk_res";
3781
+ }
3782
+ return finish(`scr_http_request_agent(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)}, ${arg(7)}, ${cbExpr}, ${adapter})`);
3783
+ }
3729
3784
  case "http.requestUrl":
3730
- case "http.requestUrlCb": {
3785
+ case "http.requestUrlCb":
3786
+ case "https.requestUrl":
3787
+ case "https.requestUrlCb": {
3731
3788
  E.usesTimers = true; // an in-flight request holds the loop open
3789
+ const tls = e.fn.startsWith("https.");
3732
3790
  let cbExpr = "NULL";
3733
3791
  let adapter = "NULL";
3734
- if (e.fn === "http.requestUrlCb") {
3792
+ if (e.fn.endsWith("Cb")) {
3735
3793
  const cbT = e.args[3].type;
3736
3794
  if (cbT.kind !== "func")
3737
- throw new Error("emitter bug: http.requestUrlCb callback not a func");
3795
+ throw new Error(`emitter bug: ${e.fn} callback not a func`);
3738
3796
  const cb = args[3];
3739
3797
  E.moveTemp(cb);
3740
3798
  cbExpr = cb.name;
3741
3799
  adapter = cbT.params.length === 0 ? "&scr_http_resp_thunk0" : "&scr_http_resp_thunk_res";
3742
3800
  }
3743
- return finish(`scr_http_request_url(${arg(0)}, ${arg(1)}, ${arg(2)}, ${cbExpr}, ${adapter})`);
3801
+ const entry = tls ? "scr_https_request_url" : "scr_http_request_url";
3802
+ return finish(`${entry}(${arg(0)}, ${arg(1)}, ${arg(2)}, ${cbExpr}, ${adapter})`);
3744
3803
  }
3745
3804
  case "http.requestConn":
3746
3805
  case "http.requestConnCb": {
@@ -3892,6 +3951,42 @@ export function emitExpr(E, e) {
3892
3951
  // 'stream'/'session' listeners, exactly the h2c surface.
3893
3952
  E.usesTimers = true;
3894
3953
  return finish(`scr_http2_create_secure_server((const char *)${arg(0)}->data, ${arg(0)}->len, (const char *)${arg(1)}->data, ${arg(1)}->len)`);
3954
+ case "http2.createSecureServerReq":
3955
+ case "http2.createSecureServerH2Req": {
3956
+ // createSecureServer(options, handler): the eager COMPAT
3957
+ // handler is the first 'request' listener on either flavor
3958
+ // (the createServerReq adapter family).
3959
+ E.usesTimers = true;
3960
+ const cbT = e.args[2].type;
3961
+ if (cbT.kind !== "func")
3962
+ throw new Error(`emitter bug: ${e.fn} handler not a func`);
3963
+ const cb = args[2];
3964
+ E.moveTemp(cb);
3965
+ const adapter = cbT.params.length === 2 ? "scr_http_handler_thunk2"
3966
+ : cbT.params.length === 1 ? "scr_http_handler_thunk1"
3967
+ : "scr_http_handler_thunk0";
3968
+ const certKey = `(const char *)${arg(0)}->data, ${arg(0)}->len, (const char *)${arg(1)}->data, ${arg(1)}->len`;
3969
+ return finish(fn === "http2.createSecureServerReq"
3970
+ ? `scr_https_create_server(${certKey}, ${cb.name}, &${adapter})`
3971
+ : `scr_http2_create_secure_server_req(${certKey}, ${cb.name}, &${adapter})`);
3972
+ }
3973
+ case "http2.createSecureServerDyn":
3974
+ // The runtime options record: allowHTTP1/cert/key read at
3975
+ // runtime (may-throw — the divergence-66 walk).
3976
+ E.usesTimers = true;
3977
+ return finish(`scr_http2_create_secure_server_dyn(${arg(0)}, NULL, NULL)`);
3978
+ case "http2.createSecureServerDynCb": {
3979
+ E.usesTimers = true;
3980
+ const cbT = e.args[1].type;
3981
+ if (cbT.kind !== "func")
3982
+ throw new Error("emitter bug: createSecureServerDynCb handler not a func");
3983
+ const cb = args[1];
3984
+ E.moveTemp(cb);
3985
+ const adapter = cbT.params.length === 2 ? "scr_http_handler_thunk2"
3986
+ : cbT.params.length === 1 ? "scr_http_handler_thunk1"
3987
+ : "scr_http_handler_thunk0";
3988
+ return finish(`scr_http2_create_secure_server_dyn(${arg(0)}, ${cb.name}, &${adapter})`);
3989
+ }
3895
3990
  case "http2.createSecureServerSni": {
3896
3991
  // The SNI form: the runtime parses each connection's
3897
3992
  // ClientHello for server_name BEFORE the handshake, calls the
@@ -3942,6 +4037,15 @@ export function emitExpr(E, e) {
3942
4037
  case "tls.caCertsChk":
3943
4038
  // Always throws (validation error or the trailing fence).
3944
4039
  return finish(`(scr_tls_ca_certs_chk(${arg(0)}, ${arg(1)}), ${isRefCounted(e.type) ? `(${cType(e.type).trim()})NULL` : "0"})`);
4040
+ // The CA-store introspection unit (scr_tls_ca.c): cached
4041
+ // per-type PEM string arrays (+1 retained answers), and the
4042
+ // default-set replacement. get/set are may-throw seeds.
4043
+ case "tlsca.get":
4044
+ return finish(`scr_tls_ca_get(${arg(0)})`);
4045
+ case "tlsca.root":
4046
+ return finish(`scr_tls_ca_root()`);
4047
+ case "tlsca.set":
4048
+ return finish(`scr_tls_ca_set_default(${arg(0)})`);
3945
4049
  case "http.serverOnRequest": {
3946
4050
  const cbT = e.args[1].type;
3947
4051
  if (cbT.kind !== "func")
@@ -4174,7 +4278,8 @@ export function emitExpr(E, e) {
4174
4278
  E.moveTemp(cb);
4175
4279
  const adapter = cbT.params.length === 0 ? "scr_net_data_thunk0"
4176
4280
  : cbT.params[0].kind === "dyn" ? "scr_net_data_thunk_dyn"
4177
- : "scr_net_data_thunk_bytes";
4281
+ : cbT.params[0].kind === "string" ? "scr_net_data_thunk_str"
4282
+ : "scr_net_data_thunk_bytes";
4178
4283
  E.line(`scr_http2_stream_on_data(${arg(0)}, ${cb.name}, &${adapter}, ${arg(2)});${E.srcComment(e.loc)}`);
4179
4284
  return { name: "", type: e.type };
4180
4285
  }
@@ -4240,6 +4345,22 @@ export function emitExpr(E, e) {
4240
4345
  }
4241
4346
  return finish(`scr_https_request(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)}, ${arg(7)}, (const char *)${arg(8)}->data, ${arg(8)}->len, ${cbExpr}, ${adapter})`);
4242
4347
  }
4348
+ case "https.requestAgent":
4349
+ case "https.requestAgentCb": {
4350
+ E.usesTimers = true; // an in-flight request holds the loop open
4351
+ let cbExpr = "NULL";
4352
+ let adapter = "NULL";
4353
+ if (e.fn === "https.requestAgentCb") {
4354
+ const cbT = e.args[10].type;
4355
+ if (cbT.kind !== "func")
4356
+ throw new Error("emitter bug: https.requestAgentCb callback not a func");
4357
+ const cb = args[10];
4358
+ E.moveTemp(cb);
4359
+ cbExpr = cb.name;
4360
+ adapter = cbT.params.length === 0 ? "&scr_http_resp_thunk0" : "&scr_http_resp_thunk_res";
4361
+ }
4362
+ return finish(`scr_https_request_agent(${arg(0)}, ${arg(1)}, ${arg(2)}, ${arg(3)}, ${arg(4)}, ${arg(5)}, ${arg(6)}, ${arg(7)}, (const char *)${arg(8)}->data, ${arg(8)}->len, ${arg(9)}, ${cbExpr}, ${adapter})`);
4363
+ }
4243
4364
  case "https.requestFn":
4244
4365
  case "https.requestFnCb": {
4245
4366
  // The requestFn binding's runtime dial: arg 0 picks the client
@@ -4509,7 +4630,16 @@ export function emitExpr(E, e) {
4509
4630
  case "process.onUnhandledRejection":
4510
4631
  // The report at loop end dispatches the listeners.
4511
4632
  E.usesTimers = true;
4512
- return finish(`scr_process_on_unhandled_rejection(${arg(0)})`);
4633
+ return finish(`scr_process_on_unhandled_rejection(${arg(0)}, ${arg(1)})`);
4634
+ case "process.offUnhandledRejection":
4635
+ return finish(`scr_process_off_unhandled_rejection(${arg(0)})`);
4636
+ case "process.onRejectionHandled":
4637
+ // Fires (if ever) during the loop-end report's listener
4638
+ // dispatch — the loop must be live for the report to run.
4639
+ E.usesTimers = true;
4640
+ return finish(`scr_process_on_rejection_handled(${arg(0)}, ${arg(1)})`);
4641
+ case "process.offRejectionHandled":
4642
+ return finish(`scr_process_off_rejection_handled(${arg(0)})`);
4513
4643
  case "fsp.readFile":
4514
4644
  return finish(`scr_fsp_read_file(${arg(0)})`);
4515
4645
  case "fsp.writeFile":