mirror of
https://github.com/Dummi26/mers.git
synced 2025-03-10 14:13:52 +01:00
fix list cloning not cloning inner values
this would allow mutating values through a list passed by value, but now it doesn't, which is how it always should have been.
This commit is contained in:
parent
1554453eb9
commit
945e19e10a
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "mers"
|
name = "mers"
|
||||||
version = "0.8.2"
|
version = "0.8.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
description = "dynamically typed but type-checked programming language"
|
description = "dynamically typed but type-checked programming language"
|
||||||
@ -11,7 +11,7 @@ repository = "https://github.com/Dummi26/mers"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
mers_lib = "0.8.2"
|
mers_lib = "0.8.3"
|
||||||
# mers_lib = { path = "../mers_lib" }
|
# mers_lib = { path = "../mers_lib" }
|
||||||
clap = { version = "4.3.19", features = ["derive"] }
|
clap = { version = "4.3.19", features = ["derive"] }
|
||||||
colored = "2.1.0"
|
colored = "2.1.0"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "mers_lib"
|
name = "mers_lib"
|
||||||
version = "0.8.2"
|
version = "0.8.3"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
description = "library to use the mers language in other projects"
|
description = "library to use the mers language in other projects"
|
||||||
|
@ -7,7 +7,7 @@ use std::{
|
|||||||
use super::{Data, MersData, MersType, Type};
|
use super::{Data, MersData, MersType, Type};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Reference(pub Arc<RwLock<Data>>, pub Type);
|
pub struct Reference(pub Arc<RwLock<Data>>);
|
||||||
|
|
||||||
impl MersData for Reference {
|
impl MersData for Reference {
|
||||||
fn is_eq(&self, other: &dyn MersData) -> bool {
|
fn is_eq(&self, other: &dyn MersData) -> bool {
|
||||||
@ -21,7 +21,7 @@ impl MersData for Reference {
|
|||||||
Box::new(Clone::clone(self))
|
Box::new(Clone::clone(self))
|
||||||
}
|
}
|
||||||
fn as_type(&self) -> Type {
|
fn as_type(&self) -> Type {
|
||||||
Type::new(ReferenceT(self.1.clone()))
|
Type::new(ReferenceT(self.0.read().unwrap().get().as_type()))
|
||||||
}
|
}
|
||||||
fn as_any(&self) -> &dyn Any {
|
fn as_any(&self) -> &dyn Any {
|
||||||
self
|
self
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use std::{
|
use std::{
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex, RwLock},
|
||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -13,6 +13,7 @@ use super::Config;
|
|||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
/// `deref: fn` clones the value from a reference
|
/// `deref: fn` clones the value from a reference
|
||||||
|
/// `mkref: fn` returns a reference to a copy of the value
|
||||||
/// `eq: fn` returns true if all the values are equal, otherwise false.
|
/// `eq: fn` returns true if all the values are equal, otherwise false.
|
||||||
/// `loop: fn` runs a function until it returns (T) instead of (), then returns T. Also works with ((), f) instead of f for ().loop(() -> { ... }) syntax, which may be more readable
|
/// `loop: fn` runs a function until it returns (T) instead of (), then returns T. Also works with ((), f) instead of f for ().loop(() -> { ... }) syntax, which may be more readable
|
||||||
/// `try: fn` runs the first valid function with the argument. usage: (arg, (f1, f2, f3)).try
|
/// `try: fn` runs the first valid function with the argument. usage: (arg, (f1, f2, f3)).try
|
||||||
@ -173,6 +174,18 @@ impl Config {
|
|||||||
inner_statements: None,
|
inner_statements: None,
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
.add_var(
|
||||||
|
"mkref".to_string(),
|
||||||
|
Data::new(data::function::Function {
|
||||||
|
info: Arc::new(Info::neverused()),
|
||||||
|
info_check: Arc::new(Mutex::new(CheckInfo::neverused())),
|
||||||
|
out: Arc::new(|a, _i| Ok(Type::new(data::reference::ReferenceT(a.clone())))),
|
||||||
|
run: Arc::new(|a, _i| {
|
||||||
|
Data::new(data::reference::Reference(Arc::new(RwLock::new(a.clone()))))
|
||||||
|
}),
|
||||||
|
inner_statements: None,
|
||||||
|
}),
|
||||||
|
)
|
||||||
.add_var(
|
.add_var(
|
||||||
"deref".to_string(),
|
"deref".to_string(),
|
||||||
Data::new(data::function::Function {
|
Data::new(data::function::Function {
|
||||||
|
@ -80,16 +80,16 @@ impl Config {
|
|||||||
.as_any()
|
.as_any()
|
||||||
.downcast_ref::<data::reference::Reference>()
|
.downcast_ref::<data::reference::Reference>()
|
||||||
.unwrap().0;
|
.unwrap().0;
|
||||||
let list = list
|
let mut list = list
|
||||||
.read()
|
.write()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let list = list.get();
|
let list = list.get_mut();
|
||||||
let list = list.as_any()
|
let list = list.as_any()
|
||||||
.downcast_ref::<List>()
|
.downcast_ref::<List>()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let o = match list.0.get(i) {
|
let o = match list.0.get(i) {
|
||||||
Some(data) => {
|
Some(data) => {
|
||||||
Data::one_tuple(Data::new(data::reference::Reference(Arc::clone(data), list.inner_type())))
|
Data::one_tuple(Data::new(data::reference::Reference(Arc::clone(data))))
|
||||||
}
|
}
|
||||||
None => Data::empty_tuple(),
|
None => Data::empty_tuple(),
|
||||||
};
|
};
|
||||||
@ -235,8 +235,18 @@ impl Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Debug)]
|
||||||
pub struct List(pub Vec<Arc<RwLock<Data>>>);
|
pub struct List(pub Vec<Arc<RwLock<Data>>>);
|
||||||
|
impl Clone for List {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
Self(
|
||||||
|
self.0
|
||||||
|
.iter()
|
||||||
|
.map(|v| Arc::new(RwLock::new(v.read().unwrap().clone())))
|
||||||
|
.collect(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ListT(pub Type);
|
pub struct ListT(pub Type);
|
||||||
impl MersData for List {
|
impl MersData for List {
|
||||||
|
@ -60,18 +60,14 @@ impl MersStatement for Variable {
|
|||||||
info.scopes[self.var.0].vars[self.var.1] = nothing;
|
info.scopes[self.var.0].vars[self.var.1] = nothing;
|
||||||
} else {
|
} else {
|
||||||
// (reference to) data which will never be referenced again
|
// (reference to) data which will never be referenced again
|
||||||
return Data::new(data::reference::Reference(
|
return Data::new(data::reference::Reference(Arc::new(RwLock::new(
|
||||||
Arc::new(RwLock::new(Data::empty_tuple())),
|
Data::empty_tuple(),
|
||||||
Type::empty(),
|
))));
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if self.is_ref_not_ignore {
|
if self.is_ref_not_ignore {
|
||||||
let v = &info.scopes[self.var.0].vars[self.var.1];
|
let v = &info.scopes[self.var.0].vars[self.var.1];
|
||||||
Data::new(data::reference::Reference(
|
Data::new(data::reference::Reference(Arc::clone(v)))
|
||||||
Arc::clone(v),
|
|
||||||
v.read().unwrap().get().as_type(),
|
|
||||||
))
|
|
||||||
} else {
|
} else {
|
||||||
info.scopes[self.var.0].vars[self.var.1]
|
info.scopes[self.var.0].vars[self.var.1]
|
||||||
.write()
|
.write()
|
||||||
|
Loading…
Reference in New Issue
Block a user