Skip to content

Releases: pocket-nexus/quickjs-oxide

quickjs-oxide v0.4.0

Choose a tag to compare

@github-actions github-actions released this 20 Oct 13:56

Install qjs

Prebuilt binaries for Linux (static musl), macOS and Windows are attached below.

# Prebuilt binary through cargo-binstall
cargo binstall --git https://github.com/pocket-nexus/quickjs-oxide quickjs-oxide-cli
# Build from source (Rust 1.99 or newer)
cargo install --locked --git https://github.com/pocket-nexus/quickjs-oxide --tag v0.4.0 quickjs-oxide-cli

WebAssembly

  • quickjs-oxide-wasm-v0.4.0.tar.gz: wasm-bindgen packages for browsers (web/, ES module) and Node.js (nodejs/).

SHA256SUMS lists the digest of every attached file.

What's Changed

  • Embedding API: host functions and objects, interrupts, promises settled from Rust, native modules, buffer access; published to crates.io by @Eric-Song-Nop in #168
  • Replace the playground with a homepage and docs site, deployed to Cloudflare by @Eric-Song-Nop in #166

Full Changelog: v0.3.1...v0.4.0

quickjs-oxide v0.3.1

Choose a tag to compare

@github-actions github-actions released this 19 Oct 10:37

quickjs-oxide 0.3.1

Compilation takes time linear in the size of the source, code compiled at run time is reclaimed, and peak memory is lower.

Compilation

The handler table is built in one pass, name lookups use indexes, and source positions are located in one forward pass. Compile throughput on a 4 MB source rises from 1.03 to 5.46 MB/s (mixed syntax) and from 5.49 to 6.80 MB/s (many functions); QuickJS 2026-06-04 compiles the same sources at 0.40 and 0.62 MB/s.

Memory

  • Code compiled at run time (eval, the Function constructors, modules loaded while the program runs) is freed with its inline caches, atoms and RegExp programs once nothing refers to it. It counts toward the heap cap.
  • The collector budgets the heap at max(min_heap, (1 + growth) × live), arenas allocate from bitmaps, the value heap coalesces freed ranges, and arrays and constant tables take 3 × 2^k sizes.
  • On Linux x86_64 the qjs functions that startup and the common paths run are linked together.

