Commit Graph
93 Commits
Author SHA1 Message Date
Chris Tate b249cc6bae Regenerate the runtime header split on current main 2026-10-15 03:01:21 -05:00
Chris Tate 72cd278f17 Run the Mach-O library and arm64 string oracle tests in the pull request macOS suite (#994) 2026-10-15 02:34:39 -05:00
Chris Tate 4d54f6c4d8 Split scr_runtime.h into per-module runtime headers
scr_runtime.h now includes 48 module headers (scr_core.h, scr_rc.h,
scr_string.h, scr_dyn.h, scr_http.h, ...) in dependency order and holds no
declarations. Each module header holds whole sections of the former file,
includes the headers whose names it uses, and compiles on its own.

Declarations, macros, struct layouts and inline bodies are unchanged. Five
blocks move to join their module: the class-hierarchy vtable header (into
scr_error.h, after the string core), the node:timers/promises pair (into
scr_async.h), the JSON.parse entry points and the JSON output buffer (into
scr_json.h, after the dyn declarations) and the EventTarget block (after
scr_json.h). No moved block uses or declares a name that a block it moves
past uses or declares. The string methods keep their position after the
class objects in scr_string_methods.h, because their struct ScrDyn
parameters rely on the file-scope struct ScrDyn declaration there.

The runtime ABI scan reads scr_runtime.h with its module headers expanded
in include order. A runtime test compiles every module header on its own.
scripts/runtime-header-hunks.mjs retargets a diff of the single-file
header onto the module headers.
2026-10-15 02:06:23 -05:00
Chris Tate d544a8efe8 Cover the combining Latin letters and vulgar fractions in localeCompare
The localeCompare table now covers U+0363-U+036F, U+00BC-U+00BE and
U+2044 FRACTION SLASH, so strings containing them follow Node's collation
instead of code-point order. A combining Latin letter is its letter's
primary at the letter's secondary, with a tertiary weight between the
letter's case forms where Node places it, and the combining class it
shares with the diacritics it reorders with. A vulgar fraction is the
elements of its compatibility decomposition (1, U+2044, 4), each with the
tertiary weight Node places the fraction at among that position's forms,
so it orders after both 1⁄4 and ¹⁄4. The generator's check adds the
fractions' slash and superscript spellings and the combining letters
around each diacritic. SC6003 and the limitations page describe the new
coverage.

The generated lookup indexes one dense table for every code point below
U+0370, with the gaps between ranges marked uncovered, and checks the
ranges above it (now U+2044) after that, so a Latin lookup is one
comparison instead of up to four.
2026-10-15 01:18:54 -05:00
Chris Tate 820c4eaf77 Match Node's collation for l·, U+0130 and ligatures
The generated localeCompare table now agrees with Node on spellings that
tie at the primary and secondary levels. "l·" and "L·" collate as one
unit, equal to U+0140 and U+013F, through a contraction table. Precomposed
characters take their decompositions' elements after the case weights are
assigned, so U+0130 equals I + U+0307. Ligatures whose spelled-out letters
tie with them (ij and ij) get the case weight Node places them at among
their first letter's case forms, and ligatures with their own secondary
(Æ) keep their own case. The generator's check now also compares every
covered character's decompositions, case forms and ligature spellings in
four contexts. A per-thread class table lets the lazy primary comparison
find characters that need element lists with one lookup.
2026-10-14 23:49:11 -05:00
Chris Tate 93720d1f9e Run the Mach-O library and arm64 string oracle tests in the pull request macOS suite
The pull request macOS lane runs the darwin suite: the differential corpus
plus every file whose assertions take darwin-specific branches. The library
suites (library-multi, library-callbacks, library-dispatch) take the Mach-O
localization and link arms on darwin, and the runtime string oracle checks
the arm64 parseInt answers, but none of them were in the list, so changes
that broke them on macOS reached main before a macOS run saw them. Add the
four files to darwinFiles.
2026-10-14 19:58:19 -05:00
Chris Tate 47223bdfaa Use plain wording in docs, comments and test names (#981) 2026-10-14 12:25:43 -05:00
Chris Tate 3f8e0bcb13 Use plain wording in docs, comments and test names 2026-10-14 11:43:44 -05:00
Chris Tate bd9a994060 Add the legacy url API and url.domainToASCII/domainToUnicode 2026-10-14 08:10:02 -05:00
Chris Tate 090ccabb72 Add LifetimeRegion to @scriptc/experimental 2026-10-13 21:12:20 -05:00
Chris Tate 644722e696 Run the PR test shards on Linux 2026-10-12 15:21:39 -05:00
Chris Tate 7e6294ca0f Make scriptc compilation native-only 2026-10-12 12:25:30 -05:00
Chris Tate 48b5935337 Unshare repeated IR nodes before emission and contract checks 2026-10-12 01:47:05 -05:00
Chris Tate 2933ebc985 Store order-parity baselines one file per fixture 2026-10-12 00:08:53 -05:00
Malte Ubl 5d4509702f wip: contract types prototype 2026-10-11 11:17:17 -07:00
Malte Ubl a7663551e3 Install Polly in the managed sandbox bootstrap
LLVM 22 CMake exports reference the Polly libraries, so building the LLVM helper in a sandbox started from vercel/sandbox/universal fails without libpolly-22-dev. Custom images that already contain it are unaffected.
2026-10-10 14:04:04 -07:00
Malte Ubl 272aef3247 Release @scriptc/threads with the other packages
sync-versions stamps packages/threads with the CLI version (0.2.7 now),
the release workflow checks that version and publishes the package
before scriptc, and RELEASING.md lists it with the packages that always
release together. npm trusted publishing must be configured for
@scriptc/threads before the next release: a package without it fails
before upload.
2026-10-10 01:00:36 -05:00
Chris Tate 3e41bcbfd0 Make compile blockers and Node differences actionable (#786) 2026-10-09 10:30:31 -05:00
Malte Ubl cd5e46843c bench-runtime: separate the workload and posture help paragraphs 2026-10-08 15:46:34 -05:00
Malte Ubl 2372b75ec2 Add an opt-in --optimization=speed posture
Speed is a third native optimization posture next to release (default,
-O2) and dev (-O0). It is optimized exactly like release at the C/LLVM
level and is the switch for optimizations that trade executable size and
build time for run-time speed, so the default release build stays inside
the binary-size budget.

- backend/optimization.ts: the NativeOptimization type, its -O class, and
  cache-key helpers. Release keeps its historical key shapes (absent).
- CLI: build/run/cache warm accept speed; usage text names the trade.
  Bootstrap's routed executable cache mirrors the posture.
- Early executable cache keys and native-feature validation include speed,
  so release, dev, and speed entries never satisfy one another.
- Runtime packs: an optional executable `speed` flavor (-O2, only beside
  release). Speed links it when present and the release objects otherwise;
  library modes link their release flavor. The sanitizer lane follows the
  same flavor key.
- Library profiles accept "speed".
- WASI release-only linker flags apply to speed too.
- bench-runtime: --baseline-optimization/--candidate-optimization and a
  per-contender cold_build_ms.

Release executables are byte-identical to the stack tip for all 14
benchmark workloads (macOS arm64, sha256 of executables built from both
trees).
2026-10-08 15:46:34 -05:00
Malte Ubl 2b131ddec3 Add server and startup workloads to the runtime benchmark suite
The suite only had single-process CPU workloads. Add the two largest
real-world categories:

- http-api (kind "server"): a node:http JSON API in the static subset
  (routing, query parsing, seeded catalog, per-cart state, typed JSON
  bodies, ETag/If-None-Match, auth and request-id headers), driven by
  clients/http-load.mjs, a raw-socket keep-alive HTTP/1.1 load client
  that is identical for every server. 64 connections, 2 client threads,
  4,000 untimed warmup and 40,000 measured requests on loopback. The
  per-connection request schedule is seeded and server state is
  partitioned per connection, so the response digest is deterministic.
  Correctness compares server stdout, server stderr (minus the PORT
  line), exit status, and client stdout with Node byte-for-byte. The
  timed sample is the measured-phase wall time; a second table reports
  req/s, p50/p90/p99 latency, client CPU, and peak RSS.
- cli-config (process, launches: 20): a deploy-plan CLI that reads a
  ~110 KB JSON manifest, validates, interpolates env values, and orders
  80 services into dependency waves. Each sample is the median of 20
  launches, so startup dominates.

The runner stays backward compatible: process workloads behave as
before, the JSON report keeps its fields and adds kind, launches,
category, server, node_peak_rss_bytes, and geomean_vs_node_by_category,
and the summary prints per-category geomeans (cpu, startup, server).
2026-10-08 15:33:00 -05:00
Malte Ubl 2a2e84c3fc bench-runtime: add --layouts to pool runs over perturbed code layouts
--layouts=N links every executable N times with 0, 16, 32, ... bytes of
retained padding just before the program object (a SCRIPTC_LINKER
wrapper that forwards to clang) and rotates the timed runs through
those layouts, so medians and CIs cover code-placement luck. Each
layout's binary is checked against Node. The default of 1 keeps the
existing behaviour and output; per-layout medians go into the JSON.
Works with any checkout's compiler, including an unmodified baseline.

Linux x86-64 (Vercel Sandbox), H23 vs perf/harness, --layouts=4 --runs=16:

| workload | baseline ms | candidate ms | change | 95% CI | verdict | size |
| --- | ---: | ---: | ---: | --- | --- | ---: |
| json-records | 754.4 | 771.2 | +2.2% | -1.9% .. +5.6% | neutral | +1.9% |
| regex-logs | 380.6 | 384.9 | +1.1% | -9.8% .. +7.3% | neutral | +2.7% |
| ast-interp | 385.9 | 395.6 | +2.5% | -5.0% .. +10.6% | neutral | +3.1% |
| records-sort | 1257.0 | 1259.6 | +0.2% | -1.9% .. +2.8% | neutral | +3.2% |
| template-render | 250.7 | 246.1 | -1.8% | -9.9% .. +2.3% | neutral | +3.7% |
| functional-pipeline | 428.8 | 396.5 | -7.5% | -9.5% .. -4.0% | faster | +4.0% |
| async-pipeline | 204.2 | 203.6 | -0.3% | -1.9% .. +1.0% | neutral | +2.5% |
| word-graph | 325.5 | 327.3 | +0.6% | -2.5% .. +3.2% | neutral | +6.5% |
| alloc-trees | 510.1 | 509.4 | -0.1% | -2.3% .. +2.2% | neutral | +4.9% |
| numeric-kernels | 119.5 | 117.6 | -1.6% | -3.1% .. -0.1% | faster | +4.4% |
| validate-errors | 201.4 | 200.4 | -0.5% | -3.2% .. +2.1% | neutral | +3.0% |
| csv-numbers | 456.3 | 443.0 | -2.9% | -3.8% .. -0.3% | faster | +4.0% |
| log-summary | 252.9 | 255.9 | +1.2% | -0.8% .. +2.3% | neutral | +3.9% |
| inventory-report | 461.3 | 452.2 | -2.0% | -6.5% .. +0.2% | neutral | +2.8% |

geomean change: -0.7%

macOS arm64, H23 vs perf/harness, 15 runs:

| workload | baseline ms | candidate ms | change | 95% CI | verdict | size |
| --- | ---: | ---: | ---: | --- | --- | ---: |
| json-records | 265.1 | 263.8 | -0.5% | -1.1% .. -0.2% | faster | -0.0% |
| regex-logs | 297.9 | 290.9 | -2.4% | -3.2% .. -0.8% | faster | +6.3% |
| ast-interp | 228.8 | 229.5 | +0.3% | -1.0% .. +1.4% | neutral | -0.0% |
| records-sort | 595.5 | 602.9 | +1.2% | +0.6% .. +2.0% | slower | -0.0% |
| template-render | 194.7 | 193.0 | -0.9% | -2.0% .. +0.4% | neutral | +8.8% |
| functional-pipeline | 219.9 | 223.6 | +1.7% | +0.8% .. +2.3% | slower | -0.0% |
| async-pipeline | 251.3 | 250.4 | -0.3% | -1.2% .. +0.7% | neutral | -0.0% |
| word-graph | 161.6 | 161.4 | -0.1% | -0.6% .. +1.2% | neutral | -0.0% |
| alloc-trees | 275.6 | 273.7 | -0.7% | -1.5% .. +0.0% | neutral | +0.0% |
| numeric-kernels | 67.5 | 67.3 | -0.2% | -1.8% .. +0.9% | neutral | -0.0% |
| validate-errors | 144.4 | 143.3 | -0.8% | -1.4% .. +0.5% | neutral | +0.0% |
| csv-numbers | 276.3 | 276.3 | +0.0% | -0.7% .. +0.6% | neutral | +0.0% |
| log-summary | 149.9 | 151.3 | +1.0% | -0.2% .. +1.7% | neutral | +0.0% |
| inventory-report | 197.2 | 198.1 | +0.4% | -0.2% .. +1.1% | neutral | -0.0% |

geomean change: -0.1%

No-op change (+32 B program object), Linux, 15 runs: baseline
template-render +10.8% slower (CI +9.3..+12.9%); with H23 every
workload is neutral (regex-logs +1.4%, template-render +0.5%,
records-sort -0.4%). Details: results/h23-layout-noise/REPORT.md.
2026-10-08 15:22:27 -05:00
Chris TateandChris Tate 08f4140293 Harden stacked CI scope and merge validation (#771)
Co-authored-by: Chris Tate <366502+ctate@users.noreply.github.com>
2026-10-08 14:57:21 -05:00
Chris TateandChris Tate 064b05a92c Run full CI for the lowest unmerged stacked PR (#770)
Co-authored-by: Chris Tate <366502+ctate@users.noreply.github.com>
2026-10-08 14:49:10 -05:00
Malte Ubl 1dc9e04fc5 Time Node in the interleaved loop and report candidate/Node ratios
Node is the reference the project aims to beat. A single cold oracle
launch overstated its time; it is now warmed and sampled in the same
interleaved loop as the compiled executables, and the report adds a
per-workload candidate/Node ratio and its geomean. --no-node skips it.
2026-10-08 09:38:24 -07:00
Malte Ubl 523a8271f8 Skip peak RSS when /usr/bin/time is unavailable 2026-10-08 09:38:24 -07:00
Malte Ubl 10b246d604 Add a runtime benchmark suite with Node-verified A/B timing
Fourteen application-shaped workloads (JSON, regex, parsing and class
dispatch, sorting, rendering, collection pipelines, async fan-out,
Map/Set graphs, allocation, numeric kernels, exceptions, CSV, and the
two multi-module build benchmark apps on large inputs).

bench:runtime builds each workload with one or two checkouts, refuses to
time any executable whose stdout, stderr, or exit status differs from
Node, interleaves baseline and candidate launches, and reports medians
with bootstrap 95% confidence intervals, binary size, and peak RSS.
2026-10-08 09:38:23 -07:00
Chris Tate 1f10e83720 Promote canary to main (#738)
- Preserve callback identity, receiver binding, and class references across unions and collections.
- Track record field presence independently of undefined values and improve native runtime behavior.
- Expand differential coverage and streamline CI bootstrap and compiler rebuild checks.
2026-10-08 11:00:13 -05:00
Chris Tate 095b619330 Add native workers and shared memory
- Add native worker execution with isolated module state, structured messages, and lifecycle controls.
- Support shared buffers and integer atomics with coordinated runtime ownership and cancellation.
- Extend compiler, runtime-pack, differential, and compatibility coverage for native concurrency.
2026-10-07 19:07:02 -05:00
Chris Tate f053c81f8f Refactor builtin lowering by API responsibility
- Split builtin lowering into focused API owners and keep module dispatch separate.
- Share byte conversion, receiver checks, and filesystem option parsing; remove redundant forwarding and clarify names.
- Preserve compiler output and diagnostics, with import boundaries enforced by the code-quality checks.
2026-10-06 14:13:28 -05:00
Chris Tate c08ab955ae Enforce linting and consistent source formatting
- Enforce oxlint and oxfmt for owned JavaScript and TypeScript with independent CI checks.
- Preserve compiler import boundaries and protected fixtures while cleaning up lint findings.
- Standardize source formatting and validate import, fixture, and embedded-source protections.
2026-10-05 17:51:24 -05:00
Chris Tate 1d8c042a47 Separate native bootstrap validation phases
- Run command and self-rebuild checks independently in both validation lanes.
- Preserve complete local coverage and native package installation checks.
- Reject invalid phase selection and verify the CI matrix retains every contract.
2026-10-04 12:29:56 -05:00
Chris Tate a0b75e21bf perf: reuse class field metadata during IR validation (#662) 2026-10-04 06:45:43 -05:00
Chris Tate b97ea1d929 Cache repeated AST child lookups in packed tables (#657) 2026-10-04 03:16:34 -05:00
Chris Tate dd405b5b0b Reuse record metadata during IR validation (#656) 2026-10-04 02:33:05 -05:00
Chris Tate aa323891bb Reuse class metadata during IR validation (#655) 2026-10-04 01:56:24 -05:00
Chris Tate c5c018e1af Speed up exception analysis for class-value construction (#649)
* Speed up exception analysis for class-value construction

* Record preflight baseline for constructor exception fixture
2026-10-03 21:04:22 -05:00
Chris Tate 91a7732531 Speed up compiler graph propagation (#644) 2026-10-03 16:25:29 -05:00
Chris Tate a07998f667 Expand static three.js workflows and host integration (#621)
* Expand static three.js workflows and host integration

* Preserve JavaScript class state in static three.js workflows

* Preserve inferred JavaScript behavior across static workflows

* Preserve inferred callables and native compatibility boundaries

* Retain annotated JavaScript factory exports and bootstrap-safe call spreads

* Preserve Buffer and child callback identities in static packages

* Clarify JavaScript symbol spread support
2026-10-02 19:56:34 -05:00
Chris Tate d6978bc4c6 Speed up native bootstrap checks (#607)
* Accelerate sanitized runtime and overlap bootstrap checks

* Reuse native compiler helpers and stabilize callback tests
2026-10-01 23:26:45 -05:00
Chris Tate cc75597869 Shorten the CI critical path (#605)
* Shorten the CI critical path

* Bound Effect runner memory and avoid repeated type checks
2026-10-01 22:18:40 -05:00
Chris Tate 2fe8af1fb1 Speed up CI fixture validation (#603) 2026-10-01 18:48:53 -05:00
Chris Tate e2d58f60d2 Expand static support for common Effect 4 patterns (#600)
* Expand static compilation for common Effect 4 patterns

* Run every Effect 4 fixture slice in CI

* Preserve existing corpus behavior across Effect 4 lowering

* Preserve Effect platform callbacks and native stream state

* Record new corpus baselines and retain child stdin refusals

* Retire the obsolete stateful regex diagnostic

* Preserve promise reference count layout for cycle collection
2026-10-01 17:36:29 -05:00
Chris Tate 0845c7ff56 Make native installs portable and smaller (#599)
* Make native installs portable and smaller

- Support glibc 2.34 with portable compiler binaries and static LLVM helpers.
- Bundle the host runtime and discover optional cross-target packs from project dependencies.
- Add application build benchmarks covering latency, executable size, and memory.

* Keep bootstrap tools available in Sandbox validation

- Isolate Zig for native compiler bootstrap and glibc entropy contracts.
- Preserve the existing toolchain scope for cache and corpus tests.

* Fix portable compiler bootstrap linking

- Keep native support objects compatible with the destination host linker.
- Resolve installed targets using the host declared by the toolchain manifest.
2026-10-01 10:46:16 -05:00
Chris Tate 2069684b40 Expand static Effect support across common APIs (#598)
* Expand static Effect support across common APIs

* Preserve compiler parity across expanded Effect patterns

* Fix compiler regressions exposed by Effect coverage

* Bound shared type conversion traversal

* Clarify conversion contracts and tidy fixtures

* Run every Effect fixture in CI shards

* Preserve inferred array assignments in concurrent Effect programs

* Record inferred array fixture compiler ordering
2026-10-01 02:49:31 -05:00
Chris Tate 2cb4c65896 fix: package Windows distributions across hosts (#596)
- Resolve Windows toolchain paths during package verification and archive creation.
- Preserve completed native builds and accepted uploads across release tooling fixes.
2026-09-30 17:33:24 -05:00
Chris Tate eb7be34d9a perf: reduce compiler work and reuse CI native builds
- Reduce frontend, runtime, and linking overhead for native builds.
- Add compact compiler artifacts and reproducible build timing benchmarks.
- Reuse native CI packages and consolidate self-hosting validation.
2026-09-30 11:08:13 -05:00
Chris Tate ee9f0d64eb feat: ship the self-hosted native scriptc CLI (#585)
* feat: ship the self-hosted native scriptc CLI

- Run the shared compiler and CLI natively, including library builds and compile-time evaluation.
- Install native platform packages and ship relocatable standalone distributions.
- Preserve program semantics and reuse validated build artifacts for fast rebuilds.

* fix: complete native CLI integration and validation

- Preserve library diagnostics and run recursive compiler work on the main stack.
- Restore packaged helper permissions and exercise native npm and Wasm library builds.
- Recover interrupted Sandbox status probes within the original command deadline.
2026-09-30 02:17:56 -05:00
Chris Tate 9d30b56c6b Speed up compiler startup and trim release runtime packs
- Cache host libc detection and load TypeScript 5 only when needed.
- Exclude debug payloads from release runtime packs and vendor archives.
- Preserve native self-hosting, portable diagnostics, and reliable Sandbox execution.
2026-09-29 21:41:39 -05:00
Chris Tate 3f66c8e20b Make LLVM the sole production backend
- Remove C emission, debugging options, and automatic backend fallback.
- Complete LLVM lowering and native bootstrap coverage across supported targets.
- Link executables and libraries with precompiled C runtime packs, including iOS and Android.
2026-09-29 20:54:09 -05:00