v2026.6.2
Objeck Language v2026.6.2
Major JIT and garbage-collection performance work — a near-free GC safepoint poll, auto-JIT for closure/function-reference calls, and inline nursery allocation — together with a sweep of JIT codegen correctness fixes and locale-independent UTF-8 I/O.
✨ What's New
Performance
- GC safepoint poll made nearly free in JIT'd loops — an inline flag test that calls the collector only when a collection is active, reading
&stw_activefrom a register cached at the prologue (R12 on AMD64, X19 on ARM64) and emitted only at loop back-edges.fannkuchreduxroughly halved (~59s → ~31s), recovering the full v2026.6.1 regression on both AMD64 and ARM64. - Auto-JIT for closure / function-reference calls (
DYN_MTHD_CALL) on AMD64 and ARM64 —spectralnormreachesnative-level speed once warm (43s interpreted → 0.46s at n=2000). - Inline young-generation bump allocation for
NEW_OBJ_INST(AMD64); an interpreter float fast-path; and ARM64 JIT whitelist parity with AMD64.
Bug Fixes
- JIT float-codegen & tail-call correctness (surfaced by forcing JIT with
OBJECK_JIT_THRESHOLD=1): AMD64Floor/Ceil/ArcTanand two latentDYN_MTHD_CALLmiscompiles; ARM64 transcendental/round cached-local operands, a dropped libc float result/argument, working-stack registers clobbered across inlined float calls, and animm19backpatch SIGILL; and a TCO deferred-load corruption (return Gcd(b, a%b)) on both architectures. - ARM64 closure SIGSEGV — invoking a JIT-compiled closure captured in a collection (
Vector<FuncRef>) crashed because the ARM64 backend's memory encoders couldn't represent a negative displacement and read the wrong stack slot; all ARM64 load/stores now route through a signed-offsetLDUR/STURhelper (x64 was never affected). The full ARM64 suite is green atOBJECK_JIT_THRESHOLD=1. - UTF-8 in any locale —
obcreading UTF-8 source andobrloading/printing UTF-8 strings no longer break under aC/non-UTF-8 process locale. - VM shutdown thread race — worker threads are quiesced before program teardown.
Int->MinSize()now returnsINT64_MIN(wasINT64_MAX).
Infrastructure
- Native (non-Docker) cross-language perf gate in CI measures Objeck against Python/Ruby/LuaJIT/Java with committed baseline ratios, so performance regressions are caught automatically.
📦 Installation
Windows
- x64: Download
objeck-windows-x64_2026.6.2.msiand run the installer - ARM64: Download
objeck-windows-arm64_2026.6.2.msiand run the installer - Portable: Download the
.zipfiles for portable installations
Linux
- x64:
tar -xzf objeck-linux-x64_2026.6.2.tgz - ARM64:
tar -xzf objeck-linux-arm64_2026.6.2.tgz
macOS
- ARM64 (M-series) Installer: Download
objeck-macos-arm64_2026.6.2.pkgand run - ARM64 (M-series) Archive:
tar -xzf objeck-macos-arm64_2026.6.2.tgz
LSP (Language Server Protocol)
- Download
objeck-lsp_2026.6.2.zipfor IDE integration
📚 Documentation
- API Documentation: https://objeck.org/api/latest/
- Language Guide: https://github.com/objeck/objeck-lang
🔐 Verification
All Windows MSI installers and the macOS .pkg are digitally signed.
Full Changelog: v2026.6.1...v2026.6.2