This repository has been archived on 2026-09-15 . You can view files and clone it. You cannot open issues or pull requests or push a commit.
e7183940721309d5d338e934cba0941c7ac57d64
覆盖既有 global 槽的写入不递增 generation,脏检测漏判导致保留的 global 持有已释放的 session 对象指针。session 对象非空即强制 bump global generation,借既有快照机制触发重建。
1. 项目简介
OxideJS 是一个基于 Rust 的轻量级 JavaScript 执行引擎,擅长短时、高频、即时执行的脚本运行场景,主要面向 Agent 工具调用、脚本沙箱、数据转换流水线和嵌入式运行时。
当前项目聚焦于实用 ECMAScript 子集,并通过 test262 持续验证兼容性。我们的最终目标是提供一个小型、可检查、跨平台、启动成本可预测、benchmark 可复现的 JavaScript runtime。
演示视频链接: https://pan.baidu.com/s/11gvBV5G_rLrNTS0sb863Qg?pwd=pr7n 提取码: pr7n
2. 特性概览
- Rust 实现:使用 Cargo workspace 组织 parser、compiler、VM、runtime、CLI 和 test runner。
- 自研引擎:自研字节码、寄存器式虚拟机、对象模型和运行时状态管理。
- 寄存器式 VM:使用固定寄存器文件执行字节码,减少栈式 VM 中频繁 push/pop 的开销。
- NaN-boxing 值表示:用 64-bit 值统一表示 number、boolean、object、string、null 和 undefined。
- Shape 对象布局:使用隐藏类思想描述对象属性布局,便于缓存属性偏移。
- Inline Cache 方向:围绕 shape/offset 缓存设计属性访问路径。
- 共享运行时 Kernel:
KernelCore永久共享 key 驻留 / Shape / 编译缓存 / IC 模板,KernelSession按会话管理 BuiltinWorld 与 global object。 - test262 runner:内置兼容性测试运行器,输出 pass / fail / skip 统计。
3. 架构
OxideJS 采用经典的 parse -> compile -> execute 流水线,同时使用 单 Kernel、多 VM 的运行时结构。Kernel 内部分为两层:KernelCore 永久共享 (PermInterner / Shape / Code / Prop),KernelSession 按会话可重建 (BuiltinWorld / global object);多个 oxide_vm 实例面向不同执行请求独立运行。
+-----------------------+
| oxide_kernel |
|-----------------------|
| KernelCore |
| PermInterner | append-only key 驻留
| ShapeForge | Shape / Hidden Class 表
| CodeForge | bytecode LRU 缓存
| PropForge | IC 模板
|-----------------------|
| KernelSession | 可 full_reset() 重建
| BuiltinWorld |
| Global object |
| BuiltinSnapshot |
+----------+------------+
|
shared Arc<KernelCore> | + per-VM KernelSession
+-----------------+-----------------+
| | |
v v v
+----------------+ +----------------+ +----------------+
| oxide_vm | | oxide_vm | | oxide_vm |
|----------------| |----------------| |----------------|
| registers | | registers | | registers |
| call frames | | call frames | | call frames |
| Epoch Arena | | Epoch Arena | | Epoch Arena |
| JsString GC | | JsString GC | | JsString GC |
+-------+--------+ +-------+--------+ +-------+--------+
| | |
v v v
JsValue Result JsValue Result JsValue Result
Per request pipeline:
JavaScript Source
|
v
+------------------+
| oxide_parser | 解析源码,生成 AST
+------------------+
|
v
+------------------+
| oxide_compiler | AST 编译为寄存器式字节码;可命中 KernelCore.CodeForge
+------------------+
|
v
+------------------+
| oxide_vm | 从 VM Pool 获取实例并执行字节码
+------------------+
核心组件:
- Parser 前端:通过
oxide_parser将源码解析为 AST。 - 字节码编译器:将 AST 降低为 OxideJS 字节码、常量池和寄存器布局。
- 寄存器式 VM:
oxide_vm读取字节码并使用固定寄存器文件执行;每个 VM 持有自己的寄存器、调用栈、Epoch Arena 与 JsString GC。 - 值系统:
JsValue通过 NaN-boxing 紧凑表示 JavaScript 运行时值;JsString由 VM 内的标记清扫 GC 管理。 - 对象模型:对象通过 Shape ID 描述属性布局。
- 运行时 Kernel:
KernelCore保存进程级永久共享状态 (PermInterner等),KernelSession保存可重建的会话级状态 (BuiltinWorld/ global object); 多个 VM 通过Arc<KernelCore>引用同一份永久共享数据。 - 内置对象层:常用内置对象和方法由 Rust 原生实现,通过
BuiltinWorld注册。 - 兼容性测试层:
oxide_test262运行 test262 用例并输出统计结果,支持--supervise子进程窗口模式实现单测超时与断点续跑。
4. 仓库结构
project-root/
├── Cargo.toml
├── README.md
├── crates/
│ ├── oxide_parser/ # JavaScript parser 接入层
│ ├── oxide_compiler/ # AST -> bytecode 编译器
│ ├── oxide_types/ # JsValue、JsObject、Shape、内存基础类型
│ ├── oxide_kernel/ # 共享运行时状态和内置对象注册
│ ├── oxide_vm/ # 字节码 VM 和运行时执行逻辑
│ ├── oxide_api/ # 嵌入式 API 预留层
│ ├── oxide_cli/ # 命令行工具
│ └── oxide_test262/ # test262 兼容性测试运行器
└── tests/
└── test262/ # 本地 test262 测试套件
5. 构建
构建全部 crate
cargo build --release
运行单元测试
cargo test
6. CLI 使用
执行源码片段
cargo run --release -p oxide_cli -- eval "1 + 2"
执行文件
cargo run --release -p oxide_cli -- run examples/demo.js
打印编译后的字节码
cargo run --release -p oxide_cli -- compile -e "1 + 2"
启动 REPL
cargo run --release -p oxide_cli
7. test262 兼容性测试
OxideJS 包含独立的 test262 runner:
cargo run --release -p oxide_test262
运行指定子目录:
cargo run --release -p oxide_test262 -- tests/test262/test language/expressions
runner 会输出:
- 发现的测试文件总数;
- pass / fail / skip 数量;
- 全量通过率;
- 实际执行样本通过率;
- 失败类别统计;
- 按目录拆分的结果(取决于 runner 版本)。
兼容性数字属于开发过程指标。发布正式 benchmark 或兼容性结论前,应基于当前 checkout 的 test262 版本重新生成结果。
8. 主要使用的开源项目
- oxc — JavaScript 源码解析,因为这不是我们的工作中心,所以没有自己构建该系统
- bumpalo — Bump allocator,构成
Epocharena 内存系统的底层分配器 - dashmap — 并发 HashMap,用于
CodeForge、ShapeForge、PropForge跨 VM 缓存共享
9. License
本项目采用 MIT License 开源协议。详见 LICENSE。
Languages
Rust
98.9%
Python
0.6%
JavaScript
0.3%
Shell
0.2%