replace Rc with Arc so that Lamm may be used in an async context

This commit is contained in:
2024-10-22 13:26:48 -04:00
parent 0a40cca6ff
commit d9a576897b
3 changed files with 26 additions and 26 deletions

View File

@@ -5,7 +5,7 @@ use std::collections::HashMap;
use std::fmt::Display; use std::fmt::Display;
use std::error::Error; use std::error::Error;
use std::io; use std::io;
use std::rc::Rc; use std::sync::Arc;
use std::cell::RefCell; use std::cell::RefCell;
#[derive(Debug)] #[derive(Debug)]
@@ -51,15 +51,15 @@ where
I: Iterator<Item = Result<ParseTree, ParseError>> I: Iterator<Item = Result<ParseTree, ParseError>>
{ {
exprs: &'a mut I, exprs: &'a mut I,
globals: &'a mut HashMap<String, Rc<RefCell<Object>>>, globals: &'a mut HashMap<String, Arc<RefCell<Object>>>,
locals: HashMap<String, Rc<RefCell<Object>>>, locals: HashMap<String, Arc<RefCell<Object>>>,
} }
impl<'a, I> Executor<'a, I> impl<'a, I> Executor<'a, I>
where where
I: Iterator<Item = Result<ParseTree, ParseError>>, I: Iterator<Item = Result<ParseTree, ParseError>>,
{ {
pub fn new(exprs: &'a mut I, globals: &'a mut HashMap<String, Rc<RefCell<Object>>>) -> Self { pub fn new(exprs: &'a mut I, globals: &'a mut HashMap<String, Arc<RefCell<Object>>>) -> Self {
Self { Self {
exprs, exprs,
globals, globals,
@@ -67,27 +67,27 @@ where
} }
} }
pub fn _add_global(self, k: String, v: Rc<RefCell<Object>>) -> Self { pub fn _add_global(self, k: String, v: Arc<RefCell<Object>>) -> Self {
self.globals.insert(k, v); self.globals.insert(k, v);
self self
} }
pub fn locals(mut self, locals: HashMap<String, Rc<RefCell<Object>>>) -> Self { pub fn locals(mut self, locals: HashMap<String, Arc<RefCell<Object>>>) -> Self {
self.locals = locals; self.locals = locals;
self self
} }
pub fn add_local(mut self, k: String, v: Rc<RefCell<Object>>) -> Self { pub fn add_local(mut self, k: String, v: Arc<RefCell<Object>>) -> Self {
self.locals.insert(k, v); self.locals.insert(k, v);
self self
} }
fn _get_object(&self, ident: &String) -> Result<&Rc<RefCell<Object>>, RuntimeError> { fn _get_object(&self, ident: &String) -> Result<&Arc<RefCell<Object>>, RuntimeError> {
self.locals.get(ident).or(self.globals.get(ident)) self.locals.get(ident).or(self.globals.get(ident))
.ok_or(RuntimeError::VariableUndefined(ident.clone())) .ok_or(RuntimeError::VariableUndefined(ident.clone()))
} }
fn get_object_mut(&mut self, ident: &String) -> Result<&mut Rc<RefCell<Object>>, RuntimeError> { fn get_object_mut(&mut self, ident: &String) -> Result<&mut Arc<RefCell<Object>>, RuntimeError> {
self.locals.get_mut(ident).or(self.globals.get_mut(ident)) self.locals.get_mut(ident).or(self.globals.get_mut(ident))
.ok_or(RuntimeError::VariableUndefined(ident.clone())) .ok_or(RuntimeError::VariableUndefined(ident.clone()))
} }
@@ -238,7 +238,7 @@ where
Executor::new(self.exprs, &mut self.globals) Executor::new(self.exprs, &mut self.globals)
.locals(self.locals.clone()) .locals(self.locals.clone())
.add_local(ident, Rc::new(RefCell::new(Object::value(value, g, self.locals.to_owned())))) .add_local(ident, Arc::new(RefCell::new(Object::value(value, g, self.locals.to_owned()))))
.exec(scope) .exec(scope)
} }
}, },
@@ -249,7 +249,7 @@ where
let g = self.globals.clone(); let g = self.globals.clone();
Executor::new(self.exprs, &mut self.globals) Executor::new(self.exprs, &mut self.globals)
.locals(self.locals.clone()) .locals(self.locals.clone())
.add_local(ident, Rc::new(RefCell::new(Object::variable(*body, g, self.locals.to_owned())))) .add_local(ident, Arc::new(RefCell::new(Object::variable(*body, g, self.locals.to_owned()))))
.exec(scope) .exec(scope)
} }
}, },
@@ -257,7 +257,7 @@ where
let g = self.globals.clone(); let g = self.globals.clone();
Executor::new(self.exprs, &mut self.globals) Executor::new(self.exprs, &mut self.globals)
.locals(self.locals.clone()) .locals(self.locals.clone())
.add_local(func.name().unwrap().to_string(), Rc::new(RefCell::new(Object::function(func, g, self.locals.clone())))) .add_local(func.name().unwrap().to_string(), Arc::new(RefCell::new(Object::function(func, g, self.locals.clone()))))
.exec(scope) .exec(scope)
}, },
ParseTree::Compose(x, y) => { ParseTree::Compose(x, y) => {

View File

@@ -5,7 +5,7 @@ use crate::{Type, Object, Value};
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt::{self, Display}; use std::fmt::{self, Display};
use std::rc::Rc; use std::sync::Arc;
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
pub struct FunctionType(pub Box<Type>, pub Vec<Type>); pub struct FunctionType(pub Box<Type>, pub Vec<Type>);
@@ -52,8 +52,8 @@ impl Function {
} }
pub(crate) fn call(&mut self, pub(crate) fn call(&mut self,
mut globals: HashMap<String, Rc<RefCell<Object>>>, mut globals: HashMap<String, Arc<RefCell<Object>>>,
locals: HashMap<String, Rc<RefCell<Object>>>, locals: HashMap<String, Arc<RefCell<Object>>>,
args: Vec<Object>) -> Result<Value, RuntimeError> args: Vec<Object>) -> Result<Value, RuntimeError>
{ {
let mut tree = vec![Ok(*self.body.clone())].into_iter(); let mut tree = vec![Ok(*self.body.clone())].into_iter();
@@ -63,11 +63,11 @@ impl Function {
.locals(locals.clone()); .locals(locals.clone());
for (obj, name) in std::iter::zip(args.into_iter(), self.arg_names.clone().into_iter()) { for (obj, name) in std::iter::zip(args.into_iter(), self.arg_names.clone().into_iter()) {
exec = exec.add_local(name.clone(), Rc::new(RefCell::new(obj))); exec = exec.add_local(name.clone(), Arc::new(RefCell::new(obj)));
} }
if let Some(name) = self.name().map(|x| x.to_string()) { if let Some(name) = self.name().map(|x| x.to_string()) {
exec = exec.add_local(name, Rc::new(RefCell::new(Object::function(self.clone(), g, locals)))); exec = exec.add_local(name, Arc::new(RefCell::new(Object::function(self.clone(), g, locals))));
} }
exec.next().unwrap() exec.next().unwrap()

View File

@@ -13,7 +13,7 @@ use std::fmt::Display;
use std::io::BufRead; use std::io::BufRead;
use std::fmt; use std::fmt;
use std::iter::Peekable; use std::iter::Peekable;
use std::rc::Rc; use std::sync::Arc;
use std::cell::RefCell; use std::cell::RefCell;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@@ -103,13 +103,13 @@ enum Cache {
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
struct Object { struct Object {
locals: HashMap<String, Rc<RefCell<Object>>>, locals: HashMap<String, Arc<RefCell<Object>>>,
globals: HashMap<String, Rc<RefCell<Object>>>, globals: HashMap<String, Arc<RefCell<Object>>>,
value: Cache, value: Cache,
} }
impl Object { impl Object {
pub fn variable(tree: ParseTree, globals: HashMap<String, Rc<RefCell<Object>>>, locals: HashMap<String, Rc<RefCell<Object>>>) -> Self { pub fn variable(tree: ParseTree, globals: HashMap<String, Arc<RefCell<Object>>>, locals: HashMap<String, Arc<RefCell<Object>>>) -> Self {
Self { Self {
locals, locals,
globals, globals,
@@ -117,7 +117,7 @@ impl Object {
} }
} }
pub fn value(v: Value, globals: HashMap<String, Rc<RefCell<Object>>>, locals: HashMap<String, Rc<RefCell<Object>>>) -> Self { pub fn value(v: Value, globals: HashMap<String, Arc<RefCell<Object>>>, locals: HashMap<String, Arc<RefCell<Object>>>) -> Self {
Self { Self {
locals, locals,
globals, globals,
@@ -125,7 +125,7 @@ impl Object {
} }
} }
pub fn function(func: Function, globals: HashMap<String, Rc<RefCell<Object>>>, locals: HashMap<String, Rc<RefCell<Object>>>) -> Self { pub fn function(func: Function, globals: HashMap<String, Arc<RefCell<Object>>>, locals: HashMap<String, Arc<RefCell<Object>>>) -> Self {
Self { Self {
locals, locals,
globals, globals,
@@ -152,11 +152,11 @@ impl Object {
} }
} }
pub fn locals(&self) -> HashMap<String, Rc<RefCell<Object>>> { pub fn locals(&self) -> HashMap<String, Arc<RefCell<Object>>> {
self.locals.clone() self.locals.clone()
} }
pub fn globals(&self) -> HashMap<String, Rc<RefCell<Object>>> { pub fn globals(&self) -> HashMap<String, Arc<RefCell<Object>>> {
self.globals.clone() self.globals.clone()
} }
} }
@@ -164,7 +164,7 @@ impl Object {
pub struct Runtime<'a, R: BufRead> { pub struct Runtime<'a, R: BufRead> {
tokenizer: Peekable<Tokenizer<R>>, tokenizer: Peekable<Tokenizer<R>>,
global_types: HashMap<String, Type>, global_types: HashMap<String, Type>,
globals: HashMap<String, Rc<RefCell<Object>>>, globals: HashMap<String, Arc<RefCell<Object>>>,
parser: Option<Parser<'a, Tokenizer<R>>>, parser: Option<Parser<'a, Tokenizer<R>>>,
} }