Commit Graph
373 Commits
Author SHA1 Message Date
Chris Tate cc8e15f98c fix: keep sanitized runtime-localized archives linkable on ELF
ASan's instrumented globals ride ELF section groups; archives built from
shared runtime objects carry groups with REPEATED signatures, so a process
linking two runtime-localized sanitized archives kept one archive's group
and discarded the other's — whose now-local references then dangled at the
embedder's link. Resolving the groups into the combined relocatable member
(ld -r --force-group-allocation) keeps every archive's copies; the
localization step then demotes them per archive exactly like unsanitized
state. Plain builds carry no section groups, so the flag is inert there.

With the groups resolved, ELF surfaces the same deliberate exception
Mach-O already documented: the image-wide registration guard COMMON stays
shared so the final image registers its ASan globals exactly once — M1/M7
now pin that spelling on both platforms. The explicit ASan pairing (M8)
additionally points Linux LSan away from contractually thread-lifetime
instance state, exactly as the sanitized suite lanes do.
2026-08-12 02:47:29 -05:00
Chris Tate cafbafff02 feat: support thread-instanced library state
- Add the abi.instance_per_thread profile field: the archive's TUs compile
  with -DSCR_THREAD_INSTANCES, and the SCR_TL qualifier in scr_runtime.h
  moves every runtime unit's mutable statics into thread-local storage;
  both backends emit the program TU's module globals, run-once guards, and
  lazily-compiled regex literal caches thread-local to match
- ONE linked archive then serves one independent instance per embedder
  thread through the unchanged entry family: a thread registers its sink
  and calls the init entry, and owns its own collector, result arena,
  poison flag, and program state — a trap poisons only the instance it
  fired in while sibling threads' instances keep answering
- Document the contract beside the profile spec: one instance per thread,
  selected implicitly by the calling thread; instance lifetime is the
  thread's lifetime; the never-entered-from-two-threads rule is unchanged;
  independent of and composable with abi.localize_runtime
- Immutable interned data (string literals, unit arms, template arrays,
  vtables) stays shared — Darwin ASan's image-registration common
  included, keeping the one-registration-per-image discipline; the
  exception cell's current pointer resolves a NULL sentinel in this mode
  because a thread-local address is not a constant initializer
