fix: 修复 CLI 产生多 kernel 问题

This commit is contained in:
爱特每羊队
2026-06-06 00:26:04 +08:00
parent c8b6e0c672
commit 609c838cdb
+22 -10
View File
@@ -51,8 +51,16 @@ fn main() -> ExitCode {
let cli = Cli::parse(); let cli = Cli::parse();
match cli.command { match cli.command {
Some(Commands::Eval { code }) => eval(&code), Some(Commands::Eval { code }) => {
Some(Commands::Run { file }) => run(&file), let kernel = make_kernel();
let pool = make_pool(&kernel);
eval(&code, &kernel, &pool)
}
Some(Commands::Run { file }) => {
let kernel = make_kernel();
let pool = make_pool(&kernel);
run(&file, &kernel, &pool)
}
Some(Commands::Compile { expr, file }) => compile(expr, file), Some(Commands::Compile { expr, file }) => compile(expr, file),
Some(Commands::Bench { .. }) => not_implemented("bench"), Some(Commands::Bench { .. }) => not_implemented("bench"),
Some(Commands::Test { .. }) => not_implemented("test"), Some(Commands::Test { .. }) => not_implemented("test"),
@@ -64,14 +72,15 @@ fn make_kernel() -> Arc<OxideKernel> {
Arc::new(OxideKernel::new(KernelConfig::standard())) Arc::new(OxideKernel::new(KernelConfig::standard()))
} }
fn eval(code: &str) -> ExitCode { fn make_pool(kernel: &Arc<OxideKernel>) -> Arc<VmPool> {
let kernel = make_kernel(); VmPool::new(
let pool = VmPool::new( Arc::clone(kernel),
Arc::clone(&kernel),
kernel.config().min_pool_size, kernel.config().min_pool_size,
kernel.config().max_pool_size, kernel.config().max_pool_size,
); )
}
fn eval(code: &str, kernel: &Arc<OxideKernel>, pool: &Arc<VmPool>) -> ExitCode {
let allocator = Allocator::default(); let allocator = Allocator::default();
let program = match oxide_parser::parse(&allocator, code) { let program = match oxide_parser::parse(&allocator, code) {
Ok(p) => p, Ok(p) => p,
@@ -149,9 +158,9 @@ fn print_value(string_forge: &StringForge, val: JsValue) {
} }
} }
fn run(file: &str) -> ExitCode { fn run(file: &str, kernel: &Arc<OxideKernel>, pool: &Arc<VmPool>) -> ExitCode {
match fs::read_to_string(file) { match fs::read_to_string(file) {
Ok(source) => eval(&source), Ok(source) => eval(&source, kernel, pool),
Err(err) => { Err(err) => {
eprintln!("{}", Red.paint(format!("Cannot read {file}: {err}"))); eprintln!("{}", Red.paint(format!("Cannot read {file}: {err}")));
ExitCode::FAILURE ExitCode::FAILURE
@@ -214,6 +223,9 @@ fn repl() -> ExitCode {
} }
}; };
let kernel = make_kernel();
let pool = make_pool(&kernel);
loop { loop {
match rl.readline("oxide> ") { match rl.readline("oxide> ") {
Ok(line) => { Ok(line) => {
@@ -226,7 +238,7 @@ fn repl() -> ExitCode {
return ExitCode::SUCCESS; return ExitCode::SUCCESS;
} }
rl.add_history_entry(trimmed).ok(); rl.add_history_entry(trimmed).ok();
eval(trimmed); eval(trimmed, &kernel, &pool);
} }
Err(ReadlineError::Interrupted) => { Err(ReadlineError::Interrupted) => {
println!("^C"); println!("^C");