From f890371916ad054f37b176f2655d82d2c96bff0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=E7=89=B9=E6=AF=8F=E7=BE=8A=E9=98=9F?= Date: Fri, 5 Jun 2026 23:57:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=B0=86=20kernel=20=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=20CLI=20=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 1 + crates/oxide_cli/Cargo.toml | 1 + crates/oxide_cli/src/main.rs | 36 ++++++++++++++++++++++++++---------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 24c879e..8b7852e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -762,6 +762,7 @@ dependencies = [ "clap", "oxide_api", "oxide_compiler", + "oxide_kernel", "oxide_parser", "oxide_vm", "rustyline", diff --git a/crates/oxide_cli/Cargo.toml b/crates/oxide_cli/Cargo.toml index 75983bc..59892fa 100644 --- a/crates/oxide_cli/Cargo.toml +++ b/crates/oxide_cli/Cargo.toml @@ -14,6 +14,7 @@ path = "src/main.rs" oxide_parser = { path = "../oxide_parser" } oxide_compiler = { path = "../oxide_compiler" } oxide_vm = { path = "../oxide_vm" } +oxide_kernel = { path = "../oxide_kernel" } oxide_api = { path = "../oxide_api" } clap.workspace = true rustyline.workspace = true diff --git a/crates/oxide_cli/src/main.rs b/crates/oxide_cli/src/main.rs index 9aedbb7..e629a6b 100644 --- a/crates/oxide_cli/src/main.rs +++ b/crates/oxide_cli/src/main.rs @@ -1,11 +1,16 @@ +#![allow(clippy::arc_with_non_send_sync)] + use std::fs; use std::process::ExitCode; +use std::sync::Arc; use ansi_term::Colour::Red; use clap::{Parser, Subcommand}; use oxide_compiler::compiler::Compiler; +use oxide_kernel::kernel::{KernelConfig, OxideKernel}; +use oxide_kernel::string_forge::StringForge; use oxide_parser::Allocator; -use oxide_vm::vm::Vm; +use oxide_vm::vm_pool::VmPool; use oxide_vm::JsValue; #[derive(Parser)] @@ -55,7 +60,18 @@ fn main() -> ExitCode { } } +fn make_kernel() -> Arc { + Arc::new(OxideKernel::new(KernelConfig::standard())) +} + fn eval(code: &str) -> ExitCode { + let kernel = make_kernel(); + let pool = VmPool::new( + Arc::clone(&kernel), + kernel.config().min_pool_size, + kernel.config().max_pool_size, + ); + let allocator = Allocator::default(); let program = match oxide_parser::parse(&allocator, code) { Ok(p) => p, @@ -68,7 +84,7 @@ fn eval(code: &str) -> ExitCode { }; let compiler = Compiler::new(); - let module = match compiler.compile(&program) { + let module = match kernel.code_forge().get_or_compile(&program, &compiler) { Ok(m) => m, Err(err) => { eprintln!("{}", Red.paint(err)); @@ -76,10 +92,10 @@ fn eval(code: &str) -> ExitCode { } }; - let mut vm = Vm::new(); - match vm.run(&module) { + let mut guard = pool.spawn(); + match guard.vm_mut().run(&module) { Ok(result) => { - format_result(&vm, result); + format_result(kernel.string_forge().as_ref(), result); ExitCode::SUCCESS } Err(err) => { @@ -89,9 +105,9 @@ fn eval(code: &str) -> ExitCode { } } -fn format_result(vm: &Vm, val: JsValue) { +fn format_result(string_forge: &StringForge, val: JsValue) { if val.is_string() { - if let Some(s) = vm.lookup_str(val) { + if let Some(s) = string_forge.lookup(val.as_string_index()) { println!("\"{s}\""); } else { println!("{val}"); @@ -111,7 +127,7 @@ fn format_result(vm: &Vm, val: JsValue) { } first = false; print!("{:?}: ", i); - print_value(vm, prop_val); + print_value(string_forge, prop_val); } println!("}}"); } else if val.is_undefined() { @@ -121,9 +137,9 @@ fn format_result(vm: &Vm, val: JsValue) { } } -fn print_value(vm: &Vm, val: JsValue) { +fn print_value(string_forge: &StringForge, val: JsValue) { if val.is_string() { - if let Some(s) = vm.lookup_str(val) { + if let Some(s) = string_forge.lookup(val.as_string_index()) { print!("\"{s}\""); } else { print!("{val}");