@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.
Files changed (158) hide show
  1. package/ambient/scriptc-node-fallback.d.ts +75 -11
  2. package/dist/backend/c/c-emitter.d.ts +5 -1
  3. package/dist/backend/c/c-emitter.js +22 -9
  4. package/dist/backend/c/c-emitter.js.map +1 -1
  5. package/dist/backend/c/exprs.d.ts +2 -2
  6. package/dist/backend/c/exprs.js +298 -27
  7. package/dist/backend/c/exprs.js.map +1 -1
  8. package/dist/backend/c/stmts.js +5 -3
  9. package/dist/backend/c/stmts.js.map +1 -1
  10. package/dist/backend/c/types.d.ts +2 -3
  11. package/dist/backend/c/types.js +8 -1
  12. package/dist/backend/c/types.js.map +1 -1
  13. package/dist/backend/c/walkers.js +1 -1
  14. package/dist/backend/c/walkers.js.map +1 -1
  15. package/dist/backend/link-plan.d.ts +1 -0
  16. package/dist/backend/link-plan.js +2 -1
  17. package/dist/backend/link-plan.js.map +1 -1
  18. package/dist/backend/llvm/dyn.js +1 -1
  19. package/dist/backend/llvm/dyn.js.map +1 -1
  20. package/dist/backend/llvm/emitter.js +25 -9
  21. package/dist/backend/llvm/emitter.js.map +1 -1
  22. package/dist/backend/llvm/expr-bytes.d.ts +1 -2
  23. package/dist/backend/llvm/expr-bytes.js +22 -17
  24. package/dist/backend/llvm/expr-bytes.js.map +1 -1
  25. package/dist/backend/llvm/expr-containers.d.ts +1 -0
  26. package/dist/backend/llvm/expr-containers.js +58 -4
  27. package/dist/backend/llvm/expr-containers.js.map +1 -1
  28. package/dist/backend/llvm/expr-context.d.ts +6 -2
  29. package/dist/backend/llvm/expr-primitives.js +22 -7
  30. package/dist/backend/llvm/expr-primitives.js.map +1 -1
  31. package/dist/backend/llvm/lib-filesystem.js +20 -0
  32. package/dist/backend/llvm/lib-filesystem.js.map +1 -1
  33. package/dist/backend/llvm/lib-network.js +53 -10
  34. package/dist/backend/llvm/lib-network.js.map +1 -1
  35. package/dist/backend/llvm/lib-process.js +4 -3
  36. package/dist/backend/llvm/lib-process.js.map +1 -1
  37. package/dist/backend/llvm/lib-shared.js +65 -0
  38. package/dist/backend/llvm/lib-shared.js.map +1 -1
  39. package/dist/backend/native-toolchain.d.ts +2 -0
  40. package/dist/backend/native-toolchain.js +2 -1
  41. package/dist/backend/native-toolchain.js.map +1 -1
  42. package/dist/backend/targets.d.ts +3 -0
  43. package/dist/backend/targets.js +13 -0
  44. package/dist/backend/targets.js.map +1 -1
  45. package/dist/coverage/surface-manifest.js +12 -5
  46. package/dist/coverage/surface-manifest.js.map +1 -1
  47. package/dist/executable/executable-cache.d.ts +2 -0
  48. package/dist/executable/executable-cache.js +3 -1
  49. package/dist/executable/executable-cache.js.map +1 -1
  50. package/dist/executable/executable-cache.test.js +3 -3
  51. package/dist/executable/executable-cache.test.js.map +1 -1
  52. package/dist/frontend/lowering/array-indexed-mutation.d.ts +8 -0
  53. package/dist/frontend/lowering/array-indexed-mutation.js +176 -0
  54. package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -0
  55. package/dist/frontend/lowering/containers/bytes.d.ts +1 -1
  56. package/dist/frontend/lowering/containers/bytes.js +6 -5
  57. package/dist/frontend/lowering/containers/bytes.js.map +1 -1
  58. package/dist/frontend/lowering/containers/string-and-regexp.d.ts +14 -6
  59. package/dist/frontend/lowering/containers/string-and-regexp.js +420 -34
  60. package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
  61. package/dist/frontend/lowering/expressions/object-literals.js +8 -0
  62. package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
  63. package/dist/frontend/lowering/indexed-comparison.d.ts +6 -0
  64. package/dist/frontend/lowering/indexed-comparison.js +30 -0
  65. package/dist/frontend/lowering/indexed-comparison.js.map +1 -0
  66. package/dist/frontend/lowering/lower-builtins.d.ts +5 -6
  67. package/dist/frontend/lowering/lower-builtins.js +24 -16
  68. package/dist/frontend/lowering/lower-builtins.js.map +1 -1
  69. package/dist/frontend/lowering/lower-calls.d.ts +3 -2
  70. package/dist/frontend/lowering/lower-calls.js +522 -89
  71. package/dist/frontend/lowering/lower-calls.js.map +1 -1
  72. package/dist/frontend/lowering/lower-classes.js +5 -29
  73. package/dist/frontend/lowering/lower-classes.js.map +1 -1
  74. package/dist/frontend/lowering/lower-containers.d.ts +15 -11
  75. package/dist/frontend/lowering/lower-containers.js +588 -146
  76. package/dist/frontend/lowering/lower-containers.js.map +1 -1
  77. package/dist/frontend/lowering/lower-exprs.d.ts +12 -0
  78. package/dist/frontend/lowering/lower-exprs.js +145 -11
  79. package/dist/frontend/lowering/lower-exprs.js.map +1 -1
  80. package/dist/frontend/lowering/lower-island.js +17 -6
  81. package/dist/frontend/lowering/lower-island.js.map +1 -1
  82. package/dist/frontend/lowering/lower-server.d.ts +2 -4
  83. package/dist/frontend/lowering/lower-server.js +288 -32
  84. package/dist/frontend/lowering/lower-server.js.map +1 -1
  85. package/dist/frontend/lowering/lower-stmts.js +4 -4
  86. package/dist/frontend/lowering/lower-stmts.js.map +1 -1
  87. package/dist/frontend/lowering/lowerer.js +37 -2
  88. package/dist/frontend/lowering/lowerer.js.map +1 -1
  89. package/dist/frontend/lowering/optional-arguments.d.ts +9 -1
  90. package/dist/frontend/lowering/optional-arguments.js +67 -1
  91. package/dist/frontend/lowering/optional-arguments.js.map +1 -1
  92. package/dist/frontend/lowering/pairs-snapshot.d.ts +3 -1
  93. package/dist/frontend/lowering/pairs-snapshot.js +12 -4
  94. package/dist/frontend/lowering/pairs-snapshot.js.map +1 -1
  95. package/dist/frontend/lowering/surfaces.d.ts +10 -14
  96. package/dist/frontend/lowering/surfaces.js +50 -28
  97. package/dist/frontend/lowering/surfaces.js.map +1 -1
  98. package/dist/frontend/npm-static-prune.d.ts +6 -0
  99. package/dist/frontend/npm-static-prune.js +203 -0
  100. package/dist/frontend/npm-static-prune.js.map +1 -0
  101. package/dist/frontend/npm-static-prune.test.d.ts +1 -0
  102. package/dist/frontend/npm-static-prune.test.js +48 -0
  103. package/dist/frontend/npm-static-prune.test.js.map +1 -0
  104. package/dist/frontend/npm.js +7 -6
  105. package/dist/frontend/npm.js.map +1 -1
  106. package/dist/frontend/program.js +15 -4
  107. package/dist/frontend/program.js.map +1 -1
  108. package/dist/frontend/provenance.js +8 -3
  109. package/dist/frontend/provenance.js.map +1 -1
  110. package/dist/frontend/type-mapper.js +16 -5
  111. package/dist/frontend/type-mapper.js.map +1 -1
  112. package/dist/index.d.ts +3 -3
  113. package/dist/index.js +13 -41
  114. package/dist/index.js.map +1 -1
  115. package/dist/ir/analysis.d.ts +5 -3
  116. package/dist/ir/analysis.js +25 -11
  117. package/dist/ir/analysis.js.map +1 -1
  118. package/dist/ir/analysis.test.js +50 -2
  119. package/dist/ir/analysis.test.js.map +1 -1
  120. package/dist/ir/constant-tables.d.ts +17 -0
  121. package/dist/ir/constant-tables.js +99 -0
  122. package/dist/ir/constant-tables.js.map +1 -0
  123. package/dist/ir/constant-tables.test.d.ts +1 -0
  124. package/dist/ir/constant-tables.test.js +78 -0
  125. package/dist/ir/constant-tables.test.js.map +1 -0
  126. package/dist/ir/integer-ranges.d.ts +13 -0
  127. package/dist/ir/integer-ranges.js +122 -0
  128. package/dist/ir/integer-ranges.js.map +1 -0
  129. package/dist/ir/integer-ranges.test.d.ts +1 -0
  130. package/dist/ir/integer-ranges.test.js +63 -0
  131. package/dist/ir/integer-ranges.test.js.map +1 -0
  132. package/dist/ir/ir.d.ts +56 -35
  133. package/dist/ir/ir.js +9 -1
  134. package/dist/ir/ir.js.map +1 -1
  135. package/dist/ir/ir.test.js +6 -0
  136. package/dist/ir/ir.test.js.map +1 -1
  137. package/dist/ir/scalar-records.d.ts +8 -0
  138. package/dist/ir/scalar-records.js +216 -0
  139. package/dist/ir/scalar-records.js.map +1 -0
  140. package/dist/ir/scalar-records.test.d.ts +1 -0
  141. package/dist/ir/scalar-records.test.js +142 -0
  142. package/dist/ir/scalar-records.test.js.map +1 -0
  143. package/dist/ir/validate.js +135 -34
  144. package/dist/ir/validate.js.map +1 -1
  145. package/dist/ir/validate.test.d.ts +1 -0
  146. package/dist/ir/validate.test.js +48 -0
  147. package/dist/ir/validate.test.js.map +1 -0
  148. package/dist/library/cache-primitives.d.ts +1 -1
  149. package/dist/library/cache-primitives.js +3 -3
  150. package/dist/library/cache-primitives.js.map +1 -1
  151. package/dist/library/fence-eval.js +11 -4
  152. package/dist/library/fence-eval.js.map +1 -1
  153. package/dist/library/library-cache.js +0 -1
  154. package/dist/library/library-cache.js.map +1 -1
  155. package/dist/library/library-cache.test.js +3 -3
  156. package/dist/library/library-cache.test.js.map +1 -1
  157. package/package.json +17 -17
  158. 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.split(":")[1] !== "f32")) {
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
- out.push(`static inline double sc_bytes_get_${elem}${suffix}(const ScrBytes *b, ${indexType} i) {`, ` ${valueType} v;`, ` memcpy(&v, b->data + ${checked}(b, i) * 4, 4);`, ` return (double)v;`, `}`);
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
- 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 * 4, &stored, 4);`, `}`);
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
  }