@scriptc/compiler 0.1.4 → 0.1.6
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 +75 -11
- package/dist/backend/c/c-emitter.d.ts +5 -1
- package/dist/backend/c/c-emitter.js +22 -9
- package/dist/backend/c/c-emitter.js.map +1 -1
- package/dist/backend/c/exprs.d.ts +2 -2
- package/dist/backend/c/exprs.js +298 -27
- package/dist/backend/c/exprs.js.map +1 -1
- package/dist/backend/c/stmts.js +5 -3
- package/dist/backend/c/stmts.js.map +1 -1
- package/dist/backend/c/types.d.ts +2 -3
- package/dist/backend/c/types.js +8 -1
- package/dist/backend/c/types.js.map +1 -1
- package/dist/backend/c/walkers.js +1 -1
- package/dist/backend/c/walkers.js.map +1 -1
- package/dist/backend/link-plan.d.ts +1 -0
- package/dist/backend/link-plan.js +2 -1
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/llvm/dyn.js +1 -1
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.js +25 -9
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +1 -2
- package/dist/backend/llvm/expr-bytes.js +22 -17
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +1 -0
- package/dist/backend/llvm/expr-containers.js +58 -4
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +6 -2
- package/dist/backend/llvm/expr-primitives.js +22 -7
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +20 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +53 -10
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +4 -3
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +65 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/native-toolchain.d.ts +2 -0
- package/dist/backend/native-toolchain.js +2 -1
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/targets.d.ts +3 -0
- package/dist/backend/targets.js +13 -0
- package/dist/backend/targets.js.map +1 -1
- package/dist/coverage/surface-manifest.js +12 -5
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/executable/executable-cache.d.ts +2 -0
- package/dist/executable/executable-cache.js +3 -1
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +3 -3
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/lowering/array-indexed-mutation.d.ts +8 -0
- package/dist/frontend/lowering/array-indexed-mutation.js +176 -0
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -0
- package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
- package/dist/frontend/lowering/containers/bytes.js +6 -5
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -6
- package/dist/frontend/lowering/containers/string-and-regexp.js +420 -34
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +8 -0
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/indexed-comparison.d.ts +6 -0
- package/dist/frontend/lowering/indexed-comparison.js +30 -0
- package/dist/frontend/lowering/indexed-comparison.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +5 -6
- package/dist/frontend/lowering/lower-builtins.js +24 -16
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +3 -2
- package/dist/frontend/lowering/lower-calls.js +522 -89
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +5 -29
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +15 -11
- package/dist/frontend/lowering/lower-containers.js +588 -146
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +12 -0
- package/dist/frontend/lowering/lower-exprs.js +145 -11
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-island.js +17 -6
- package/dist/frontend/lowering/lower-island.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +2 -4
- package/dist/frontend/lowering/lower-server.js +288 -32
- 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/lowerer.js +37 -2
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/optional-arguments.d.ts +9 -1
- package/dist/frontend/lowering/optional-arguments.js +67 -1
- package/dist/frontend/lowering/optional-arguments.js.map +1 -1
- package/dist/frontend/lowering/pairs-snapshot.d.ts +3 -1
- package/dist/frontend/lowering/pairs-snapshot.js +12 -4
- package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +10 -14
- package/dist/frontend/lowering/surfaces.js +50 -28
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/npm-static-prune.d.ts +6 -0
- package/dist/frontend/npm-static-prune.js +203 -0
- package/dist/frontend/npm-static-prune.js.map +1 -0
- package/dist/frontend/npm-static-prune.test.d.ts +1 -0
- package/dist/frontend/npm-static-prune.test.js +48 -0
- package/dist/frontend/npm-static-prune.test.js.map +1 -0
- package/dist/frontend/npm.js +7 -6
- package/dist/frontend/npm.js.map +1 -1
- package/dist/frontend/program.js +15 -4
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/provenance.js +8 -3
- package/dist/frontend/provenance.js.map +1 -1
- package/dist/frontend/type-mapper.js +16 -5
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +13 -41
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +5 -3
- package/dist/ir/analysis.js +25 -11
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +50 -2
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/constant-tables.d.ts +17 -0
- package/dist/ir/constant-tables.js +99 -0
- package/dist/ir/constant-tables.js.map +1 -0
- package/dist/ir/constant-tables.test.d.ts +1 -0
- package/dist/ir/constant-tables.test.js +78 -0
- package/dist/ir/constant-tables.test.js.map +1 -0
- package/dist/ir/integer-ranges.d.ts +13 -0
- package/dist/ir/integer-ranges.js +122 -0
- package/dist/ir/integer-ranges.js.map +1 -0
- package/dist/ir/integer-ranges.test.d.ts +1 -0
- package/dist/ir/integer-ranges.test.js +63 -0
- package/dist/ir/integer-ranges.test.js.map +1 -0
- package/dist/ir/ir.d.ts +56 -35
- package/dist/ir/ir.js +9 -1
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/ir.test.js +6 -0
- package/dist/ir/ir.test.js.map +1 -1
- package/dist/ir/scalar-records.d.ts +8 -0
- package/dist/ir/scalar-records.js +216 -0
- package/dist/ir/scalar-records.js.map +1 -0
- package/dist/ir/scalar-records.test.d.ts +1 -0
- package/dist/ir/scalar-records.test.js +142 -0
- package/dist/ir/scalar-records.test.js.map +1 -0
- package/dist/ir/validate.js +135 -34
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.d.ts +1 -0
- package/dist/ir/validate.test.js +48 -0
- package/dist/ir/validate.test.js.map +1 -0
- package/dist/library/cache-primitives.d.ts +1 -1
- package/dist/library/cache-primitives.js +3 -3
- package/dist/library/cache-primitives.js.map +1 -1
- package/dist/library/fence-eval.js +11 -4
- package/dist/library/fence-eval.js.map +1 -1
- package/dist/library/library-cache.js +0 -1
- package/dist/library/library-cache.js.map +1 -1
- package/dist/library/library-cache.test.js +3 -3
- package/dist/library/library-cache.test.js.map +1 -1
- package/package.json +17 -17
- package/surface-manifest.json +90 -45
|
@@ -2228,6 +2228,7 @@ declare module "net" {
|
|
|
2228
2228
|
once(event: "session", listener: (session: Buffer) => void): void;
|
|
2229
2229
|
}
|
|
2230
2230
|
export interface Server {
|
|
2231
|
+
readonly listening: boolean;
|
|
2231
2232
|
/* Node answers the server itself (`return this` chaining). */
|
|
2232
2233
|
listen(port: number, callback?: () => void): Server;
|
|
2233
2234
|
/* The positional bind address (the options form's host in argument
|
|
@@ -2246,6 +2247,7 @@ declare module "net" {
|
|
|
2246
2247
|
emit(event: "connection", socket: Socket): boolean;
|
|
2247
2248
|
on(event: "connection" | "secureConnection", listener: (socket: Socket) => void): void;
|
|
2248
2249
|
on(event: "close" | "listening", listener: () => void): void;
|
|
2250
|
+
on(event: "timeout", listener: (socket: Socket) => void): void;
|
|
2249
2251
|
on(event: "error", listener: (err: Error) => void): void;
|
|
2250
2252
|
/* The WebSocket handover: fires INSTEAD of 'request' for
|
|
2251
2253
|
* Connection: upgrade requests, with the raw socket + head bytes. */
|
|
@@ -2256,11 +2258,13 @@ declare module "net" {
|
|
|
2256
2258
|
/* addListener IS on (Node aliases them) — the suite spells both. */
|
|
2257
2259
|
addListener(event: "connection" | "secureConnection", listener: (socket: Socket) => void): void;
|
|
2258
2260
|
addListener(event: "close" | "listening", listener: () => void): void;
|
|
2261
|
+
addListener(event: "timeout", listener: (socket: Socket) => void): void;
|
|
2259
2262
|
addListener(event: "error", listener: (err: Error) => void): void;
|
|
2260
2263
|
addListener(event: "upgrade", listener: (req: import("http").IncomingMessage, socket: Socket, head: Buffer) => void): void;
|
|
2261
2264
|
addListener(event: "request", listener: (req: import("http").IncomingMessage, res: import("http").ServerResponse) => void): void;
|
|
2262
2265
|
once(event: "connection" | "secureConnection", listener: (socket: Socket) => void): void;
|
|
2263
2266
|
once(event: "close" | "listening", listener: () => void): void;
|
|
2267
|
+
once(event: "timeout", listener: (socket: Socket) => void): void;
|
|
2264
2268
|
once(event: "error", listener: (err: Error) => void): void;
|
|
2265
2269
|
once(event: "upgrade", listener: (req: import("http").IncomingMessage, socket: Socket, head: Buffer) => void): void;
|
|
2266
2270
|
once(event: "request", listener: (req: import("http").IncomingMessage, res: import("http").ServerResponse) => void): void;
|
|
@@ -2317,8 +2321,14 @@ declare module "node:net" {
|
|
|
2317
2321
|
* connection per call (no agent pooling) with Node's exact wire head. */
|
|
2318
2322
|
declare module "http" {
|
|
2319
2323
|
import { Server as NetServer, Socket } from "net";
|
|
2324
|
+
export const METHODS: string[];
|
|
2325
|
+
export const STATUS_CODES: { [status: number]: string | undefined };
|
|
2326
|
+
export const maxHeaderSize: number;
|
|
2320
2327
|
export interface Server extends NetServer {
|
|
2321
2328
|
timeout: number;
|
|
2329
|
+
setTimeout(msecs: number, callback?: (socket: Socket) => void): this;
|
|
2330
|
+
closeAllConnections(): void;
|
|
2331
|
+
closeIdleConnections(): void;
|
|
2322
2332
|
keepAliveTimeout: number;
|
|
2323
2333
|
keepAliveTimeoutBuffer: number;
|
|
2324
2334
|
headersTimeout: number;
|
|
@@ -2356,9 +2366,13 @@ declare module "http" {
|
|
|
2356
2366
|
export interface IncomingMessage {
|
|
2357
2367
|
readonly url: string;
|
|
2358
2368
|
readonly method: string;
|
|
2369
|
+
readonly httpVersion: string;
|
|
2370
|
+
readonly complete: boolean;
|
|
2371
|
+
readonly aborted: boolean;
|
|
2359
2372
|
readonly statusCode: number | undefined;
|
|
2360
2373
|
readonly statusMessage: string | undefined;
|
|
2361
2374
|
readonly socket: Socket;
|
|
2375
|
+
readonly connection: Socket;
|
|
2362
2376
|
readonly headers: { [name: string]: string | undefined };
|
|
2363
2377
|
readonly headersDistinct: { [name: string]: string[] | undefined };
|
|
2364
2378
|
readonly rawHeaders: string[];
|
|
@@ -2367,51 +2381,67 @@ declare module "http" {
|
|
|
2367
2381
|
readonly rawTrailers: string[];
|
|
2368
2382
|
resume(): void;
|
|
2369
2383
|
destroy(): void;
|
|
2384
|
+
setTimeout(msecs: number, callback?: () => void): this;
|
|
2370
2385
|
/* setEncoding('utf8'): 'data' delivers strings (other real encodings
|
|
2371
2386
|
* fence loudly at runtime; unknown names throw ERR_UNKNOWN_ENCODING). */
|
|
2372
2387
|
setEncoding(encoding: string): void;
|
|
2373
2388
|
/* The proxy legs: the body streams into a ServerResponse, a
|
|
2374
2389
|
* ClientRequest, or a raw Socket; natural end ends the destination. */
|
|
2375
|
-
pipe(destination: ServerResponse | ClientRequest | Socket): void;
|
|
2390
|
+
pipe(destination: ServerResponse | import("http2").Http2ServerResponse | ClientRequest | Socket): void;
|
|
2376
2391
|
on(event: "data", listener: (chunk: any) => void): void;
|
|
2377
|
-
on(event: "end" | "close", listener: () => void): void;
|
|
2392
|
+
on(event: "end" | "close" | "aborted", listener: () => void): void;
|
|
2378
2393
|
on(event: "error", listener: (err: Error) => void): void;
|
|
2379
2394
|
/* addListener IS on (Node aliases them) — the suite spells both. */
|
|
2380
2395
|
addListener(event: "data", listener: (chunk: any) => void): void;
|
|
2381
|
-
addListener(event: "end" | "close", listener: () => void): void;
|
|
2396
|
+
addListener(event: "end" | "close" | "aborted", listener: () => void): void;
|
|
2382
2397
|
addListener(event: "error", listener: (err: Error) => void): void;
|
|
2383
2398
|
once(event: "data", listener: (chunk: any) => void): void;
|
|
2384
|
-
once(event: "end" | "close", listener: () => void): void;
|
|
2399
|
+
once(event: "end" | "close" | "aborted", listener: () => void): void;
|
|
2385
2400
|
once(event: "error", listener: (err: Error) => void): void;
|
|
2386
2401
|
}
|
|
2387
2402
|
export interface ServerResponse {
|
|
2388
2403
|
readonly headersSent: boolean;
|
|
2404
|
+
readonly writableEnded: boolean;
|
|
2405
|
+
readonly finished: boolean;
|
|
2406
|
+
readonly writableFinished: boolean;
|
|
2389
2407
|
readonly writableCorked: number;
|
|
2408
|
+
readonly req: IncomingMessage;
|
|
2409
|
+
readonly socket: Socket | null;
|
|
2410
|
+
readonly connection: Socket | null;
|
|
2411
|
+
sendDate: boolean;
|
|
2412
|
+
strictContentLength: boolean;
|
|
2390
2413
|
/* Node's writable head properties: the implicit head reads them. */
|
|
2391
2414
|
statusCode: number;
|
|
2392
|
-
statusMessage: string;
|
|
2415
|
+
statusMessage: string | undefined;
|
|
2393
2416
|
setHeader(name: string, value: string | number): void;
|
|
2394
2417
|
getHeader(name: string): string | undefined;
|
|
2418
|
+
getHeaderNames(): string[];
|
|
2419
|
+
getRawHeaderNames(): string[];
|
|
2420
|
+
getHeaders(): OutgoingHttpHeaders;
|
|
2395
2421
|
hasHeader(name: string): boolean;
|
|
2396
2422
|
removeHeader(name: string): void;
|
|
2397
2423
|
/* Both overloads answer the response (`return this` chaining); the
|
|
2398
2424
|
* headers argument also takes Node's flat [name, value, ...] array. */
|
|
2399
2425
|
writeHead(statusCode: number, headers?: OutgoingHttpHeaders | string[]): ServerResponse;
|
|
2400
2426
|
writeHead(statusCode: number, statusMessage: string, headers?: OutgoingHttpHeaders | string[]): ServerResponse;
|
|
2427
|
+
writeContinue(callback?: () => void): void;
|
|
2428
|
+
writeProcessing(callback?: () => void): void;
|
|
2429
|
+
writeEarlyHints(hints: Record<string, string | string[]>, callback?: () => void): void;
|
|
2401
2430
|
write(data: string | Uint8Array): void;
|
|
2402
2431
|
flushHeaders(): void;
|
|
2403
2432
|
cork(): void;
|
|
2404
2433
|
uncork(): void;
|
|
2405
2434
|
addTrailers(headers: OutgoingHttpHeaders | ReadonlyArray<[string, string]>): void;
|
|
2435
|
+
setTimeout(msecs: number, callback?: () => void): this;
|
|
2406
2436
|
/* end's callback forms fire once the body went out (the 'finish'
|
|
2407
2437
|
* emit, deferred past the handler's synchronous tail). */
|
|
2408
2438
|
end(data?: string | Uint8Array, callback?: () => void): void;
|
|
2409
2439
|
end(callback: () => void): void;
|
|
2410
2440
|
destroy(): void;
|
|
2411
|
-
on(event: "close", listener: () => void): void;
|
|
2441
|
+
on(event: "close" | "finish", listener: () => void): void;
|
|
2412
2442
|
/* addListener IS on (Node aliases them) — the suite spells both. */
|
|
2413
|
-
addListener(event: "close", listener: () => void): void;
|
|
2414
|
-
once(event: "close", listener: () => void): void;
|
|
2443
|
+
addListener(event: "close" | "finish", listener: () => void): void;
|
|
2444
|
+
once(event: "close" | "finish", listener: () => void): void;
|
|
2415
2445
|
}
|
|
2416
2446
|
/* The CLIENT slice (http.request/http.get): the options-object form
|
|
2417
2447
|
* with hostname/host, port, path, method, timeout, and headers; the
|
|
@@ -2478,26 +2508,52 @@ declare module "http" {
|
|
|
2478
2508
|
export const globalAgent: Agent;
|
|
2479
2509
|
export interface ClientRequest {
|
|
2480
2510
|
readonly destroyed: boolean;
|
|
2511
|
+
readonly aborted: boolean;
|
|
2512
|
+
readonly socket: Socket;
|
|
2513
|
+
readonly connection: Socket;
|
|
2481
2514
|
readonly writableCorked: number;
|
|
2515
|
+
readonly method: string;
|
|
2516
|
+
readonly path: string;
|
|
2517
|
+
readonly host: string;
|
|
2518
|
+
readonly protocol: string;
|
|
2519
|
+
readonly headersSent: boolean;
|
|
2520
|
+
readonly writableEnded: boolean;
|
|
2521
|
+
readonly writableFinished: boolean;
|
|
2522
|
+
readonly finished: boolean;
|
|
2523
|
+
readonly reusedSocket: boolean;
|
|
2524
|
+
setHeader(name: string, value: string): void;
|
|
2525
|
+
getHeader(name: string): string | undefined;
|
|
2526
|
+
hasHeader(name: string): boolean;
|
|
2527
|
+
removeHeader(name: string): void;
|
|
2528
|
+
getHeaderNames(): string[];
|
|
2529
|
+
getRawHeaderNames(): string[];
|
|
2530
|
+
getHeaders(): OutgoingHttpHeaders;
|
|
2482
2531
|
flushHeaders(): void;
|
|
2483
2532
|
addTrailers(headers: OutgoingHttpHeaders | ReadonlyArray<[string, string]>): void;
|
|
2484
2533
|
cork(): void;
|
|
2485
2534
|
uncork(): void;
|
|
2535
|
+
setNoDelay(noDelay?: boolean): void;
|
|
2536
|
+
setSocketKeepAlive(enable?: boolean, initialDelay?: number): void;
|
|
2537
|
+
setTimeout(timeout: number, callback?: () => void): this;
|
|
2486
2538
|
write(data: string | Uint8Array): void;
|
|
2487
2539
|
end(data?: string | Uint8Array): void;
|
|
2488
2540
|
destroy(): void;
|
|
2541
|
+
abort(): void;
|
|
2489
2542
|
on(event: "response", listener: (res: IncomingMessage) => void): void;
|
|
2543
|
+
on(event: "socket", listener: (socket: Socket) => void): void;
|
|
2490
2544
|
on(event: "upgrade", listener: (res: IncomingMessage, socket: Socket, head: Buffer) => void): void;
|
|
2491
|
-
on(event: "timeout" | "close", listener: () => void): void;
|
|
2545
|
+
on(event: "timeout" | "close" | "finish" | "abort", listener: () => void): void;
|
|
2492
2546
|
on(event: "error", listener: (err: Error) => void): void;
|
|
2493
2547
|
/* addListener IS on (Node aliases them) — the suite spells both. */
|
|
2494
2548
|
addListener(event: "response", listener: (res: IncomingMessage) => void): void;
|
|
2549
|
+
addListener(event: "socket", listener: (socket: Socket) => void): void;
|
|
2495
2550
|
addListener(event: "upgrade", listener: (res: IncomingMessage, socket: Socket, head: Buffer) => void): void;
|
|
2496
|
-
addListener(event: "timeout" | "close", listener: () => void): void;
|
|
2551
|
+
addListener(event: "timeout" | "close" | "finish" | "abort", listener: () => void): void;
|
|
2497
2552
|
addListener(event: "error", listener: (err: Error) => void): void;
|
|
2498
2553
|
once(event: "response", listener: (res: IncomingMessage) => void): void;
|
|
2554
|
+
once(event: "socket", listener: (socket: Socket) => void): void;
|
|
2499
2555
|
once(event: "upgrade", listener: (res: IncomingMessage, socket: Socket, head: Buffer) => void): void;
|
|
2500
|
-
once(event: "timeout" | "close", listener: () => void): void;
|
|
2556
|
+
once(event: "timeout" | "close" | "finish" | "abort", listener: () => void): void;
|
|
2501
2557
|
once(event: "error", listener: (err: Error) => void): void;
|
|
2502
2558
|
}
|
|
2503
2559
|
export function createServer(
|
|
@@ -2528,6 +2584,8 @@ declare module "http" {
|
|
|
2528
2584
|
target: RequestOptions | string | URL,
|
|
2529
2585
|
callback?: (res: IncomingMessage) => void,
|
|
2530
2586
|
): ClientRequest;
|
|
2587
|
+
export function validateHeaderName(name: string, label?: string): void;
|
|
2588
|
+
export function validateHeaderValue(name: string, value: unknown): void;
|
|
2531
2589
|
}
|
|
2532
2590
|
declare module "node:http" {
|
|
2533
2591
|
export * from "http";
|
|
@@ -2700,6 +2758,7 @@ declare module "http2" {
|
|
|
2700
2758
|
}
|
|
2701
2759
|
export interface Http2ServerResponse {
|
|
2702
2760
|
readonly headersSent: boolean;
|
|
2761
|
+
readonly writableEnded: boolean;
|
|
2703
2762
|
readonly writableCorked: number;
|
|
2704
2763
|
/* The same lowered surface as http.ServerResponse — the allowHTTP1
|
|
2705
2764
|
* lowering serves every connection as HTTP/1.1, where the compat
|
|
@@ -2708,10 +2767,15 @@ declare module "http2" {
|
|
|
2708
2767
|
statusMessage: string;
|
|
2709
2768
|
setHeader(name: string, value: string | number): void;
|
|
2710
2769
|
getHeader(name: string): string | undefined;
|
|
2770
|
+
getHeaderNames(): string[];
|
|
2771
|
+
getRawHeaderNames(): string[];
|
|
2772
|
+
getHeaders(): import("http").OutgoingHttpHeaders;
|
|
2711
2773
|
hasHeader(name: string): boolean;
|
|
2712
2774
|
removeHeader(name: string): void;
|
|
2713
2775
|
writeHead(statusCode: number, headers?: import("http").OutgoingHttpHeaders | string[]): Http2ServerResponse;
|
|
2714
2776
|
writeHead(statusCode: number, statusMessage: string, headers?: import("http").OutgoingHttpHeaders | string[]): Http2ServerResponse;
|
|
2777
|
+
writeContinue(): void;
|
|
2778
|
+
writeEarlyHints(hints: Record<string, string | string[]>): void;
|
|
2715
2779
|
write(data: string | Uint8Array): void;
|
|
2716
2780
|
flushHeaders(): void;
|
|
2717
2781
|
cork(): void;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { IrBytesElem, IrGlobal, IrRecordShape, IrExpr, IrFfiImport, IrFunction, IrLocal, IrModule, IrStmt, IrType, IrUnionDef, SrcLoc } from "../../ir/ir.js";
|
|
2
|
+
import type { IntegerRanges } from "../../ir/integer-ranges.js";
|
|
3
|
+
import { type ConstantNumericTable } from "../../ir/constant-tables.js";
|
|
2
4
|
import { type FfiCallbackAdapter } from "../ffi-callbacks.js";
|
|
3
5
|
import { VtSlot, ClassMeta } from "./shapes.js";
|
|
4
6
|
import { type StreamTypedRefAdapter } from "./exprs.js";
|
|
@@ -30,7 +32,7 @@ export declare class CEmitter {
|
|
|
30
32
|
/** Kind-specialized typed-array access helpers actually used by this
|
|
31
33
|
* program. Keeping these in the generated TU means unrelated binaries do
|
|
32
34
|
* not pay even debug/link metadata for byte-loop fast paths. */
|
|
33
|
-
readonly bytesElementHelpers: Set<"get:f32:f64" | "get:f32:u64" | "get:i32:f64" | "get:i32:u64" | "get:u32:f64" | "get:u32:u64" | "get:u8:f64" | "get:u8:u64" | "set:f32:f64" | "set:f32:u64" | "set:i32:f64" | "set:i32:u64" | "set:u32:f64" | "set:u32:u64" | "set:u8:f64" | "set:u8:u64">;
|
|
35
|
+
readonly bytesElementHelpers: Set<"get:f32:f64" | "get:f32:u64" | "get:f64:f64" | "get:f64:u64" | "get:i32:f64" | "get:i32:u64" | "get:u32:f64" | "get:u32:u64" | "get:u8:f64" | "get:u8:u64" | "set:f32:f64" | "set:f32:u64" | "set:f64:f64" | "set:f64:u64" | "set:i32:f64" | "set:i32:u64" | "set:u32:f64" | "set:u32:u64" | "set:u8:f64" | "set:u8:u64">;
|
|
34
36
|
/** Interned unit-armed union instances: "unionId:tag" → static symbol.
|
|
35
37
|
* A unit arm (undefined/null) has no payload, so every instance of one
|
|
36
38
|
* (union, tag) pair is identical — ONE immortal (rc == SIZE_MAX) static
|
|
@@ -72,6 +74,7 @@ export declare class CEmitter {
|
|
|
72
74
|
* unsigned integer shadow. Ordinary number reads widen the shadow back to
|
|
73
75
|
* f64; direct byte indices consume it without a conversion round trip. */
|
|
74
76
|
integerLoopBindings: Map<string, string>;
|
|
77
|
+
integerRanges: IntegerRanges;
|
|
75
78
|
/** Declared functions referenced as values: each needs an env-signature
|
|
76
79
|
* wrapper + an interned immortal closure (so `f === f` holds). */
|
|
77
80
|
readonly fnValues: Set<string>;
|
|
@@ -138,6 +141,7 @@ export declare class CEmitter {
|
|
|
138
141
|
readonly ffiHasRetainedCallback: boolean;
|
|
139
142
|
readonly ffiHasForeignCallback: boolean;
|
|
140
143
|
readonly globalsById: Map<string, IrGlobal>;
|
|
144
|
+
readonly constantNumericTables: ReadonlyMap<string, ConstantNumericTable>;
|
|
141
145
|
readonly unionsById: Map<string, IrUnionDef>;
|
|
142
146
|
/** Active optional-chain bind temps, by chain id (chainRecv reads). */
|
|
143
147
|
readonly chainTemps: Map<string, Temp>;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { InternalCompilerError } from "../../errors.js";
|
|
2
2
|
import { ffiCallbackType, funcOf, isFfiCallbackParam, isFfiContextParam, isFfiReleaseParam, isRefCounted, isUnitType, mapOf, moduleEmbedsCompressedNpm, moduleUsesChildProcess, moduleUsesDgram, moduleUsesDynInvoke, moduleEmbedsBuiltin, moduleUsesFetch, moduleUsesFsWatch, moduleUsesHttp2, moduleUsesHttpServer, moduleUsesNet, moduleUsesNodeTest, moduleUsesProcessEvents, moduleUsesStream, moduleUsesTls, moduleUsesTlsCa, POINTER_KINDS, RUNTIME_EMITTER_CLASS, STRING, VOID } from "../../ir/ir.js";
|
|
3
3
|
import { undefinedArmTag } from "../../ir/analysis.js";
|
|
4
|
+
import { scalarizeNumericRecords } from "../../ir/scalar-records.js";
|
|
5
|
+
import { findConstantNumericTables } from "../../ir/constant-tables.js";
|
|
4
6
|
import { allocateFfiCallbackAdapters, hasForeignFfiCallback, hasRetainedFfiCallback } from "../ffi-callbacks.js";
|
|
5
7
|
import { mangleAsyncSpawn, mangleGenSpawn, mangleClassObj, mangleField, mangleGlobal, mangleFnClosure, mangleFunction, mangleLocal, mangleRawParam, mangleVtSlot, mangleWrapper, } from "../mangle.js";
|
|
6
|
-
import { cCommentText, cFnPtrCast, cType, releaseCallC, cStringLiteral, cDecl } from "./types.js";
|
|
8
|
+
import { cCommentText, cFnPtrCast, cType, releaseCallC, cStringLiteral, cDecl, cNumberLiteral } from "./types.js";
|
|
7
9
|
import { computeMayThrow } from "./may-throw.js";
|
|
8
10
|
import { unionTruthyHelper, unionEqHelper, unionToStrHelper, unionJoinHelper, jsonWriteHelper, jsonIndentHelper, dynMatchHelper, dynCheckHelper, dynFuncBoxHelper, dynToStrHelper, caughtToDynHelper, toDynHelper, recordKeyGetHelper, recordKeySetHelper } from "./walkers.js";
|
|
9
11
|
import { emitStructDefs, vtEntriesFor, vtSlotParams, emitVtableDecls, emitVtableInstances, emitVtAdapterDefs, emitHierarchyClassHelpers, emitClassObjs, emitCtorThunkDefs, errorVtStampLines, emitterVtStampLines, streamVtStampLines, traceAdapterC, traceArgC, boxNewC, arrNewC } from "./shapes.js";
|
|
@@ -13,7 +15,7 @@ import { emitFunction, emitBlock, emitStmts, emitStmt, emitTryCatch, emitSwitch,
|
|
|
13
15
|
import { emitExpr, liveDynRefAdapter as buildLiveDynRefAdapter } from "./exprs.js";
|
|
14
16
|
import { emitLibraryIdentityLines } from "../library-identity-markers.js";
|
|
15
17
|
export function emitCModule(mod, sourceText, options = {}) {
|
|
16
|
-
return new CEmitter(mod, sourceText, options).emit();
|
|
18
|
+
return new CEmitter(scalarizeNumericRecords(mod), sourceText, options).emit();
|
|
17
19
|
}
|
|
18
20
|
function ffiNativeTypeC(cls) {
|
|
19
21
|
switch (cls) {
|
|
@@ -106,6 +108,7 @@ export class CEmitter {
|
|
|
106
108
|
* unsigned integer shadow. Ordinary number reads widen the shadow back to
|
|
107
109
|
* f64; direct byte indices consume it without a conversion round trip. */
|
|
108
110
|
integerLoopBindings = new Map();
|
|
111
|
+
integerRanges = new Map();
|
|
109
112
|
/** Declared functions referenced as values: each needs an env-signature
|
|
110
113
|
* wrapper + an interned immortal closure (so `f === f` holds). */
|
|
111
114
|
fnValues = new Set();
|
|
@@ -172,6 +175,7 @@ export class CEmitter {
|
|
|
172
175
|
ffiHasRetainedCallback;
|
|
173
176
|
ffiHasForeignCallback;
|
|
174
177
|
globalsById = new Map();
|
|
178
|
+
constantNumericTables;
|
|
175
179
|
unionsById = new Map();
|
|
176
180
|
/** Active optional-chain bind temps, by chain id (chainRecv reads). */
|
|
177
181
|
chainTemps = new Map();
|
|
@@ -319,6 +323,7 @@ export class CEmitter {
|
|
|
319
323
|
constructor(mod, sourceText, options = {}) {
|
|
320
324
|
this.mod = mod;
|
|
321
325
|
this.options = options;
|
|
326
|
+
this.constantNumericTables = findConstantNumericTables(mod);
|
|
322
327
|
this.ffiCallbackAdapters = allocateFfiCallbackAdapters(mod.ffiImports ?? []);
|
|
323
328
|
this.ffiHasRetainedCallback = hasRetainedFfiCallback(mod.ffiImports ?? []);
|
|
324
329
|
this.ffiHasForeignCallback = hasForeignFfiCallback(mod.ffiImports ?? []);
|
|
@@ -578,6 +583,12 @@ export class CEmitter {
|
|
|
578
583
|
``,
|
|
579
584
|
];
|
|
580
585
|
out.push(...this.emitBytesElementHelpers());
|
|
586
|
+
for (const table of this.constantNumericTables.values()) {
|
|
587
|
+
out.push(`static const double ${table.symbol}[] = { ${table.values.map(cNumberLiteral).join(", ")} };`, `static inline double ${table.symbol}_get(const ScrArr *a, double i) {`,
|
|
588
|
+
// Range checks precede the conversion: NaN, infinities and large
|
|
589
|
+
// numbers must never reach a C float-to-integer conversion.
|
|
590
|
+
` if (a != NULL && i >= 0.0 && i < ${table.values.length}.0) {`, ` size_t index = (size_t)i;`, ` if ((double)index == i) return ${table.symbol}[index];`, ` }`, ` return scr_arr_get_number(a, i);`, `}`, ``);
|
|
591
|
+
}
|
|
581
592
|
// Struct defs render into their own buffer BEFORE the unit-instance
|
|
582
593
|
// table flushes: class newFns point undefined-armed union fields at
|
|
583
594
|
// interned unit instances (fields start as JS's undefined, not NULL),
|
|
@@ -1273,10 +1284,10 @@ export class CEmitter {
|
|
|
1273
1284
|
if (hasU64) {
|
|
1274
1285
|
out.push(`static inline size_t sc_bytes_index_u64_checked(const ScrBytes *b, uint64_t i) {`, ` if (i >= b->len) { (void)scr_bytes_get(b, (double)i); return 0; }`, ` return (size_t)i;`, `}`);
|
|
1275
1286
|
}
|
|
1276
|
-
if ([...this.bytesElementHelpers].some((key) => key.startsWith("set:") && key.
|
|
1287
|
+
if ([...this.bytesElementHelpers].some((key) => key.startsWith("set:") && !key.startsWith("set:f32:") && !key.startsWith("set:f64:"))) {
|
|
1277
1288
|
out.push(`static inline uint32_t sc_bytes_coerce_u32(double v) {`, ` if (v >= -9007199254740992.0 && v <= 9007199254740992.0) return (uint32_t)(int64_t)v;`, ` if (v != v || isinf(v)) return 0;`, ` double t = fmod(trunc(v), 4294967296.0);`, ` if (t < 0) t += 4294967296.0;`, ` return (uint32_t)t;`, `}`);
|
|
1278
1289
|
}
|
|
1279
|
-
for (const elem of ["u8", "u32", "i32", "f32"]) {
|
|
1290
|
+
for (const elem of ["u8", "u32", "i32", "f32", "f64"]) {
|
|
1280
1291
|
for (const mode of ["f64", "u64"]) {
|
|
1281
1292
|
const suffix = mode === "u64" ? "_u64" : "";
|
|
1282
1293
|
const indexType = mode === "u64" ? "uint64_t" : "double";
|
|
@@ -1286,8 +1297,9 @@ export class CEmitter {
|
|
|
1286
1297
|
out.push(`static inline double sc_bytes_get_u8${suffix}(const ScrBytes *b, ${indexType} i) {`, ` return (double)b->data[${checked}(b, i)];`, `}`);
|
|
1287
1298
|
}
|
|
1288
1299
|
else {
|
|
1289
|
-
const valueType = elem === "f32" ? "float" : elem === "i32" ? "int32_t" : "uint32_t";
|
|
1290
|
-
|
|
1300
|
+
const valueType = elem === "f32" ? "float" : elem === "f64" ? "double" : elem === "i32" ? "int32_t" : "uint32_t";
|
|
1301
|
+
const size = elem === "f64" ? 8 : 4;
|
|
1302
|
+
out.push(`static inline double sc_bytes_get_${elem}${suffix}(const ScrBytes *b, ${indexType} i) {`, ` ${valueType} v;`, ` memcpy(&v, b->data + ${checked}(b, i) * ${size}, ${size});`, ` return (double)v;`, `}`);
|
|
1291
1303
|
}
|
|
1292
1304
|
}
|
|
1293
1305
|
if (this.bytesElementHelpers.has(`set:${elem}:${mode}`)) {
|
|
@@ -1295,9 +1307,10 @@ export class CEmitter {
|
|
|
1295
1307
|
out.push(`static inline void sc_bytes_set_u8${suffix}(ScrBytes *b, ${indexType} i, double v) {`, ` b->data[${checked}(b, i)] = (uint8_t)sc_bytes_coerce_u32(v);`, `}`);
|
|
1296
1308
|
}
|
|
1297
1309
|
else {
|
|
1298
|
-
const valueType = elem === "f32" ? "float" : "uint32_t";
|
|
1299
|
-
const init = elem === "f32" ? `(float)v` : `sc_bytes_coerce_u32(v)`;
|
|
1300
|
-
|
|
1310
|
+
const valueType = elem === "f32" ? "float" : elem === "f64" ? "double" : "uint32_t";
|
|
1311
|
+
const init = elem === "f32" ? `(float)v` : elem === "f64" ? "v" : `sc_bytes_coerce_u32(v)`;
|
|
1312
|
+
const size = elem === "f64" ? 8 : 4;
|
|
1313
|
+
out.push(`static inline void sc_bytes_set_${elem}${suffix}(ScrBytes *b, ${indexType} i, double v) {`, ` size_t idx = ${checked}(b, i);`, ` ${valueType} stored = ${init};`, ` memcpy(b->data + idx * ${size}, &stored, ${size});`, `}`);
|
|
1301
1314
|
}
|
|
1302
1315
|
}
|
|
1303
1316
|
}
|