From dd017ffea4da56bde5495e49b84ee6ae5c115c92 Mon Sep 17 00:00:00 2001 From: Dummi26 Date: Wed, 26 Apr 2023 17:53:25 +0200 Subject: [PATCH] added clone() to dereference by cloning --- mers/src/script/builtins.rs | 13 +++++++++++++ mers/src/script/val_type.rs | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/mers/src/script/builtins.rs b/mers/src/script/builtins.rs index 0a0823f..207c076 100755 --- a/mers/src/script/builtins.rs +++ b/mers/src/script/builtins.rs @@ -24,6 +24,7 @@ pub enum BuiltinFunction { AssumeNoEnum, // assume enum(*)/t is t. NoEnum, Matches, + Clone, // print Print, Println, @@ -93,6 +94,7 @@ impl BuiltinFunction { "assume_no_enum" => Self::AssumeNoEnum, "noenum" => Self::NoEnum, "matches" => Self::Matches, + "clone" => Self::Clone, "print" => Self::Print, "println" => Self::Println, "debug" => Self::Debug, @@ -214,6 +216,7 @@ impl BuiltinFunction { } Self::NoEnum => input.len() == 1, Self::Matches => input.len() == 1, + Self::Clone => input.len() == 1 && matches!(input[0].is_reference(), Some(true)), Self::Print | Self::Println => { if input.len() == 1 { input[0].fits_in(&VSingleType::String.to()).is_empty() @@ -502,6 +505,9 @@ impl BuiltinFunction { } Self::NoEnum => input[0].clone().noenum(), Self::Matches => input[0].matches().1, + Self::Clone => input[0] + .dereference() + .expect("type is a reference, so it can be dereferenced"), // [] Self::Print | Self::Println | Self::Debug | Self::Sleep => VType { types: vec![VSingleType::Tuple(vec![])], @@ -750,6 +756,13 @@ impl BuiltinFunction { Some(v) => VDataEnum::Tuple(vec![v]).to(), None => VDataEnum::Tuple(vec![]).to(), }, + Self::Clone => { + if let VDataEnum::Reference(r) = args[0].run(vars, info).data { + r.lock().unwrap().clone() + } else { + unreachable!() + } + } BuiltinFunction::Print => { if let VDataEnum::String(arg) = args[0].run(vars, info).data { print!("{}", arg); diff --git a/mers/src/script/val_type.rs b/mers/src/script/val_type.rs index 20d994e..ae46845 100755 --- a/mers/src/script/val_type.rs +++ b/mers/src/script/val_type.rs @@ -52,7 +52,7 @@ impl VType { } Some(out) } - // returns Some(true) or Some(false) if all types are references or not references. If it is mixed or types is empty, returns None. + /// returns Some(true) or Some(false) if all types are references or not references. If it is mixed or types is empty, returns None. pub fn is_reference(&self) -> Option { let mut noref = false; let mut reference = false;