Skip to content

zjs v0.1.0

Choose a tag to compare

@aneryu aneryu released this 17 Aug 10:00
· 82 commits to main since this release

First real release, replacing 0.1.0-alpha.1 and 0.1.0-alpha.2. The checked
test262 profile reports zero failures (44,581 pass). The 15-item javascript-zoo
geomean is 1.0141 vs QuickJS. Trusted-code embedding positioning is unchanged:
zjs is not an in-process sandbox for hostile JavaScript.

  • Completed QCP-1B: removed the legacy Phase 1/2/3 compiler, dual comparator,
    and -Dzjs_compiler option. Deletion bisection traced the former crypto
    regression to shrinking CompileContext by one unused pointer, which
    perturbed Zig 0.16 whole-program native layout despite identical bytecode and
    allocation streams. The same-sized reserved word was used only as a control;
    the shipped fix restores explicit non-inlined boundaries around V2 lowering
    and the stack-size walk. The no-padding deletion candidate measures 1.0061x
    on the 15-item Zoo A/B. The diagnosis and amended verdict are in
    docs/qcp1_switch_decision.md §9.
  • Fixed Array sort writeback when an indexed setter mutates a successor
    element, Error.prototype.stack setter edge cases, and TypedArray
    DefineOwnProperty detach-during-conversion semantics.
  • Removed the historical C QuickJS performance comparison workflow and
    perf-compare; the checked performance gate is the ZJS self-baseline.
  • Added a run_runtime_profile.js helper and zig build perf-uri-profile
    shortcut for checked single-script --perf-json artifacts that stay separate
    from multi-case microbench reports.
  • Extended checked runtime-profile artifacts with opcode summary rows and added
    opcode-specific runtime diff metrics such as opcode_count:get_var_ref0.
  • Added deterministic opcode-count ceilings to checked runtime-profile runs so
    focused hot-path fusions fail loudly when their opcode reductions disappear.
  • Added diff_runtime_profile.js so single-script runtime profiles can be
    compared with explicit timing/allocation regression and improvement gates.
  • Added an empty checked-local int32 for-loop range skip for loops whose body is
    only the induction update, reducing the empty_loop profile from 60007
    opcodes to 7 while preserving interrupt fallback.
  • Added a dense array indexed append fast path for simple int32 multiply/mask
    element expressions while preserving inherited indexed setter fallback.
  • Added a var-local int32 arithmetic-store fast path for microbench-style loop
    bodies without changing loop condition or post-update semantics.
  • Added narrow String.fromCharCode and Math.min/Math.max method-call fast
    paths that keep object coercion and monkey-patched methods on the generic
    call path.
  • Added local, closure, and global simple-numeric bytecode call add-store fast
    paths for tight acc += fn(i, c) loops while preserving non-simple function
    side effects.
  • Tightened the URI 4-byte decode comparison fast path to use a borrowed
    native-method guard instead of transient method value dup/free churn.
  • Shortened the percent-hex simple string add-store path used by URI decode
    fixtures by avoiding the transient helper result value before global writeback.
  • Added a guarded make_var_ref assignment fusion for global = string + percentHex(int) loops so reference setup and put_ref_value are skipped when
    all participating bindings are ordinary global data properties.
  • Added matching global-string and literal-prefix declaration initializer
    fusions for var next = prefix + percentHex(int) and var next = "%F0%A0" + percentHex(int), eliminating the URI 4-byte profile's remaining
    get_var_ref0 executions.
  • Added a backward-goto global int32 condition fusion that replays the target
    loop condition directly at the backedge when it is an ordinary global data
    comparison, reducing the URI 4-byte profile's get_var executions by 66576.
  • Extended the URI strict-equality branch-count fusion to ordinary global data
    count++, reducing the URI 4-byte profile's if_false8 executions from
    65536 to 1 and its get_var executions by another 65535.
  • Refreshed active documentation to match the current build steps, test262
    boundary, ZJS self-baseline performance gate, and tracked active reports.
  • Removed the completed Production v1 roadmap from the active docs; public API,
    compatibility, and release-checklist docs are the current authorities.
  • Merged the small Compatibility v1 summary into COMPATIBILITY.md so the
    compatibility boundary has one active source of truth.
  • Removed old one-off test262 slice and QuickJS comparison report directories
    from reports/; the active gate report remains reports/test262-latest/.
  • Removed the future-oriented Bun/uWS GC design note from the active docs; the
    current GC boundary remains documented in README.md and LIMITATIONS.md.
  • Removed the unused opcode-alignment report snapshot from reports/.
  • Removed historical phase/ledger documents from the active tree:
    docs/gc-memory-lifecycle-candidates.md, docs/perf/roadmap.md, and
    reports/perf/baseline/phase-a-baseline.md.

Evidence

  • engine-production-gate green from a clean checkout at 2b58a5e1 (log attached: zjs-v0.1.0-gate-evidence.txt); ReleaseSafe suite: 2266 passed / 1 skipped / 0 failed.
  • test262: 0/49,775 errors, 44,581 pass; corpus pin 4249661388e5d3f92a85186213da140a6481490f, config test262.conf.
  • Performance: maintainer-measured on ARM Cortex-X925 / Linux 6.17 vs QuickJS pin 04be246 (upstream Makefile default release build, GCC 13.3.0). Verdict and per-benchmark attribution: reports/perf/qjs-align/PARITY-LEDGER.md (2026-08-17 收尾终章) and reports/perf/qjs-align/2026-08-17/. No independent reproduction yet.
  • Authoritative status page: STATUS.md. Boundary: trusted-code embedding only (docs/security-boundary.md).