fix: 修复 CLI 产生多 kernel 问题
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user