Commit Graph
552 Commits
Author SHA1 Message Date
Chris Tate e7bc05d6aa refactor: share async generator scaffolding
- Extract per-backend argument-pack and trampoline prologue helpers.

- Preserve async promise and generator completion, drop, cache, and spawn epilogues.
2026-08-23 15:49:41 -05:00
Chris Tate c9f532f532 refactor: merge Set and Map intrinsic emission (#226)
- Route Map and Set operations through shared map-like emitters in both backends.
- Keep collection-specific get, set, add, iteration value, and array conversion lowering.
2026-08-23 15:34:36 -05:00
Chris Tate 14239698da refactor: centralize runtime fence deferral (#212)
- Add a shared deferToRuntimeFence helper for diagnostics, messages, and trap IR.
- Preserve statement, closure, function ABI, probe, and SC9001 behavior.
- Replace eight duplicated lowering paths with compact helper calls.
2026-08-23 13:54:40 -05:00
Chris Tate 1b26642633 refactor: share IR construction helpers (#211)
- Add typed builders for variable references and primitive literals.
- Replace duplicated lowering-local constructors with the shared API.
2026-08-23 13:09:32 -05:00
Chris Tate 876061ab71 refactor(compiler): centralize pointer kind sets (#210)
- Export canonical handle and pointer kind sets from the IR.
- Replace repeated C and LLVM dispatch ladders with membership checks.
- Preserve exhaustiveness and cover the scalar handle exception.
2026-08-23 09:18:07 -05:00
Chris Tate de81740174 Consolidate runtime RC symbol dispatch (#209)
- Define one exhaustive IR runtime RC stem table shared by refcount detection and both backends.
- Derive C and LLVM retain/release symbols while preserving shape-specific and ABI exceptions.
- Add focused coverage for runtime, object, record, and LLVM declaration paths.
2026-08-23 00:46:47 -05:00
Chris Tate f5f04a5f49 Improve compiler lint and error classification (#208)
* Warn on non-null assertions

- Surface non-null assertions during linting without making them blocking.

- Preserve existing assertion sites for opportunistic cleanup.

* Classify internal compiler errors

- Export InternalCompilerError and migrate compiler invariant throws without changing messages.

- Rename the native cache test to match cc.ts and update test scheduling references.

- Document test placement by unit, package integration, and cross-package scope.

* Fix internal compiler error classification
2026-08-23 00:02:28 -05:00
Chris Tate 97668de086 refactor(cc): narrow cache identity guards (#207)
- Bind cache roots and identities into typed cache capabilities.
- Thread narrowed identities through archive and executable cache keys.
- Remove the fragile cacheIdentity non-null assertions.
2026-08-22 20:27:46 -05:00
Chris Tate 27729aa24d fix(compiler): reset module caches between compiles (#206)
- Scope resolver, ccache, release identity, and fence taxonomy memoization to public compile invocations
- Add in-process reuse regressions for project realms, PATH changes, and library metadata
2026-08-22 19:19:35 -05:00
Chris Tate 2d40680932 chore(compiler): trim internal value exports (#205)
- Make file-local compiler helpers private across frontend and backend modules
- Remove dead declarations exposed by the tighter module boundaries
- Preserve tested IR deserialization and generated manifest dependencies
2026-08-22 14:32:21 -05:00
Chris Tate 2fb3a65a99 Prepare v0.0.35 release (#194)
- Bump the CLI, compiler, runtime, and surface manifest to v0.0.35.
- Publish release notes for faster development builds and compiler correctness fixes.
v0.0.35
2026-08-21 22:33:49 -05:00
Chris Tate 30d45bd126 Tune LLVM splitting for dev libraries (#193)
- Lower the dev-library split floor and bucket target for faster localized rebuilds.
- Preserve executable, release, sanitized, and cache-validation behavior.
2026-08-21 21:58:03 -05:00
Chris Tate af333016d4 perf: preseed native build caches (#192)
* perf: preseed native build caches

- Warm runtime, TLS, and dynamic-engine artifacts during npm installation
- Add an explicit toolchain-aware cache warm command for images and CI
- Move vendor artifacts into the user cache and build QuickJS directly

* fix: harden native cache warming

* fix: promote staged vendor cache entries

* fix: isolate shared native cache entries

* fix: validate shared vendor cache artifacts
2026-08-21 19:52:25 -05:00
Chris Tate 5138c1683a perf: add executable dev object caching (#191)
- Add an explicit executable dev posture using native -O0 builds
- Split large LLVM programs into parallel, independently cached objects
- Preserve release cache compatibility and safe single-TU fallbacks
2026-08-21 13:03:31 -05:00
Chris Tate 09f51311f9 perf: reduce checker RPC traffic (#190)
- Batch checker type work for reached call/receiver paths and eager npm-static implicit instances.
- Memoize immutable type constituents and skip array checks for visibly non-object types.
2026-08-21 11:42:42 -05:00
Chris Tate 2805c3ddb4 perf: lazy-load the compiler from the CLI (#189)
* perf: lazy-load the compiler from the CLI

- Serve help and version from a lightweight bootstrap and route exact executable cache hits before loading the compiler graph.
- Validate routed hits against compiler, frontend, toolchain, and native dependency proofs with portable cache publication.

* fix: repair lazy executable cache routes
2026-08-21 10:29:34 -05:00
Chris Tateandvercel[bot] f237e44c73 perf: cache complete executable builds early (#188)
* perf: cache complete executable builds early

- Restore exact executable builds before TypeScript frontend and lowering work.
- Validate frontend, native dependency, mode, target, and FFI identities before reuse.
- Cover cross-process hits, corruption repair, invalidation, and native fallback behavior.

* Update tests/harness/README.md

Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>

* fix: harden early executable cache identity

* fix: fingerprint effective compiler for early cache

---------

Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com>
2026-08-21 08:41:51 -05:00
Chris Tate a72679c677 perf: split large library program objects (#186)
* perf: split large library program objects

- Split large LLVM dev libraries into stable, parallel compilation shards.
- Cache shard objects independently and merge them into the canonical archive member.
- Preserve public ABI and fall back safely for unsupported or TLS-bearing IR.

* fix: harden program shard caching

* fix: harden program shard merging

* fix: decouple shard cache from merge tools
2026-08-20 23:28:17 -05:00
Chris Tate ce6eb7e5fe Prefetch checker work by lowering phase (#181)
* Prefetch checker work by lowering phase

- Batch program structure and reachable body waves without querying dead bodies.
- Preserve memoization and panic fencing with focused checker coverage.

* Batch checker queries in coverage remainder

* Batch JavaScript class collection queries

* Batch managed checker analysis gaps

* Batch types for previously prefetched symbols
2026-08-20 18:17:08 -05:00
Chris TateandxXCrash2BomberXx 58c214a42e Fence unsupported Array.from elements (#183)
* Fence unsupported Array.from elements

- Share the backend-supported array-element contract across type mapping, callback producers, and IR validation
- Diagnose or defer unsupported Array.from mapper results before emission
- Cover the JavaScript runtime-fence path that previously crashed the C emitter

Co-authored-by: xXCrash2BomberXx <91439080+xXCrash2BomberXx@users.noreply.github.com>

* Fence unsupported array producer results

---------

Co-authored-by: xXCrash2BomberXx <91439080+xXCrash2BomberXx@users.noreply.github.com>
2026-08-20 18:13:50 -05:00
Chris TateandxXCrash2BomberXx 2cbd7a56ee fix(compiler): lower dyn-backed record equality reads (#184)
- Route JSDoc record absence probes through checked-dynamic keyed reads.
- Cover strict equality, missing keys, and object identity for dot and bracket access.

Co-authored-by: xXCrash2BomberXx <91439080+xXCrash2BomberXx@users.noreply.github.com>
2026-08-20 18:07:21 -05:00
Chris Tate d7b4480e47 chore: prepare v0.0.34 release (#179)
- Bump all published packages to v0.0.34
- Document library caching, lowering, and record-spread performance improvements
- Refresh the compiler surface manifest for the release
v0.0.34
2026-08-20 14:55:44 -05:00
Chris Tate 6310dfb960 Reuse reachability lowering output (#178)
* Reuse reachability lowering output

- Retain reachable IR and assemble the emitted module without lowering bodies a second time
- Preserve reached-only artifact filtering, coverage remainder behavior, and add lowering phase timing

* Preserve record order in retained lowering

* Preserve record order in retained helpers

* Preserve generic lowering record order

* Recheck retained generic rest order

* Record retained lowering parity fixtures

* Preserve retained lowering failure parity
2026-08-20 14:01:39 -05:00
Chris Tate 5544b23ee9 Cache emitted library translation units (#175)
* Cache emitted library translation units

- Restore cached C and LLVM translation units on semantic library cache hits while refreshing volatile build identity
- Rebase public C source annotations and strip them from stable native-cache inputs

* Fix cached library source annotations

* Fix cached C source annotations

* Fix cached C newline annotations
2026-08-20 02:04:30 -05:00
Chris Tate 741e8cd3f6 Split volatile library identity code (#174)
* Split volatile library identity code

- Emit build identity getters from a tiny standalone C translation unit
- Cache generated library program objects independently of volatile identity and archives
- Preserve toolchain, runtime, and translation-unit dependency invalidation coverage

* Preserve library identity during localization

* Keep library identity sources private

* Preserve library identity in public emission

* Preserve identity in kept library units
2026-08-19 23:36:22 -05:00
Chris Tate 06d50244d0 Reuse IR across comment-only library edits (#171)
* Reuse IR across comment-only library edits

- Restore validated lowered IR when TypeScript edits change only non-semantic comments
- Rebase source locations and regenerate exact-source sidecar and build identities
- Add semantic invalidation, integrity, and real-cache coverage

* Fix semantic cache lexical validation

* Use canonical IR version in semantic cache

* Fix semantic cache lexical rebasing

* Fix semantic cache Unicode identifiers
2026-08-19 13:02:47 -05:00
Chris Tate d1a1da97a2 Cache unchanged library frontends (#169)
* Cache unchanged library frontends

- Restore generated library artifacts before TypeScript and lowering on exact repeats
- Track source, configuration, package-resolution, and missing-candidate inputs for safe invalidation
- Add integrity, replacement, and cache-disable coverage plus cache documentation

* Fix early frontend cache invalidation

* Fix early cache input race tracking

* Fix early frontend cache output tracking

* Key frontend cache by Node version
2026-08-18 11:04:08 -05:00
Chris Tate 273ceac4a7 Optimize same-shape record spreads (#168)
* Optimize same-shape record spreads

- Lower TypeScript record updates through reusable clone helpers
- Outline large record clones in C and LLVM to reduce generated code
- Add ownership, IR, integer-proof, and differential coverage

* Fix cast record spread clone fallback
2026-08-17 23:37:15 -05:00
Chris Tate f29459f17e chore: prepare v0.0.33 release (#167)
- Ship native callback lifecycle support and JavaScript-truthy filter semantics.
- Document build performance improvements and synchronize release metadata.
v0.0.33
2026-08-17 21:02:49 -05:00
Chris Tate ff98ee2330 Speed up scriptc builds (#166)
* Speed up scriptc builds

- Cache native compilation inputs and enable Node 24 bytecode caching
- Memoize frontend type lowering and reduce checker overfetch
- Add dev-mode library optimization and phase timing

* Fix persistent cache invalidation

* Fix native cache dependency validation

* Fix native cache header shadow invalidation
2026-08-17 20:15:56 -05:00
Jimmy Miller 729f809099 Merge pull request #153 from vercel-labs/split/filter-truthy-predicate
feat(compiler): accept truthy filter predicates
2026-08-17 08:56:40 -07:00
Jimmy Miller b98b7c4a49 fix(compiler): guard zero-arg dynamic filter calls 2026-08-17 10:34:43 -04:00
Chris TateandDemonGPT a737fde346 feat(ffi): marshal foreign-thread callbacks (#164)
* feat(ffi): marshal foreign-thread callbacks

- Add format 5 foreign callback descriptors with strict retained, context, and void-return validation.
- Marshal copied callback arguments through an optional MPSC event-loop queue in both C and LLVM backends.
- Cover concurrent delivery, liveness, fairness, teardown, cross-platform builds, and document the boundary contract.

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

* fix(ffi): preserve callback checkpoints

---------

Co-authored-by: DemonGPT <127974011+DemonGPT@users.noreply.github.com>
2026-08-16 22:59:02 -05:00
Chris TateandDemonGPT b53285d650 feat(ffi): add retained callbacks (#163)
* feat(ffi): add retained callbacks

- Add format 4 retained registration and explicit release descriptors with pointer-identity validation.
- Pin callbacks in runtime registration tables and emit matching C/LLVM adapters with deferred exception checks.
- Cover lifecycle and sanitizer cases, and document the same-thread callback boundary.

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

* fix(ffi): harden retained callback lifecycle

* fix(ffi): reject same-call retained releases

* fix(ffi): reject inline retained releases

* fix(ffi): preserve plain exit listener timing

---------

Co-authored-by: DemonGPT <127974011+DemonGPT@users.noreply.github.com>
2026-08-16 20:43:18 -05:00
Chris TateandDemonGPT da9a8f5524 feat(ffi): copy callback strings and spans (#162)
* feat(ffi): copy callback strings and spans

- Add format 3 callback classes for cstrings, UTF-8 spans, and byte spans.
- Materialize owned callback arguments in both backends with strict null handling.
- Cover validation, ownership, sanitizers, and document the boundary contract.

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

* fix(ir): bump schema for callback spans

---------

Co-authored-by: DemonGPT <127974011+DemonGPT@users.noreply.github.com>
2026-08-16 08:52:45 -05:00
Chris Tate 5f4e576685 chore: prepare v0.0.32 release (#161)
- Bump workspace packages and the generated compiler manifest to v0.0.32.
- Document ARM64 musl, Windows TLS trust, and comparison-proof updates.
v0.0.32
2026-08-15 21:14:38 -05:00
Chris TateandcodeAnqiang-ma 26adda011b fix(compiler): refine false inequality branches (#160)
* fix(compiler): refine false inequality branches

- Clear possible NaN values when the false edge of !== proves equality.
- Keep comparison refinement aligned with the original branch outcome.

Co-authored-by: codeAnqiang-ma <273298913+codeAnqiang-ma@users.noreply.github.com>

* test(compiler): cover false inequality NaN branches

* fix(compiler): guard NaN comparison refinement

---------

Co-authored-by: codeAnqiang-ma <273298913+codeAnqiang-ma@users.noreply.github.com>
2026-08-15 20:37:51 -05:00
Chris TateandKayakyx 952f5788aa fix(runtime): trust Windows root certificates (#158)
* fix(runtime): trust Windows root certificates

- Load default TLS roots from the Windows ROOT store.
- Link crypt32 for Windows TLS builds.
- Cover the certificate-store import in cross-build tests.

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

* fix Windows CA store policy handling

* fix(runtime): cover Windows policy root stores

* fix(runtime): dedupe Windows root stores

* fix(tls): match Windows system CA stores

---------

Co-authored-by: Kayakyx <Kayakyx@users.noreply.github.com>
2026-08-15 19:27:33 -05:00
Chris TateandArth Tyagi 6f50205dfd feat: support aarch64 Linux musl (#159)
- Implement the Zig 0.16.0 AArch64 musl runtime and preserve compiler failure diagnostics.

- Promote the target through executable, library, localization, and documentation matrices.

- Verify both backends and the complete arm64 Alpine differential contract.

Co-authored-by: Arth Tyagi <41021374+arthtyagi@users.noreply.github.com>
2026-08-15 10:53:06 -05:00
Chris Tate 7dfd25484e chore(ovation): checkpoint agent step (#155) v0.0.31 2026-08-14 12:06:20 -05:00
Chris TateandJohn Lindquist 1e4f71dddf fix(compiler): recognize tuples in Array.isArray (#154)
* fix(compiler): recognize tuples in Array.isArray

- Treat fixed tuple record shapes as JavaScript arrays.
- Keep union tag tests and narrowing aligned.
- Add Native SDK facade regression coverage.

Co-authored-by: John Lindquist <36073+johnlindquist@users.noreply.github.com>

* fix(compiler): narrow readonly tuple arrays

* fix(compiler): preserve narrowed readonly tuples

---------

Co-authored-by: John Lindquist <36073+johnlindquist@users.noreply.github.com>
2026-08-14 10:50:35 -05:00
Jimmy Miller 625a8ee6c0 fix(compiler): fence dynamic filter void predicates 2026-08-14 10:27:39 -04:00
Jimmy Miller 76dde4bf87 test(compiler): refresh filter void snapshot 2026-08-14 10:27:38 -04:00
Jimmy Miller 6f4592295f test(compiler): cover island filter void predicate 2026-08-14 10:27:38 -04:00
Jimmy Miller f1a577fd0a test(compiler): record dynamic filter diagnostic baseline 2026-08-14 10:27:38 -04:00
Jimmy Miller 4fe24e91d4 fix(compiler): clarify void filter predicate fence 2026-08-14 10:27:38 -04:00
Jimmy Miller 0bd90765cf feat(compiler): accept truthy (non-bool) filter predicates
`.filter(fn)` required the callback to return exactly bool. JS applies
ToBoolean to whatever the predicate answers, so `xs.filter((s) => s)` — the
idiomatic drop-the-falsy — was refused for no semantic reason.

The filter loop now wraps the call in the same toBool an `if` statement would
apply. A bool answer is unchanged and emits identical IR. A union answer
routes through its interned per-arm truthy helper, requested at the call site
where a real node exists for the diagnostic. A unit-only answer is constantly
falsy, and the call still runs for its effects.

The kinds with no native ToBoolean keep the fence: void has no value at all,
and dyn/jsval/caught truthiness needs the embedded engine.

Verified against Node: filtering strings, numbers, and a
`(string | undefined)[]` all print identically in both.

Diagnostics 100, filter corpus 9 across both
backends.
2026-08-14 10:27:38 -04:00
Chris Tate 7586e0ed1b chore: prepare v0.0.30 release (#149)
- Bump all published packages and the surface manifest to v0.0.30.
- Promote host-callback channels into the marked release notes.
- Include callback registration in cross-target ABI symbol checks.
v0.0.30
2026-08-13 22:35:00 -05:00
Chris Tate 81b70b0ee6 feat: add host-callback channels to library mode (#148)
* feat: add host-callback channels to library mode

- the profile's `callbacks` array declares named channels and
  `abi.callback_register_symbol` names the one registration entry point:
  `int32_t <sym>(const char *name, void (*fn)(void), void *ctx)` — 0 on
  success, -1 for an unknown or NULL name, latest registration wins, a
  NULL fn clears, registrations persist across init/reset. The stored
  pointer's typed shape is the channel's with the opaque context first,
  the panic sink's layout
- channel signatures ride the existing marshalling classes: params are
  f64/bool/string/bytes plus the u8/u32/i32 plumbing classes (outbound
  plumbing keeps JS's ToUint32/ToInt32, the executable FFI rule);
  returns are scalar only (f64/bool/u8/u32/i32/void — a buffer return
  needs an ownership contract the mode does not define). string/bytes
  parameters arrive as (ptr, len) pairs borrowed for the call's duration
- compiled code reaches a channel as a signature-only ambient function
  declaration whose direct calls deliver synchronously on the calling
  thread; the recognition rides the FFI import machinery under a library
  flavor: SC4024 refuses a call the channels cannot serve (undeclared
  name or off-class signature), unused channels are legal capacity, and
  callback-free profiles keep the ambient ReferenceError semantics
- calling an unregistered channel is the SC4025 runtime trap: a detected
  trap through the library funnel, so the structured sink message names
  the channel in its text and the entry the host called in its symbol
  field, and profile teachings/remediations overlay it like the rest of
  the runtime family
- registration slots are per copy of the runtime state, the sink's story:
  per-archive under abi.localize_runtime (the register symbol joins the
  localization keep-list), per-thread instance under
  abi.instance_per_thread. The host callback must not reenter any library
  entry or unwind across library frames
- both emissions produce identical behavior by construction: the slot
  store/fetch lives in scr_library.c (scr_library_cb_set/_require/_ctx),
  the generated TU emits the registration dispatch and typed indirect
  calls, and the trap text is assembled once at export resolution
- callback-free profiles emit byte-identical program TUs and serialized
  IR, and executable builds are byte-identical end to end
- conformance: the CB suite (tests/harness/library-callbacks.test.ts)
  covers the acceptance stream, unregistered and pre-registration traps,
  symbol exactness, teaching overlays, SC4024 refusals, capacity and
  callback-free postures, the localized+thread-instanced composition
  probe, and ASan reruns; profile-shape refusals join
  library-profile.test.ts

* fix: preserve callback binding identity

* fix: harden library callback contracts

* fix: recognize project callback declarations

* fix: enforce host callback declarations
2026-08-13 21:44:55 -05:00
Jimmy Miller a86888873d Merge pull request #95 from vercel-labs/jimmym/portless-support
feat: support compiling and running Portless
2026-08-13 14:04:53 -07:00