From 473ad86d9e45cdf7542c5c8ee14da639e53a8fa5 Mon Sep 17 00:00:00 2001 From: TudbuT Date: Thu, 20 Feb 2025 00:52:25 +0100 Subject: [PATCH] fix a scoping issue --- src/oxidizer/mod.rs | 6 +++++- src/runtime.rs | 20 +++++++++++--------- src/std_fns.rs | 8 ++++---- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/oxidizer/mod.rs b/src/oxidizer/mod.rs index e886a3f..9852466 100644 --- a/src/oxidizer/mod.rs +++ b/src/oxidizer/mod.rs @@ -138,7 +138,11 @@ impl RustAppBuilder { .arg(format!("spl@{}", env!("CARGO_PKG_VERSION"))) .current_dir(format!("{tmp}/spl-{name}")) .stdout(Stdio::null()) - .stderr(if output { Stdio::inherit() } else { Stdio::null() }) + .stderr(if output { + Stdio::inherit() + } else { + Stdio::null() + }) .spawn() .unwrap() .wait()?; diff --git a/src/runtime.rs b/src/runtime.rs index d9722c9..f2e8f07 100644 --- a/src/runtime.rs +++ b/src/runtime.rs @@ -266,7 +266,7 @@ pub struct FrameInfo { #[derive(Clone, Debug)] pub struct Frame { parent: Option>, - pub variables: Mut>, + pub variables: Mut>>>, pub functions: Mut>, pub origin: FrameInfo, pub redirect_to_base: bool, @@ -364,8 +364,8 @@ impl Frame { pub fn set_var(&self, name: String, obj: AMObject, stack: &Stack) -> OError { let mut frame = self; loop { - if let Some(x) = frame.variables.lock().get_mut(&name) { - *x = obj; + if let Some(x) = frame.variables.lock_ro().get(&name) { + *(x.lock()) = obj; return Ok(()); } if let Some(ref x) = frame.parent { @@ -380,7 +380,7 @@ impl Frame { let mut frame = self; loop { if let Some(x) = frame.variables.lock_ro().get(&name) { - return Ok(x.clone()); + return Ok(x.lock_ro().clone()); } if let Some(ref x) = frame.parent { frame = x; @@ -555,14 +555,15 @@ impl Stack { if frame.redirect_to_base { frame = self.frames.first().unwrap().clone(); } - let tmpname = name.clone(); + let variable = Arc::new(Mut::new(Value::Null.spl())); + let var = variable.clone(); frame.functions.lock().insert( name.clone(), Arc::new(Func { ret_count: 1, origin: Arc::new(Frame::dummy()), to_call: FuncImpl::NativeDyn(Arc::new(Box::new(move |stack| { - stack.push(stack.get_var(tmpname.clone())?); + stack.push(var.lock_ro().clone()); Ok(()) }))), run_as_base: false, @@ -570,7 +571,7 @@ impl Stack { name: name.clone(), }), ); - let tmpname = name.clone(); + let var = variable.clone(); frame.functions.lock().insert( "=".to_owned() + &name, Arc::new(Func { @@ -578,14 +579,15 @@ impl Stack { origin: Arc::new(Frame::dummy()), to_call: FuncImpl::NativeDyn(Arc::new(Box::new(move |stack| { let v = stack.pop(); - stack.set_var(tmpname.clone(), v) + *(var.lock()) = v; + Ok(()) }))), run_as_base: false, fname: Some("RUNTIME".to_owned()), name: "=".to_owned() + &name, }), ); - frame.variables.lock().insert(name, Value::Null.spl()); + frame.variables.lock().insert(name, variable); } pub fn pop_until(&mut self, obj: AMObject) -> Vec { diff --git a/src/std_fns.rs b/src/std_fns.rs index 2c5909b..9ba58ec 100644 --- a/src/std_fns.rs +++ b/src/std_fns.rs @@ -1,5 +1,5 @@ use std::{ - collections::{HashMap, LinkedList, VecDeque}, + collections::{HashMap, VecDeque}, env::{self, args, vars}, fs, io::{stdin, stdout, Write}, @@ -10,7 +10,7 @@ use std::{ time::{Duration, SystemTime}, }; -use readformat::{readf, readf1}; +use readformat::readf; use crate::{dyn_fns, mutex::Mut, runtime::*, sasm::sasm_write, *}; @@ -1014,7 +1014,7 @@ pub fn time(stack: &mut Stack) -> OError { Ok(()) } -pub fn thread_yield(stack: &mut Stack) -> OError { +pub fn thread_yield(_stack: &mut Stack) -> OError { thread::yield_now(); Ok(()) } @@ -1182,7 +1182,7 @@ pub fn chdir(stack: &mut Stack) -> OError { Ok(()) } -pub fn json_parse(stack: &mut Stack) -> OError { +pub fn json_parse(_stack: &mut Stack) -> OError { /* require_on_stack!(input, Str, stack, "json_parse"); let objstr = readf1("{{}}", &input);