@scriptc/compiler 0.0.12 → 0.0.13
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 +141 -15
- package/dist/backend/cc.d.ts +8 -0
- package/dist/backend/cc.js +12 -0
- package/dist/backend/cc.js.map +1 -1
- package/dist/backend/emission/emit-exprs.js +138 -12
- package/dist/backend/emission/emit-exprs.js.map +1 -1
- package/dist/backend/llvm/emitter.js +43 -6
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/frontend/lowering/crypto-tables.d.ts +7 -0
- package/dist/frontend/lowering/crypto-tables.js +139 -0
- package/dist/frontend/lowering/crypto-tables.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +38 -20
- package/dist/frontend/lowering/lower-builtins.js +111 -39
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +8 -0
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +10 -2
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +69 -7
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +1 -1
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +21 -0
- package/dist/frontend/lowering/lower-server.js +267 -12
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +4 -4
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.js +1 -1
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +21 -3
- package/dist/frontend/lowering/lowerer.js +48 -8
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +6 -0
- package/dist/frontend/lowering/surfaces.js +76 -0
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/types.js +12 -0
- package/dist/frontend/types.js.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/ir/nodes.d.ts +99 -9
- package/dist/ir/nodes.js +52 -1
- package/dist/ir/nodes.js.map +1 -1
- package/dist/ir/validate.js +52 -4
- package/dist/ir/validate.js.map +1 -1
- package/package.json +2 -2
- 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
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
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
|
-
: "
|
|
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
|
-
: "
|
|
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,6 +3762,25 @@ 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
3785
|
case "http.requestUrlCb": {
|
|
3731
3786
|
E.usesTimers = true; // an in-flight request holds the loop open
|
|
@@ -3892,6 +3947,42 @@ export function emitExpr(E, e) {
|
|
|
3892
3947
|
// 'stream'/'session' listeners, exactly the h2c surface.
|
|
3893
3948
|
E.usesTimers = true;
|
|
3894
3949
|
return finish(`scr_http2_create_secure_server((const char *)${arg(0)}->data, ${arg(0)}->len, (const char *)${arg(1)}->data, ${arg(1)}->len)`);
|
|
3950
|
+
case "http2.createSecureServerReq":
|
|
3951
|
+
case "http2.createSecureServerH2Req": {
|
|
3952
|
+
// createSecureServer(options, handler): the eager COMPAT
|
|
3953
|
+
// handler is the first 'request' listener on either flavor
|
|
3954
|
+
// (the createServerReq adapter family).
|
|
3955
|
+
E.usesTimers = true;
|
|
3956
|
+
const cbT = e.args[2].type;
|
|
3957
|
+
if (cbT.kind !== "func")
|
|
3958
|
+
throw new Error(`emitter bug: ${e.fn} handler not a func`);
|
|
3959
|
+
const cb = args[2];
|
|
3960
|
+
E.moveTemp(cb);
|
|
3961
|
+
const adapter = cbT.params.length === 2 ? "scr_http_handler_thunk2"
|
|
3962
|
+
: cbT.params.length === 1 ? "scr_http_handler_thunk1"
|
|
3963
|
+
: "scr_http_handler_thunk0";
|
|
3964
|
+
const certKey = `(const char *)${arg(0)}->data, ${arg(0)}->len, (const char *)${arg(1)}->data, ${arg(1)}->len`;
|
|
3965
|
+
return finish(fn === "http2.createSecureServerReq"
|
|
3966
|
+
? `scr_https_create_server(${certKey}, ${cb.name}, &${adapter})`
|
|
3967
|
+
: `scr_http2_create_secure_server_req(${certKey}, ${cb.name}, &${adapter})`);
|
|
3968
|
+
}
|
|
3969
|
+
case "http2.createSecureServerDyn":
|
|
3970
|
+
// The runtime options record: allowHTTP1/cert/key read at
|
|
3971
|
+
// runtime (may-throw — the divergence-66 walk).
|
|
3972
|
+
E.usesTimers = true;
|
|
3973
|
+
return finish(`scr_http2_create_secure_server_dyn(${arg(0)}, NULL, NULL)`);
|
|
3974
|
+
case "http2.createSecureServerDynCb": {
|
|
3975
|
+
E.usesTimers = true;
|
|
3976
|
+
const cbT = e.args[1].type;
|
|
3977
|
+
if (cbT.kind !== "func")
|
|
3978
|
+
throw new Error("emitter bug: createSecureServerDynCb handler not a func");
|
|
3979
|
+
const cb = args[1];
|
|
3980
|
+
E.moveTemp(cb);
|
|
3981
|
+
const adapter = cbT.params.length === 2 ? "scr_http_handler_thunk2"
|
|
3982
|
+
: cbT.params.length === 1 ? "scr_http_handler_thunk1"
|
|
3983
|
+
: "scr_http_handler_thunk0";
|
|
3984
|
+
return finish(`scr_http2_create_secure_server_dyn(${arg(0)}, ${cb.name}, &${adapter})`);
|
|
3985
|
+
}
|
|
3895
3986
|
case "http2.createSecureServerSni": {
|
|
3896
3987
|
// The SNI form: the runtime parses each connection's
|
|
3897
3988
|
// ClientHello for server_name BEFORE the handshake, calls the
|
|
@@ -3942,6 +4033,15 @@ export function emitExpr(E, e) {
|
|
|
3942
4033
|
case "tls.caCertsChk":
|
|
3943
4034
|
// Always throws (validation error or the trailing fence).
|
|
3944
4035
|
return finish(`(scr_tls_ca_certs_chk(${arg(0)}, ${arg(1)}), ${isRefCounted(e.type) ? `(${cType(e.type).trim()})NULL` : "0"})`);
|
|
4036
|
+
// The CA-store introspection unit (scr_tls_ca.c): cached
|
|
4037
|
+
// per-type PEM string arrays (+1 retained answers), and the
|
|
4038
|
+
// default-set replacement. get/set are may-throw seeds.
|
|
4039
|
+
case "tlsca.get":
|
|
4040
|
+
return finish(`scr_tls_ca_get(${arg(0)})`);
|
|
4041
|
+
case "tlsca.root":
|
|
4042
|
+
return finish(`scr_tls_ca_root()`);
|
|
4043
|
+
case "tlsca.set":
|
|
4044
|
+
return finish(`scr_tls_ca_set_default(${arg(0)})`);
|
|
3945
4045
|
case "http.serverOnRequest": {
|
|
3946
4046
|
const cbT = e.args[1].type;
|
|
3947
4047
|
if (cbT.kind !== "func")
|
|
@@ -4174,7 +4274,8 @@ export function emitExpr(E, e) {
|
|
|
4174
4274
|
E.moveTemp(cb);
|
|
4175
4275
|
const adapter = cbT.params.length === 0 ? "scr_net_data_thunk0"
|
|
4176
4276
|
: cbT.params[0].kind === "dyn" ? "scr_net_data_thunk_dyn"
|
|
4177
|
-
: "
|
|
4277
|
+
: cbT.params[0].kind === "string" ? "scr_net_data_thunk_str"
|
|
4278
|
+
: "scr_net_data_thunk_bytes";
|
|
4178
4279
|
E.line(`scr_http2_stream_on_data(${arg(0)}, ${cb.name}, &${adapter}, ${arg(2)});${E.srcComment(e.loc)}`);
|
|
4179
4280
|
return { name: "", type: e.type };
|
|
4180
4281
|
}
|
|
@@ -4240,6 +4341,22 @@ export function emitExpr(E, e) {
|
|
|
4240
4341
|
}
|
|
4241
4342
|
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
4343
|
}
|
|
4344
|
+
case "https.requestAgent":
|
|
4345
|
+
case "https.requestAgentCb": {
|
|
4346
|
+
E.usesTimers = true; // an in-flight request holds the loop open
|
|
4347
|
+
let cbExpr = "NULL";
|
|
4348
|
+
let adapter = "NULL";
|
|
4349
|
+
if (e.fn === "https.requestAgentCb") {
|
|
4350
|
+
const cbT = e.args[10].type;
|
|
4351
|
+
if (cbT.kind !== "func")
|
|
4352
|
+
throw new Error("emitter bug: https.requestAgentCb callback not a func");
|
|
4353
|
+
const cb = args[10];
|
|
4354
|
+
E.moveTemp(cb);
|
|
4355
|
+
cbExpr = cb.name;
|
|
4356
|
+
adapter = cbT.params.length === 0 ? "&scr_http_resp_thunk0" : "&scr_http_resp_thunk_res";
|
|
4357
|
+
}
|
|
4358
|
+
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})`);
|
|
4359
|
+
}
|
|
4243
4360
|
case "https.requestFn":
|
|
4244
4361
|
case "https.requestFnCb": {
|
|
4245
4362
|
// The requestFn binding's runtime dial: arg 0 picks the client
|
|
@@ -4509,7 +4626,16 @@ export function emitExpr(E, e) {
|
|
|
4509
4626
|
case "process.onUnhandledRejection":
|
|
4510
4627
|
// The report at loop end dispatches the listeners.
|
|
4511
4628
|
E.usesTimers = true;
|
|
4512
|
-
return finish(`scr_process_on_unhandled_rejection(${arg(0)})`);
|
|
4629
|
+
return finish(`scr_process_on_unhandled_rejection(${arg(0)}, ${arg(1)})`);
|
|
4630
|
+
case "process.offUnhandledRejection":
|
|
4631
|
+
return finish(`scr_process_off_unhandled_rejection(${arg(0)})`);
|
|
4632
|
+
case "process.onRejectionHandled":
|
|
4633
|
+
// Fires (if ever) during the loop-end report's listener
|
|
4634
|
+
// dispatch — the loop must be live for the report to run.
|
|
4635
|
+
E.usesTimers = true;
|
|
4636
|
+
return finish(`scr_process_on_rejection_handled(${arg(0)}, ${arg(1)})`);
|
|
4637
|
+
case "process.offRejectionHandled":
|
|
4638
|
+
return finish(`scr_process_off_rejection_handled(${arg(0)})`);
|
|
4513
4639
|
case "fsp.readFile":
|
|
4514
4640
|
return finish(`scr_fsp_read_file(${arg(0)})`);
|
|
4515
4641
|
case "fsp.writeFile":
|