Peak RSS on the fixed-work programs, geometric mean against QuickJS 2026-06-04: 1.59×, from 1.96× before the heap changes (#161). An empty script takes 3.9 MiB, from 4.8 MiB (QuickJS 3.2 MiB). Fixed-work CodeLoad, which compiles code at run time, peaks at 35.8 MiB instead of 122.3 MiB before #156.

Embedding API

  • Runtime::transient_compiler(), EvalOptions::transient() and CompileOptions::transient() compile code that is freed like eval's, such as a REPL's lines. Runtime::compiler() keeps compiled code for the life of the runtime.
  • MemoryReport splits static and dynamic code units and reports dynamic code bytes, RegExp program bytes, free cache entries, pinned atoms and the heap budget.

Install qjs

Prebuilt binaries for Linux (static musl), macOS and Windows are attached below.

# Prebuilt binary through cargo-binstall
cargo binstall --git https://github.com/pocket-nexus/quickjs-oxide quickjs-oxide-cli
# Build from source (Rust 1.99 or newer)
cargo install --locked --git https://github.com/pocket-nexus/quickjs-oxide --tag v0.3.1 quickjs-oxide-cli

WebAssembly

SHA256SUMS lists the digest of every attached file.

What's Changed

  • Build the compile probe without the removed feature list by @Eric-Song-Nop in #153
  • Compile in linear time: one-pass handler table, indexed names, fewer passes and allocations (#154, #155) by @Eric-Song-Nop in #160
  • Reclaim code compiled at run time, its caches and its atoms (#156) by @Eric-Song-Nop in #159
  • Lower peak memory: link order, a reserved-bytes budget, bitmap arenas, a coalescing value heap, smaller arrays by @Eric-Song-Nop in #161

Full Changelog: v0.3.0...v0.3.1

quickjs-oxide v0.3.0

Choose a tag to compare

@github-actions github-actions released this 19 Oct 02:42

quickjs-oxide 0.3.0

Every program now runs on oxide-core: functions compile to register bytecode and run in one loop with inline caches, over NaN-boxed values and a mark-sweep collector. The workspace is safe Rust throughout, with no unsafe.

Performance

Fixed-work programs, release builds on one Linux machine, geometric means of wall time against QuickJS 2026-06-04:

Suite quickjs-oxide / QuickJS time
V8 v7 (8 programs) 0.94×
Octane 2.0 (15) 1.15×
AWFY (14) 0.99×
all 37 1.04×

On the V8 v7 programs, 0.3.0 takes 0.28× the time of 0.2.1.

0.2.1 0.3.0
stripped qjs, bytes 7,656,840 2,985,704
WebAssembly module, bytes 4,978,281 1,893,077
clean release build 71.6 s 22.9 s

Conformance

Test262: 81,441 of the 83,562 variants in QuickJS 2026-06-04's scope pass (97.462%). ECMA-262 and Test262 decide correctness; QuickJS decides what the specification leaves to the implementation. Where QuickJS departs from the specification, quickjs-oxide follows the specification; dev-support/quickjs-spec-departures.tsv lists those departures.

Calls, templates and expressions of any size compile: a call with 65,533 arguments or a template with 65,532 substitutions runs.

Behavior that differs from QuickJS by decision

  • with is a SyntaxError, and nothing reads Symbol.unscopables.
  • A direct eval runs as an indirect eval.
  • A runtime has one realm.
  • Nothing reads Symbol.species.

See docs/deviations.md.

Command line

  • New: --heap-cap-mib, --min-heap-mib, --gc-growth, --stack-limit (memory options), --gc-stats, --memory-report, --disassemble, and --ic-stats / --gc-stress=N in builds with those features.
  • Removed: --dump, --trace, --profile-json, --profile-output, --profile-events, --profile-iterations, and the profiling build.

Embedding API

  • Runtime::new(), Runtime::with_options(RuntimeOptions) and Runtime::with_host(impl Host, RuntimeOptions). RuntimeOptions carries the heap cap, the collection threshold and growth, the register stack limit and the native stack budget.
  • One realm per runtime: Runtime::context() returns it, and Context::new returns the same realm.
  • One Host trait for the host's output, clock, time zone, random seed, file reads and promise-rejection events. SystemHost (native) and WebHost (browser) implement it.
  • Host callbacks receive a Scope for the runtime; calling the API from a callback without it returns RuntimeError::Reentered. A Value owns a handle that is released on drop.
  • RuntimeError is Exception (the context's pending exception), Reentered, Unsupported, Compile, OutOfMemory, Invariant and Internal.
  • Runtime::memory_report() returns a MemoryReport.
  • The profiling API and its JSONL records are removed.

Rust 1.99 or newer is required.

Install qjs

Prebuilt binaries for Linux (static musl), macOS and Windows are attached below.

# Prebuilt binary through cargo-binstall
cargo binstall --git https://github.com/pocket-nexus/quickjs-oxide quickjs-oxide-cli
# Build from source (Rust 1.99 or newer)
cargo install --locked --git https://github.com/pocket-nexus/quickjs-oxide --tag v0.3.0 quickjs-oxide-cli

WebAssembly

SHA256SUMS lists the digest of every attached file.

What's Changed

  • Release the receiver a bound call replaces by @Eric-Song-Nop in #123
  • Run the QuickJS oracle cases from JS fixtures by @Eric-Song-Nop in #125
  • Remove 35k lines of engine code by @Eric-Song-Nop in #124
  • The register VM, heap, collector, embedding API and tooling of this release, landed as one commit per pull request: #134 to #152

Full Changelog: v0.2.1...v0.3.0

quickjs-oxide v0.2.1

Choose a tag to compare

@github-actions github-actions released this 15 Oct 09:08

Install qjs

Prebuilt binaries for Linux (static musl), macOS and Windows are attached below.

# Prebuilt binary through cargo-binstall
cargo binstall --git https://github.com/pocket-nexus/quickjs-oxide quickjs-oxide-cli
# Build from source (Rust 1.99 or newer)
cargo install --locked --git https://github.com/pocket-nexus/quickjs-oxide --tag v0.2.1 quickjs-oxide-cli

WebAssembly

SHA256SUMS lists the digest of every attached file.

What's Changed

Full Changelog: v0.2.0...v0.2.1

quickjs-oxide v0.2.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 12:48

Install qjs

Prebuilt binaries for Linux (static musl), macOS and Windows are attached below.

# Prebuilt binary through cargo-binstall
cargo binstall --git https://github.com/pocket-nexus/quickjs-oxide quickjs-oxide-cli
# Build from source (Rust 1.99 or newer)
cargo install --locked --git https://github.com/pocket-nexus/quickjs-oxide --tag v0.2.0 quickjs-oxide-cli

WebAssembly

SHA256SUMS lists the digest of every attached file.

What's Changed

  • Require Rust 1.99; faster BigInt comparison; deduplicate engine and test code by @Eric-Song-Nop in #117

Full Changelog: v0.1.1...v0.2.0

quickjs-oxide v0.1.1

Choose a tag to compare

@github-actions github-actions released this 11 Oct 08:44

Install qjs

Prebuilt binaries for Linux (static musl), macOS and Windows are attached below.

# Prebuilt binary through cargo-binstall
cargo binstall --git https://github.com/pocket-nexus/quickjs-oxide quickjs-oxide-cli
# Build from source (Rust 1.95 or newer)
cargo install --locked --git https://github.com/pocket-nexus/quickjs-oxide --tag v0.1.1 quickjs-oxide-cli

WebAssembly

SHA256SUMS lists the digest of every attached file.

What's Changed

  • fix(regexp): take the standard split path while exec is still lazy by @Eric-Song-Nop in #113
  • perf(compiler): port the parser speedups and bound deep nesting with a catchable error by @Eric-Song-Nop in #112
  • fix(object): reject namespace writes only when the namespace is the target by @Eric-Song-Nop in #114
  • fix(json): raise JSON nesting budgets to QuickJS's top-level depths by @Eric-Song-Nop in #115

Full Changelog: v0.1.0...v0.1.1

quickjs-oxide v0.1.0

Choose a tag to compare

@github-actions github-actions released this 11 Oct 05:40

Install qjs

Prebuilt binaries for Linux (static musl), macOS and Windows are attached below.

# Prebuilt binary through cargo-binstall
cargo binstall --git https://github.com/pocket-nexus/quickjs-oxide quickjs-oxide-cli
# Build from source (Rust 1.95 or newer)
cargo install --locked --git https://github.com/pocket-nexus/quickjs-oxide --tag v0.1.0 quickjs-oxide-cli

WebAssembly

SHA256SUMS lists the digest of every attached file.

What's Changed

Full Changelog: v0.1.0-rc.1...v0.1.0

quickjs-oxide v0.1.0-rc.1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 11 Oct 04:59

Install qjs

Prebuilt binaries for Linux (static musl), macOS and Windows are attached below.

# Prebuilt binary through cargo-binstall
cargo binstall --git https://github.com/pocket-nexus/quickjs-oxide quickjs-oxide-cli
# Build from source (Rust 1.95 or newer)
cargo install --locked --git https://github.com/pocket-nexus/quickjs-oxide --tag v0.1.0-rc.1 quickjs-oxide-cli

WebAssembly

SHA256SUMS lists the digest of every attached file.

What's Changed

  • perf(vm): adopt the owned execution core foundation (workspace, profiling, early fast paths) by @Eric-Song-Nop in #12
  • perf(vm): bypass runtime coercion for primitive operands by @Eric-Song-Nop in #13
  • perf: skip idle release and cleanup work by @Eric-Song-Nop in #14
  • perf: batch lazy builtin initialization by @Eric-Song-Nop in #15
  • perf: index core data structures and reclaim dynamic storage by @Eric-Song-Nop in #17
  • perf(vm): reuse publication guarantees in execution by @Eric-Song-Nop in #18
  • perf(object): share ordinary property access and slot transactions by @Eric-Song-Nop in #19
  • perf(vm): primitive execution core rewrite with S21/S22 performance closure by @Eric-Song-Nop in #21
  • feat(host): report unhandled promise rejections like pinned qjs by @lfkdsk in #24
  • fix(lexer): align string-escape, unterminated-string and numeric-literal diagnostics with pinned QuickJS by @lfkdsk in #25
  • perf: QuickJS constant-factor plan — S0–S2 fast paths + S3 baseline (E) + T1 ownership-transaction fixes by @Eric-Song-Nop in #27
  • perf: stage D data-oriented heap (D1–D4) + A4 decision by @Eric-Song-Nop in #34
  • perf(vm): stage B guarded specialization spans (B2.1a–c) by @Eric-Song-Nop in #37
  • perf(compiler): lexer/parser front-end refactor P0–P1 — probes, Token Copy, lazy decode, NameId interning by @Eric-Song-Nop in #33
  • perf(compiler): lexer/parser front-end P2–P3 — lookahead reuse and lexer byte fast paths (stacked on #33) by @Eric-Song-Nop in #36
  • perf(compiler): P4 verify/publication simplification — remove BC5 read path & verify pass, single-pass publish (stacked on #36) by @Eric-Song-Nop in #40
  • refactor(test262): make the gate stateless by @Eric-Song-Nop in #48
  • docs(perf): reset roadmap from issues 41-44 and retire superseded plans by @Eric-Song-Nop in #49
  • perf: integrate compact errors and dense numeric array spans by @Eric-Song-Nop in #50
  • refactor: replace VM execution architecture by @Eric-Song-Nop in #52
  • perf(runtime): numeric regions, continuation, and compact heap storage by @Eric-Song-Nop in #53
  • perf(vm): ownership-aware ordinary stores by @Eric-Song-Nop in #67
  • perf(vm): share named property selection by @Eric-Song-Nop in #68
  • perf(vm): complete admitted reads in frame scope by @Eric-Song-Nop in #69
  • perf(engine): streamline string builtins, array writes, and native ownership by @Eric-Song-Nop in #70
  • perf(vm): complete common operations locally across V8 workloads by @Eric-Song-Nop in #72
  • perf(object): reduce cooldown selection and edge traversal costs by @Eric-Song-Nop in #73
  • fix: implement ECMAScript WeakRef execution-turn liveness by @Eric-Song-Nop in #74
  • perf: transfer ordinary call ownership and complete synchronous leaves by @Eric-Song-Nop in #75
  • perf: retain bounded construction shape prefixes by @Eric-Song-Nop in #76
  • perf: add four-entry property PIC and adaptive cooldown by @Eric-Song-Nop in #77
  • perf: keep heap payloads resident through finalization by @Eric-Song-Nop in #78
  • test: align host GC checks with execution-turn lifetimes by @Eric-Song-Nop in #79
  • perf: complete admitted nullish comparisons in the interpreter by @Eric-Song-Nop in #80
  • perf: borrow admitted field receivers and scalarize fallback operands by @Eric-Song-Nop in #81
  • perf: carry continuation and layout facts into ordinary calls by @Eric-Song-Nop in #82
  • feat: track cycle GC with one net allocation budget by @Eric-Song-Nop in #83
  • feat: service automatic cycle GC in the driver and share edge traversal by @Eric-Song-Nop in #84
  • chore: remove performance artifacts and obsolete experiments by @Eric-Song-Nop in #85
  • Refactor runtime execution ownership: stage A vertical slice by @Eric-Song-Nop in #87
  • perf: recover synchronous runtime stores from accepted stage A by @Eric-Song-Nop in #89
  • runtime: preserve correctness assets and freeze B0 consumer gates by @Eric-Song-Nop in #90
  • perf: execute synchronous Array natives with direct state ownership (B1) by @Eric-Song-Nop in #91
  • docs(readme): links under the organization's current name by @doodlewind in #100
  • Release 0.1.0 stack: runtime performance, QuickJS-matching diagnostics, Test262 admissions, Rust 1.95, releases and docs by @Eric-Song-Nop in #109

New Contributors

Full Changelog: test262-history-r3fa...v0.1.0-rc.1

Test262 milestone history (R3fa)

Pre-release

Choose a tag to compare

@doodlewind doodlewind released this 15 Aug 21:03

Archived the authenticated R3fa Test262 profile and data inputs, exact diagnostic contracts, focused and full result vectors, baseline spec, and status documents.

Test262 milestone history (R3ez)

Pre-release

Choose a tag to compare

@doodlewind doodlewind released this 15 Aug 19:09

Archived the authenticated R3ez Test262 profile and data inputs, exact diagnostic contracts, focused and full result vectors, baseline spec, and status documents.