diff --git a/Cargo.lock b/Cargo.lock index ec73ce59..81a6ad33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -786,7 +786,7 @@ dependencies = [ "hashbrown 0.14.5", "oxide_compiler", "oxide_parser", - "oxide_vm", + "oxide_types", "rustc-hash", ] @@ -803,14 +803,24 @@ dependencies = [ ] [[package]] -name = "oxide_vm" +name = "oxide_types" version = "0.1.0" dependencies = [ "bumpalo", - "fast-float", "hashbrown 0.14.5", + "proptest", + "rustc-hash", +] + +[[package]] +name = "oxide_vm" +version = "0.1.0" +dependencies = [ + "fast-float", "oxide_compiler", + "oxide_kernel", "oxide_parser", + "oxide_types", "proptest", "rustc-hash", "ryu", diff --git a/Cargo.toml b/Cargo.toml index 1ed332ea..71bf293e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ resolver = "2" members = [ "crates/oxide_parser", "crates/oxide_compiler", + "crates/oxide_types", "crates/oxide_vm", "crates/oxide_kernel", "crates/oxide_api", diff --git a/crates/oxide_cli/src/main.rs b/crates/oxide_cli/src/main.rs index cc09dd95..9aedbb78 100644 --- a/crates/oxide_cli/src/main.rs +++ b/crates/oxide_cli/src/main.rs @@ -5,8 +5,8 @@ use ansi_term::Colour::Red; use clap::{Parser, Subcommand}; use oxide_compiler::compiler::Compiler; use oxide_parser::Allocator; -use oxide_vm::value::JsValue; use oxide_vm::vm::Vm; +use oxide_vm::JsValue; #[derive(Parser)] #[command(name = "oxide", version, about = "OxideJS - Rust JavaScript engine")] diff --git a/crates/oxide_kernel/Cargo.toml b/crates/oxide_kernel/Cargo.toml index 7f8f30df..b04baf31 100644 --- a/crates/oxide_kernel/Cargo.toml +++ b/crates/oxide_kernel/Cargo.toml @@ -4,12 +4,12 @@ version.workspace = true edition.workspace = true license.workspace = true rust-version.workspace = true -description = "OxideJS - Shared kernel (CodeForge, ShapeForge, IcForge, StringForge, BuiltinWorld)" +description = "OxideJS - Shared kernel (CodeForge, ShapeForge, PropForge, StringForge, BuiltinWorld)" [dependencies] oxide_compiler = { path = "../oxide_compiler" } oxide_parser = { path = "../oxide_parser" } -oxide_vm = { path = "../oxide_vm" } +oxide_types = { path = "../oxide_types" } bumpalo.workspace = true dashmap.workspace = true hashbrown.workspace = true diff --git a/crates/oxide_kernel/src/builtin.rs b/crates/oxide_kernel/src/builtin.rs index 4943b820..fe00c7e6 100644 --- a/crates/oxide_kernel/src/builtin.rs +++ b/crates/oxide_kernel/src/builtin.rs @@ -1,6 +1,6 @@ -use oxide_vm::mem::P; -use oxide_vm::object::JsObject; -use oxide_vm::value::JsValue; +use oxide_types::mem::P; +use oxide_types::object::JsObject; +use oxide_types::value::JsValue; use crate::shape_forge::{ShapeForge, EMPTY_SHAPE_ID}; use crate::string_forge::Interner; diff --git a/crates/oxide_kernel/src/kernel.rs b/crates/oxide_kernel/src/kernel.rs index fb237ad3..faa021aa 100644 --- a/crates/oxide_kernel/src/kernel.rs +++ b/crates/oxide_kernel/src/kernel.rs @@ -1,13 +1,12 @@ #![allow(clippy::arc_with_non_send_sync)] -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use crate::builtin::BuiltinWorld; use crate::code_forge::CodeForge; use crate::prop_forge::PropForge; use crate::shape_forge::ShapeForge; use crate::string_forge::Interner; -use crate::vm_pool::{VmGuard, VmPool}; pub struct KernelConfig { pub min_pool_size: usize, @@ -66,8 +65,6 @@ pub struct OxideKernel { pub code_forge: Arc, pub prop_forge: Arc, pub builtin_world: Arc, - #[allow(dead_code)] - vm_pool: Mutex>>, } impl OxideKernel { @@ -85,28 +82,9 @@ impl OxideKernel { code_forge, prop_forge, builtin_world, - vm_pool: Mutex::new(None), } } - pub fn init_vm_pool(self: &Arc) { - let pool = VmPool::new( - Arc::clone(self), - self.config.min_pool_size, - self.config.max_pool_size, - ); - *self.vm_pool.lock().unwrap() = Some(pool); - } - - pub fn spawn(&self) -> VmGuard { - self.vm_pool - .lock() - .unwrap() - .as_ref() - .expect("vm_pool not initialized — call init_vm_pool() first") - .spawn() - } - pub fn string_forge(&self) -> &Arc { &self.string_forge } @@ -173,14 +151,4 @@ mod tests { assert!(KernelConfig::full().warmup_builtin_ic); assert_eq!(KernelConfig::full().max_pool_size, None); } - - #[test] - fn test_kernel_spawn() { - let kernel = Arc::new(OxideKernel::new(KernelConfig::minimal())); - kernel.init_vm_pool(); - let guard = kernel.spawn(); - drop(guard); - let guard2 = kernel.spawn(); - drop(guard2); - } } diff --git a/crates/oxide_kernel/src/lib.rs b/crates/oxide_kernel/src/lib.rs index 9624635c..2804b468 100644 --- a/crates/oxide_kernel/src/lib.rs +++ b/crates/oxide_kernel/src/lib.rs @@ -6,4 +6,3 @@ pub mod kernel; pub mod prop_forge; pub mod shape_forge; pub mod string_forge; -pub mod vm_pool; diff --git a/crates/oxide_types/Cargo.toml b/crates/oxide_types/Cargo.toml new file mode 100644 index 00000000..15008e82 --- /dev/null +++ b/crates/oxide_types/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "oxide_types" +version.workspace = true +edition.workspace = true +license.workspace = true +rust-version.workspace = true +description = "OxideJS - Shared core types (JsValue, JsObject, Shape, P, Epoch)" + +[dependencies] +bumpalo.workspace = true +hashbrown.workspace = true +rustc-hash.workspace = true + +[dev-dependencies] +proptest.workspace = true diff --git a/crates/oxide_types/src/lib.rs b/crates/oxide_types/src/lib.rs new file mode 100644 index 00000000..65526cca --- /dev/null +++ b/crates/oxide_types/src/lib.rs @@ -0,0 +1,6 @@ +#![doc = "OxideJS - Shared core types (JsValue, JsObject, Shape, P, Epoch)"] + +pub mod mem; +pub mod object; +pub mod shape; +pub mod value; diff --git a/crates/oxide_vm/src/mem.rs b/crates/oxide_types/src/mem.rs similarity index 100% rename from crates/oxide_vm/src/mem.rs rename to crates/oxide_types/src/mem.rs diff --git a/crates/oxide_vm/src/object.rs b/crates/oxide_types/src/object.rs similarity index 100% rename from crates/oxide_vm/src/object.rs rename to crates/oxide_types/src/object.rs diff --git a/crates/oxide_vm/src/shape.rs b/crates/oxide_types/src/shape.rs similarity index 100% rename from crates/oxide_vm/src/shape.rs rename to crates/oxide_types/src/shape.rs diff --git a/crates/oxide_vm/src/value.rs b/crates/oxide_types/src/value.rs similarity index 100% rename from crates/oxide_vm/src/value.rs rename to crates/oxide_types/src/value.rs diff --git a/crates/oxide_vm/Cargo.toml b/crates/oxide_vm/Cargo.toml index f9c65002..e29058ad 100644 --- a/crates/oxide_vm/Cargo.toml +++ b/crates/oxide_vm/Cargo.toml @@ -8,8 +8,8 @@ description = "OxideJS - Register-based VM with epoch arena memory" [dependencies] oxide_compiler = { path = "../oxide_compiler" } -bumpalo.workspace = true -hashbrown.workspace = true +oxide_kernel = { path = "../oxide_kernel" } +oxide_types = { path = "../oxide_types" } rustc-hash.workspace = true fast-float.workspace = true ryu.workspace = true diff --git a/crates/oxide_vm/src/coercion.rs b/crates/oxide_vm/src/coercion.rs index bf05ae6f..f03200f3 100644 --- a/crates/oxide_vm/src/coercion.rs +++ b/crates/oxide_vm/src/coercion.rs @@ -1,7 +1,7 @@ -use crate::object::JsObject; -use crate::shape::EMPTY_SHAPE_ID; -use crate::value::JsValue; use crate::vm::Vm; +use oxide_types::object::JsObject; +use oxide_types::shape::EMPTY_SHAPE_ID; +use oxide_types::value::JsValue; pub fn to_primitive(val: JsValue) -> JsValue { if val.is_object() { diff --git a/crates/oxide_vm/src/lib.rs b/crates/oxide_vm/src/lib.rs index ef390cf4..eb3bbc7e 100644 --- a/crates/oxide_vm/src/lib.rs +++ b/crates/oxide_vm/src/lib.rs @@ -1,9 +1,6 @@ #![doc = "OxideJS - Register-based VM with epoch arena memory"] pub mod coercion; -pub mod mem; -pub mod object; -pub mod shape; -pub mod value; pub mod vm; -pub use value::JsValue; +pub mod vm_pool; +pub use oxide_types::value::JsValue; diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index 012d8618..8aa14a71 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -5,10 +5,10 @@ use oxide_compiler::module::CompiledModule; use oxide_compiler::opcode::{self, OpCode}; use crate::coercion; -use crate::mem::{Epoch, P}; -use crate::object::JsObject; -use crate::shape::{self, EMPTY_SHAPE_ID}; -use crate::value::JsValue; +use oxide_types::mem::{Epoch, P}; +use oxide_types::object::JsObject; +use oxide_types::shape::{self, EMPTY_SHAPE_ID}; +use oxide_types::value::JsValue; pub struct CallFrame { pub return_addr: usize, diff --git a/crates/oxide_kernel/src/vm_pool.rs b/crates/oxide_vm/src/vm_pool.rs similarity index 93% rename from crates/oxide_kernel/src/vm_pool.rs rename to crates/oxide_vm/src/vm_pool.rs index 337715e5..bebd851d 100644 --- a/crates/oxide_kernel/src/vm_pool.rs +++ b/crates/oxide_vm/src/vm_pool.rs @@ -2,10 +2,9 @@ use std::sync::{Arc, Condvar, Mutex}; -use oxide_vm::mem::P; -use oxide_vm::vm::Vm; - -use crate::kernel::OxideKernel; +use crate::vm::Vm; +use oxide_kernel::kernel::OxideKernel; +use oxide_types::mem::P; struct VmPoolInner { available: Vec, @@ -29,7 +28,11 @@ pub struct VmGuard { } impl VmPool { - pub fn new(kernel: Arc, min_size: usize, max_size: Option) -> Arc { + pub fn new( + kernel: Arc, + #[allow(dead_code)] min_size: usize, + max_size: Option, + ) -> Arc { let pool = Arc::new(Self { kernel, inner: Mutex::new(VmPoolInner { @@ -140,7 +143,7 @@ impl Drop for VmGuard { #[cfg(test)] mod tests { use super::*; - use crate::kernel::KernelConfig; + use oxide_kernel::kernel::KernelConfig; fn test_kernel() -> Arc { Arc::new(OxideKernel::new(KernelConfig::minimal())) diff --git a/crates/oxide_vm/tests/mem_tests.rs b/crates/oxide_vm/tests/mem_tests.rs index 1ea1df61..964903b7 100644 --- a/crates/oxide_vm/tests/mem_tests.rs +++ b/crates/oxide_vm/tests/mem_tests.rs @@ -1,6 +1,6 @@ use std::time::Instant; -use oxide_vm::mem::{Epoch, PersistentHeap}; +use oxide_types::mem::{Epoch, PersistentHeap}; #[test] fn epoch_alloc_and_read() { diff --git a/crates/oxide_vm/tests/vm_tests.rs b/crates/oxide_vm/tests/vm_tests.rs index fcefd1ce..4c52c4e6 100644 --- a/crates/oxide_vm/tests/vm_tests.rs +++ b/crates/oxide_vm/tests/vm_tests.rs @@ -1,6 +1,6 @@ use oxide_compiler::compiler::Compiler; use oxide_parser::Allocator; -use oxide_vm::value::JsValue; +use oxide_types::value::JsValue; use oxide_vm::vm::Vm; fn eval(source: &str) -> String {