- Add the four-thread acceptance probe (distinct per-thread workloads,
  concurrent instance-local inits, per-instance collects, a trap delivered
  to its own thread's sink exactly once), the composition probe pairing a
  thread-instanced localized archive with a second different-prefix
  localized archive, an explicit ASan rerun beside the suite-flavor
  sanitized builds, and profile-shape coverage; schedule the new lane
  contracts beside M1/M2
- Non-opted builds are byte-for-byte unchanged: the qualifier expands to
  nothing outside -DSCR_LIB -DSCR_THREAD_INSTANCES (verified object-level
  over every touched runtime TU in both default and library flavors)
2026-08-12 02:29:40 -05:00
Chris Tate da2ad7e002 feat: support multi-instance library mode via runtime symbol localization (#136)
* feat: support multi-instance library mode via runtime symbol localization

- Add the abi.localize_runtime profile field: the archive build combines the
  program object with exactly the runtime/vendor members it reaches and
  demotes every external definition except the profile-declared symbols to a
  local symbol (darwin: one ld -r pass with -exported_symbols_list; linux:
  ld -r then objcopy --keep-global-symbols)
- N archives built under pairwise-distinct prefixes now link into one process
  with no symbol collisions and no shared mutable runtime state: each
  instance owns a private copy of the allocator, collector, result arena, and
  panic sink, so sinks register per instance and a trap poisons only the
  instance it fired in
- Document the embedder contract beside the profile spec: one thread per
  instance (an instance is never entered from two threads), and values cross
  instances only through the embedder's own byte/record marshalling
- Refuse cross-target localized builds with SC3002 (the step runs the host
  toolchain's ld/objcopy over host-format objects); absent or false keeps the
  classic single-archive artifact byte-for-byte
- Add the two-instance acceptance probe (two archives, two embedder threads,
  independent collects, a trap delivered to its own sink exactly once while
  the other instance keeps answering) plus symbol-exactness, profile-shape,
  and target-posture suites, and schedule the artifact contracts on the gate
  host

* fix: tighten runtime localization validation

* fix: harden localized library publication
2026-08-12 02:19:37 -05:00
Chris Tate e98b2d461d release: v0.0.26 (#135)
Bump all published packages to 0.0.26, publish the release notes for the new target and runtime surfaces, and regenerate the compiler surface manifest.
2026-08-11 14:39:19 -05:00
Chris TateandAlbert 31f268be2b feat: support wasm32-wasi as a production target (#133)
* feat: support wasm32-wasi as a production target

- Add production LLVM WASI codegen with a 32-bit ABI, coroutines, and dynamic modules
- Integrate WASI builds and execution into the CLI with capability diagnostics
- Add differential coverage and document the fourth production target

Co-authored-by: Albert <57402359+bulatovv@users.noreply.github.com>

* fix: address wasm target review findings

* fix WASI guest paths and fetch alias detection

* fix WASI async bridge and fetch detection

---------

Co-authored-by: Albert <57402359+bulatovv@users.noreply.github.com>
2026-08-11 14:12:59 -05:00
Chris Tateandsqlpxc 2c164dd374 feat: support x86_64 Linux musl targets (#131)
* feat: support x86_64 Linux musl targets

- add musl runtime shims for randomness, fibers, and child-process cwd support
- validate executable and library outputs against Alpine Linux
- document x86_64-linux-musl cross-compilation

Co-authored-by: sqlpxc <38583139+sqlpxc@users.noreply.github.com>

* fix: harden musl runtime portability

* fix: keep child fixture portable across hosts

---------

Co-authored-by: sqlpxc <38583139+sqlpxc@users.noreply.github.com>
2026-08-11 12:10:03 -05:00
Chris TateandEli Sterling acf0a2b905 Support static HTTP server timeout properties (#127)
* Support static HTTP server timeout properties

- Lower typed timeout property reads and writes through both native backends.
- Store Node-compatible defaults independently on each HTTP/HTTPS server.
- Cover defaults and assignments with differential corpus tests.

Co-authored-by: Eli Sterling <240321107+eli-sterling@users.noreply.github.com>

* Support keep-alive timeout buffer property

* Fix HTTP server timeout property lowering

* fix: scope HTTP server timeout handling

* fix: preserve HTTP server timeout semantics

---------

Co-authored-by: Eli Sterling <240321107+eli-sterling@users.noreply.github.com>
2026-08-11 08:33:38 -05:00
Chris TateandDemonGPT adea269659 feat(ffi): support call-scoped native callbacks (#128)
* feat(ffi): support call-scoped native callbacks

- Add format-2 callback/context declarations with exact ABI positions and strict lifetime validation.
- Emit capture-aware C and LLVM trampolines with scalar coercion and exception propagation.
- Document the callback contract and cover both backends in plain and sanitized tests.

Co-authored-by: DemonGPT <127974011+DemonGPT@users.noreply.github.com>

* fix FFI callback safety

---------

Co-authored-by: DemonGPT <127974011+DemonGPT@users.noreply.github.com>
2026-08-11 08:25:29 -05:00
Chris Tate ea5b6183f2 release: v0.0.25 (#126)
- Bump all published packages to 0.0.25.
- Document fair socket-read scheduling in the release notes.
- Regenerate the compiler surface manifest for the new version.
2026-08-10 23:08:09 -05:00
Chris Tate 0daa46cb4f release: prepare v0.0.24 (#122)
- Bump workspace package versions to v0.0.24.
- Document the release’s filesystem, encoding, process, array, and performance updates.
- Refresh the compiler surface manifest for the release.
2026-08-10 14:42:39 -05:00
Chris TateandI Plan Websites e281259db3 feat(fs): expose Stats disk metadata (#120)
* feat(fs): expose Stats disk metadata

- Lower blocks, nlink, and atimeMs through the C and LLVM backends.
- Populate path, promise, file-handle, and dynamic bridge stats across supported platforms.
- Add differential, declaration, and npm bridge coverage.

Co-authored-by: I Plan Websites <787729+iplanwebsites@users.noreply.github.com>

* fix(fs): keep Windows stats snapshots coherent

* fix(fs): preserve Windows lstat metadata

* fix(fs): validate Windows mount point payloads

---------

Co-authored-by: I Plan Websites <787729+iplanwebsites@users.noreply.github.com>
2026-08-10 12:21:11 -05:00
Chris Tateandmorler 00eb380a0f perf: use integer induction for byte loops (#121)
- Recognize canonical typed-array loops with semantics-safe fallbacks.
- Emit integer induction and direct integer byte indices in C and LLVM.
- Add backend and differential regression coverage.

Co-authored-by: morler <478444+morler@users.noreply.github.com>
2026-08-10 11:33:17 -05:00
Chris Tate 4d96d2de28 feat(fs): support three-argument writeFile (#112)
* feat(fs): support three-argument writeFile

- Lower static UTF-8 encoding and mode options for fs/promises.writeFile.

- Add mode-aware runtime and backend support with promise rejection behavior.

- Cover supported options and failures in the differential corpus.

* fix fs write option evaluation and mode validation

* fix fs prototype-backed write options

* fix: preserve ignored write option semantics
2026-08-10 10:19:51 -05:00
Chris Tate 17ee5eff94 feat: support process write callback and encoding args (#114)
* feat: support process write callback and encoding args

- Lower static stdout and stderr writes with encoding and callback overloads.
- Schedule completion callbacks through the next-tick queue in C and LLVM builds.
- Cover encoding aliases, ordering, and async-free refusal behavior.

* fix: handle omitted process write arguments
2026-08-10 10:07:08 -05:00
Chris Tate b94c88e31c feat: support static non-UTF-8 TextDecoder labels (#111)
* feat: support static non-UTF-8 TextDecoder labels

- Recognize static WHATWG labels and aliases during builtin lowering.
- Add feature-gated portable decoders generated against the pinned Node runtime.
- Cover legacy encodings, malformed input, and unsupported dynamic labels.

* fix: match Node legacy decoder recovery

* fix TextDecoder edge-case parity

* fix(runtime): match Node malformed text decoding

* fix TextDecoder recovery edge cases
2026-08-09 23:15:51 -05:00
Chris Tate 8188470e3a feat: support fs/promises FileHandle (#110)
* feat: support fs/promises FileHandle

- Add static lowering and typing for fs/promises.open and the supported FileHandle surface.

- Implement FileHandle ownership and I/O across the C runtime and C/LLVM backends.

- Add differential corpus coverage and refresh the supported-surface manifest.

* fix fs file handle argument handling

* fix fs file handle validation

* fix(fs): preserve FileHandle read error codes

* fix(runtime): match empty FileHandle buffer behavior
2026-08-09 21:22:19 -05:00
Chris Tate a9b6dba424 feat(string): support static split limits (#109)
* feat(string): support static split limits

- Lower split limits for string and literal RegExp separators across C and LLVM.
- Match JavaScript ToUint32 limit semantics in the runtime.
- Add differential coverage and refresh diagnostics and surface metadata.

* fix(string): default undefined split limits
2026-08-09 18:09:00 -05:00
Chris Tate f1066d7825 Support variable Buffer.toString encodings (#108)
* Support variable Buffer.toString encodings

- Lower runtime-valued BufferEncoding arguments through checked C and LLVM paths.
- Normalize aliases and casing while preserving Node unknown-encoding errors.
- Add differential coverage and remove the obsolete diagnostic fence.

* fix(buffer): preserve unknown encoding messages

* fix(buffer): preserve optional encoding defaults

* fix(runtime): handle empty Buffer decoding ranges
2026-08-09 17:23:13 -05:00
Chris Tate 82b065c014 feat(fs): support static writeSync (#106)
* feat(fs): support static writeSync

- Lower Buffer-window and UTF-8 string overloads through the C and LLVM backends.
- Match Node's positioned and current-offset write behavior, validation, and errors.
- Add differential corpus coverage and publish the static surface manifest entry.

* fix(fs): preserve writeSync runtime semantics

* fix fs.writeSync error parity

* fix fs write descriptor errors
2026-08-09 16:54:33 -05:00
Chris Tate b3d3101550 Add static array unshift and reverse (#107)
- Lower unshift and reverse through the C and LLVM backends.
- Preserve spread, mutation, evaluation-order, and reference-counting semantics.
- Add runtime, differential, and surface-manifest coverage.
2026-08-09 14:25:53 -05:00
Chris Tateandryoppippi 23a2d3309e feat(fs): support static rename APIs (#104)
* feat(fs): support static rename APIs

- Lower fs.rename, fs.renameSync, and fs/promises.rename through the C and LLVM backends.
- Add runtime callback, error, and promise handling for rename operations.
- Cover typed and check-JS usage with differential corpus tests.

Co-authored-by: ryoppippi <1560508+ryoppippi@users.noreply.github.com>

* fix Windows rename semantics

* fix: move callback rename work off main thread

* fix(runtime): preserve rename callback checkpoints

---------

Co-authored-by: ryoppippi <1560508+ryoppippi@users.noreply.github.com>
2026-08-09 13:29:15 -05:00
Chris Tate a4e9970119 Support static util.parseArgs (#103)
* Support static util.parseArgs

- Lower typed util.parseArgs calls through the C and LLVM backends.
- Add a link-gated native parser with Node-compatible options, tokens, defaults, and errors.
- Cover ESM, CommonJS, default argv, sanitizer, and TS7 behavior.

* fix(runtime): align parseArgs behavior with Node

* fix(runtime): close parseArgs parity gaps

* fix(runtime): match parseArgs edge cases

* fix(runtime): preserve parseArgs short and default semantics
2026-08-09 08:57:03 -05:00
Chris Tate 28e723b599 Prepare v0.0.23 release (#105)
- Stamp all published packages and the compiler surface manifest at 0.0.23.
- Publish release notes for the new runtime, compiler, and web-platform surface.
- Preserve a clean Unreleased section and mark only the latest release body.
2026-08-09 08:09:54 -05:00
Chris Tateandsensei-woo e5c875bd97 Support Date instance lowering (#101)
* Support Date instance lowering

- Lower read-only Date values and constructors through the C and LLVM backends.

- Add portable calendar helpers, differential coverage, and documented surface contracts.

- Fence unsupported mutation, identity, locale, and component-constructor forms.

Co-authored-by: sensei-woo <sensei-woo@users.noreply.github.com>

* Fix Date exception and timezone semantics

* fix: harden Date lowering edge cases

* fix Date lowering edge cases

* Fix Date union fences and offset clipping

---------

Co-authored-by: sensei-woo <sensei-woo@users.noreply.github.com>
2026-08-08 23:17:58 -05:00
Chris Tateandsensei-woo 89c361a967 Lower AbortController for fetch cancellation (#100)
* Lower AbortController for fetch cancellation

- Add static and dynamic lowering for construction, signal access, and abort calls
- Back controllers with native signal state shared by fetch
- Cover cancellation semantics across C, LLVM, diagnostics, and surface tests

Co-authored-by: sensei-woo <sensei-woo@users.noreply.github.com>

* Fix AbortController abort edge cases

* Fence AbortController method extraction

---------

Co-authored-by: sensei-woo <sensei-woo@users.noreply.github.com>
2026-08-08 20:24:27 -05:00
Chris Tateandsensei-woo 0c45ee7d90 Support positioned fs.readSync calls (#99)
* Support positioned fs.readSync calls

- Lower numeric positions while preserving omitted and null current-offset behavior.

- Add offset-preserving native reads across POSIX and Windows runtimes.

- Cover positioned reads, offset semantics, EOF, and invalid positions.

Co-authored-by: sensei-woo <sensei-woo@users.noreply.github.com>

* fix(runtime): preserve partial positioned reads on Windows

* fix zero-length positioned reads

* fix(runtime): match empty readSync validation order

* fix(compiler): accept parenthesized null read positions

---------

Co-authored-by: sensei-woo <sensei-woo@users.noreply.github.com>
2026-08-08 16:58:34 -05:00
Chris Tateandkongxiangyiren 303ed952e1 fix(fetch): support Response construction (#98)
* fix(fetch): support Response construction

- Lower global Response calls through the native C and LLVM runtimes.
- Match Node 24 coercion, validation, and stream error precedence.
- Cover supported BodyInit and ResponseInit behavior with differential tests.

Co-authored-by: kongxiangyiren <72970235+kongxiangyiren@users.noreply.github.com>

* fix(fetch): align constructed response headers

* Fix Response construction and header iteration

* fix(fetch): align Response constructor conversion

* fix(fetch): preserve Response constructor semantics

---------

Co-authored-by: kongxiangyiren <72970235+kongxiangyiren@users.noreply.github.com>
2026-08-08 16:43:44 -05:00
Chris Tateandmorler 53e2f08227 perf(compiler): specialize typed-array element access (#97)
* perf(compiler): specialize typed-array element access

- Lower typed-array reads, writes, and lengths directly by IR element kind.
- Preserve coercion, bounds, and receiver lifetime semantics across C and LLVM.
- Cover emission, ABI layout, and Node-differential behavior.

Co-authored-by: morler <478444+morler@users.noreply.github.com>

* fix: retain typed-array receiver across nested assignments

---------

Co-authored-by: morler <478444+morler@users.noreply.github.com>
2026-08-08 14:39:41 -05:00
Chris Tate 782d3b8451 fix(compiler): support implicit top-level await modules (#94)
* fix(compiler): support implicit top-level await modules

- Match Node 24 syntax detection by treating top-level await as an ES module marker.

- Add differential corpus coverage for TypeScript files without explicit imports or exports.

* fix Node ESM classification for top-level await

* fix ESM require diagnostics and classification caching

* fix require binding and package type precedence

* fix: align top-level await module detection with Node
2026-08-08 11:35:01 -05:00
Chris Tate adae252881 Prepare v0.0.22 release (#87)
- Stamp all publishable packages at v0.0.22.

- Publish release notes for persistent builds and external coverage types.

- Refresh the compiler surface manifest for the release.
2026-08-03 01:31:43 -05:00
Chris Tate 52459a86d4 feat(compiler): lower stored text codec calls (#85)
* feat(compiler): lower stored text codec calls

- Lower same-scope const TextEncoder and TextDecoder call receivers without runtime instances.
- Preserve fences for escaping, captured, and imported codec values with actionable diagnostics.
- Add differential, diagnostic, and preflight baseline coverage for the supported idiom.

* fix(compiler): fence deferred text codec calls

* fix text codec switch-clause TDZ handling
2026-08-02 21:24:33 -05:00
Chris Tate 0d5bc0dd0d feat(coverage): resolve external host type surfaces (#80)
* feat(coverage): resolve external host type surfaces

- Add repeatable --external-types mappings for checker-only module resolution.
- Keep host runtime values as explicit blockers with tests and documentation.

* fix: validate external type mappings

* fix: fence external host runtime edges

* fix(compiler): skip empty external type lookup

* fix(compiler): honor external type boundaries
2026-08-02 19:41:35 -05:00
Chris Tate 20f2d98fa3 fix(compiler): refine narrowed union payload fields (#84)
* fix(compiler): refine narrowed union payload fields

- Treat pure union discriminant reads as stable within compound guards.
- Cover payload-field range refinement in analysis and library builds.

* fix(compiler): preserve field facts across union discriminants
2026-08-02 19:37:32 -05:00
Chris Tate a0c5d6a549 Document synthesized sidecar structs (#83)
- Define the optional marker as literal true for compiler-created inline records.

- Reject malformed markers and pin the format-1 validator behavior.
2026-08-02 19:13:01 -05:00
Chris Tate d1ce6ae7d0 Speed up native-cache CI coverage (#82)
- Memoize immutable native toolchain probes within test workers.

- Preserve strict production-path cache invalidation coverage.

- Shard cache correctness tests without redundant sanitizer runs.
2026-08-02 18:27:29 -05:00
Chris Tate 9fb068ae27 Merge pull request #77 from vercel-labs/ctate/node24-fetch-inventory
feat(compat): inventory Node 24 fetch surface
2026-08-02 16:37:36 -05:00
Chris Tate efb7e77281 fix: address fetch compatibility review findings 2026-08-02 15:31:00 -05:00
Chris Tate c356ff0ac0 Merge pull request #73 from vercel-labs/ctate/no-persist-compile
Persist native compilation cache
2026-08-02 14:58:35 -05:00
Chris Tate 68263610e3 fix(compiler): prevent stale native cache hits 2026-08-02 13:59:06 -05:00
Chris Tate 3f2a78894e fix(fetch): address Node 24 compatibility gaps 2026-08-02 13:28:46 -05:00
Chris Tate a1215f6ef9 fix(compiler): bypass cache for opaque wrappers 2026-08-02 13:00:17 -05:00
Chris Tate 0b79e36973 fix: align fetch runtime with Node 24 semantics 2026-08-02 12:29:31 -05:00
Chris Tate 24904ddff7 fix native cache invalidation and safety 2026-08-02 12:03:56 -05:00
Chris Tate f8377a7440 fix fetch computed dispatch semantics 2026-08-02 11:59:05 -05:00
Chris Tate 8c20c9ac73 fix: validate computed fetch dispatch 2026-08-02 11:29:23 -05:00
Chris Tate 987c52cf18 fix compiler wrapper cache identity 2026-08-02 10:59:32 -05:00
Chris Tate af685d05f9 fix: close fetch inventory review gaps 2026-08-02 10:41:37 -05:00
Chris Tate b2711aa6a2 fix compiler cache identity gaps 2026-08-02 01:22:41 -05:00
Chris Tate b90c0466b2 fix: enforce fetch surface compatibility 2026-08-02 01:09:40 -05:00
Chris Tate c124516e05 fix compiler cache identity 2026-08-02 00:26:56 -05:00