From 4814329ecaf90269d5f2737e289462ec6ea8f963 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Fri, 26 May 2023 13:53:27 +1000 Subject: [PATCH] Implement to_val_string on Val and avoid conversion when already string --- valuescript_vm/src/bigint_methods.rs | 6 +++--- valuescript_vm/src/builtins/array_builtin.rs | 4 ++-- .../src/builtins/boolean_builtin.rs | 4 ++-- valuescript_vm/src/builtins/debug_builtin.rs | 4 ++-- valuescript_vm/src/builtins/error_builtin.rs | 6 +++--- valuescript_vm/src/builtins/math_builtin.rs | 4 ++-- valuescript_vm/src/builtins/number_builtin.rs | 4 ++-- .../src/builtins/range_error_builtin.rs | 6 +++--- valuescript_vm/src/builtins/string_builtin.rs | 6 +++--- valuescript_vm/src/builtins/symbol_builtin.rs | 4 ++-- .../src/builtins/type_error_builtin.rs | 6 +++--- valuescript_vm/src/native_frame_function.rs | 4 ++-- valuescript_vm/src/native_function.rs | 4 ++-- valuescript_vm/src/number_methods.rs | 8 +++---- valuescript_vm/src/vs_array.rs | 8 +++---- valuescript_vm/src/vs_value.rs | 21 +++++++++---------- 16 files changed, 49 insertions(+), 50 deletions(-) diff --git a/valuescript_vm/src/bigint_methods.rs b/valuescript_vm/src/bigint_methods.rs index fd92a1b..4126d80 100644 --- a/valuescript_vm/src/bigint_methods.rs +++ b/valuescript_vm/src/bigint_methods.rs @@ -4,7 +4,7 @@ use crate::{ builtins::error_builtin::ToError, native_function::{NativeFunction, ThisWrapper}, todo_fn::TODO, - vs_value::{ToValString, Val}, + vs_value::{ToVal, Val}, }; pub fn op_sub_bigint(_bigint: &BigInt, subscript: &Val) -> Val { @@ -19,12 +19,12 @@ pub fn op_sub_bigint(_bigint: &BigInt, subscript: &Val) -> Val { static TO_STRING: NativeFunction = NativeFunction { fn_: |this: ThisWrapper, params: Vec| -> Result { Ok(match this.get() { - Val::BigInt(_) => match params.get(0) { + Val::BigInt(bigint) => match params.get(0) { Some(_) => { return Err("TODO: toString with radix".to_error()); } - None => this.get().to_val_string(), + None => bigint.clone().to_val().to_string().to_val(), }, _ => return Err("TODO: bigint indirection".to_error()), }) diff --git a/valuescript_vm/src/builtins/array_builtin.rs b/valuescript_vm/src/builtins/array_builtin.rs index 92dd670..89efbd5 100644 --- a/valuescript_vm/src/builtins/array_builtin.rs +++ b/valuescript_vm/src/builtins/array_builtin.rs @@ -10,7 +10,7 @@ use crate::{ vs_array::VsArray, vs_class::VsClass, vs_object::VsObject, - vs_value::{LoadFunctionResult, ToVal, ToValString, Val, VsType}, + vs_value::{LoadFunctionResult, ToVal, Val, VsType}, ValTrait, }; @@ -34,7 +34,7 @@ impl ValTrait for ArrayBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true diff --git a/valuescript_vm/src/builtins/boolean_builtin.rs b/valuescript_vm/src/builtins/boolean_builtin.rs index ce98738..81c96b3 100644 --- a/valuescript_vm/src/builtins/boolean_builtin.rs +++ b/valuescript_vm/src/builtins/boolean_builtin.rs @@ -7,7 +7,7 @@ use crate::{ vs_array::VsArray, vs_class::VsClass, vs_object::VsObject, - vs_value::{LoadFunctionResult, ToValString, Val, VsType}, + vs_value::{LoadFunctionResult, ToVal, Val, VsType}, ValTrait, }; @@ -31,7 +31,7 @@ impl ValTrait for BooleanBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true diff --git a/valuescript_vm/src/builtins/debug_builtin.rs b/valuescript_vm/src/builtins/debug_builtin.rs index fd6f911..1f5a889 100644 --- a/valuescript_vm/src/builtins/debug_builtin.rs +++ b/valuescript_vm/src/builtins/debug_builtin.rs @@ -7,7 +7,7 @@ use crate::native_function::{NativeFunction, ThisWrapper}; use crate::vs_array::VsArray; use crate::vs_class::VsClass; use crate::vs_object::VsObject; -use crate::vs_value::{LoadFunctionResult, ToValString, Val, ValTrait, VsType}; +use crate::vs_value::{LoadFunctionResult, ToVal, Val, ValTrait, VsType}; use super::type_error_builtin::ToTypeError; @@ -29,7 +29,7 @@ impl ValTrait for DebugBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true diff --git a/valuescript_vm/src/builtins/error_builtin.rs b/valuescript_vm/src/builtins/error_builtin.rs index 863a18f..9b6fe4a 100644 --- a/valuescript_vm/src/builtins/error_builtin.rs +++ b/valuescript_vm/src/builtins/error_builtin.rs @@ -4,7 +4,7 @@ use std::{collections::BTreeMap, rc::Rc}; use num_bigint::BigInt; use crate::native_function::ThisWrapper; -use crate::vs_value::{ToVal, ToValString}; +use crate::vs_value::ToVal; use crate::{ native_function::NativeFunction, operations::{op_sub, op_submov}, @@ -35,7 +35,7 @@ impl ValTrait for ErrorBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true @@ -66,7 +66,7 @@ impl ValTrait for ErrorBuiltin { LoadFunctionResult::NativeFunction(|_: ThisWrapper, params: Vec| -> Result { Ok( match params.get(0) { - Some(param) => param.to_val_string(), + Some(param) => param.clone().to_val_string(), None => "".to_val(), } .to_error(), diff --git a/valuescript_vm/src/builtins/math_builtin.rs b/valuescript_vm/src/builtins/math_builtin.rs index f0e8dc4..32d6626 100644 --- a/valuescript_vm/src/builtins/math_builtin.rs +++ b/valuescript_vm/src/builtins/math_builtin.rs @@ -8,7 +8,7 @@ use crate::operations::to_u32; use crate::vs_array::VsArray; use crate::vs_class::VsClass; use crate::vs_object::VsObject; -use crate::vs_value::{LoadFunctionResult, ToValString, Val, ValTrait, VsType}; +use crate::vs_value::{LoadFunctionResult, ToVal, Val, ValTrait, VsType}; use super::type_error_builtin::ToTypeError; @@ -30,7 +30,7 @@ impl ValTrait for MathBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true diff --git a/valuescript_vm/src/builtins/number_builtin.rs b/valuescript_vm/src/builtins/number_builtin.rs index c125fd6..8a58883 100644 --- a/valuescript_vm/src/builtins/number_builtin.rs +++ b/valuescript_vm/src/builtins/number_builtin.rs @@ -4,7 +4,7 @@ use std::rc::Rc; use num_bigint::BigInt; use crate::native_function::ThisWrapper; -use crate::vs_value::ToValString; +use crate::vs_value::ToVal; use crate::{ native_function::NativeFunction, vs_array::VsArray, @@ -34,7 +34,7 @@ impl ValTrait for NumberBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true diff --git a/valuescript_vm/src/builtins/range_error_builtin.rs b/valuescript_vm/src/builtins/range_error_builtin.rs index 6181a14..dd2fde7 100644 --- a/valuescript_vm/src/builtins/range_error_builtin.rs +++ b/valuescript_vm/src/builtins/range_error_builtin.rs @@ -4,7 +4,7 @@ use std::{collections::BTreeMap, rc::Rc}; use num_bigint::BigInt; use crate::native_function::ThisWrapper; -use crate::vs_value::{ToVal, ToValString}; +use crate::vs_value::ToVal; use crate::{ native_function::NativeFunction, operations::{op_sub, op_submov}, @@ -35,7 +35,7 @@ impl ValTrait for RangeErrorBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true @@ -99,7 +99,7 @@ pub fn to_range_error(_: ThisWrapper, params: Vec) -> Result { string_map: BTreeMap::from([( "message".to_string(), match params.get(0) { - Some(param) => param.to_val_string(), + Some(param) => param.clone().to_val_string(), None => "".to_val(), }, )]), diff --git a/valuescript_vm/src/builtins/string_builtin.rs b/valuescript_vm/src/builtins/string_builtin.rs index 6606ca6..03c6dde 100644 --- a/valuescript_vm/src/builtins/string_builtin.rs +++ b/valuescript_vm/src/builtins/string_builtin.rs @@ -4,7 +4,7 @@ use std::rc::Rc; use num_bigint::BigInt; use crate::native_function::ThisWrapper; -use crate::vs_value::{ToVal, ToValString}; +use crate::vs_value::ToVal; use crate::{builtins::range_error_builtin::to_range_error, range_error}; use crate::{ native_function::NativeFunction, @@ -35,7 +35,7 @@ impl ValTrait for StringBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true @@ -119,7 +119,7 @@ static FROM_CODE_POINT: NativeFunction = NativeFunction { fn to_string(_: ThisWrapper, params: Vec) -> Result { Ok(if let Some(value) = params.get(0) { - value.to_val_string() + value.clone().to_val_string() } else { "".to_val() }) diff --git a/valuescript_vm/src/builtins/symbol_builtin.rs b/valuescript_vm/src/builtins/symbol_builtin.rs index 5b501a2..55f120f 100644 --- a/valuescript_vm/src/builtins/symbol_builtin.rs +++ b/valuescript_vm/src/builtins/symbol_builtin.rs @@ -7,7 +7,7 @@ use crate::{ vs_class::VsClass, vs_object::VsObject, vs_symbol::VsSymbol, - vs_value::{LoadFunctionResult, ToValString, Val, VsType}, + vs_value::{LoadFunctionResult, ToVal, Val, VsType}, ValTrait, }; @@ -31,7 +31,7 @@ impl ValTrait for SymbolBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true diff --git a/valuescript_vm/src/builtins/type_error_builtin.rs b/valuescript_vm/src/builtins/type_error_builtin.rs index 77deb4d..b40fc0f 100644 --- a/valuescript_vm/src/builtins/type_error_builtin.rs +++ b/valuescript_vm/src/builtins/type_error_builtin.rs @@ -4,7 +4,7 @@ use std::{collections::BTreeMap, rc::Rc}; use num_bigint::BigInt; use crate::native_function::ThisWrapper; -use crate::vs_value::{ToVal, ToValString}; +use crate::vs_value::ToVal; use crate::{ native_function::NativeFunction, operations::{op_sub, op_submov}, @@ -33,7 +33,7 @@ impl ValTrait for TypeErrorBuiltin { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true @@ -64,7 +64,7 @@ impl ValTrait for TypeErrorBuiltin { LoadFunctionResult::NativeFunction(|_: ThisWrapper, params: Vec| -> Result { Ok( match params.get(0) { - Some(param) => param.to_val_string(), + Some(param) => param.clone().to_val_string(), None => "".to_val(), } .to_type_error(), diff --git a/valuescript_vm/src/native_frame_function.rs b/valuescript_vm/src/native_frame_function.rs index fbbdac4..b2c6a64 100644 --- a/valuescript_vm/src/native_frame_function.rs +++ b/valuescript_vm/src/native_frame_function.rs @@ -9,7 +9,7 @@ use crate::stack_frame::StackFrame; use crate::vs_array::VsArray; use crate::vs_class::VsClass; use crate::vs_object::VsObject; -use crate::vs_value::{LoadFunctionResult, ToValString, Val, ValTrait, VsType}; +use crate::vs_value::{LoadFunctionResult, ToVal, Val, ValTrait, VsType}; pub struct NativeFrameFunction { pub make_frame: fn() -> StackFrame, @@ -29,7 +29,7 @@ impl ValTrait for NativeFrameFunction { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true diff --git a/valuescript_vm/src/native_function.rs b/valuescript_vm/src/native_function.rs index fe20d18..a841ee7 100644 --- a/valuescript_vm/src/native_function.rs +++ b/valuescript_vm/src/native_function.rs @@ -8,7 +8,7 @@ use crate::builtins::type_error_builtin::ToTypeError; use crate::vs_array::VsArray; use crate::vs_class::VsClass; use crate::vs_object::VsObject; -use crate::vs_value::{LoadFunctionResult, ToVal, ToValString, Val, ValTrait, VsType}; +use crate::vs_value::{LoadFunctionResult, ToVal, Val, ValTrait, VsType}; pub struct ThisWrapper<'a> { const_: bool, @@ -51,7 +51,7 @@ impl ValTrait for NativeFunction { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true diff --git a/valuescript_vm/src/number_methods.rs b/valuescript_vm/src/number_methods.rs index 215b1e9..fb8ec41 100644 --- a/valuescript_vm/src/number_methods.rs +++ b/valuescript_vm/src/number_methods.rs @@ -1,6 +1,6 @@ use crate::builtins::error_builtin::ToError; use crate::native_function::ThisWrapper; -use crate::vs_value::{ToVal, ToValString}; +use crate::vs_value::ToVal; use crate::{builtins::range_error_builtin::to_range_error, range_error}; use crate::{ native_function::NativeFunction, @@ -37,7 +37,7 @@ static TO_FIXED: NativeFunction = NativeFunction { let mut precision = match params.get(0) { Some(p) => p.to_number(), - _ => return Ok(this.get().to_val_string()), + _ => return Ok(number.to_val().to_string().to_val()), }; precision = f64::floor(precision); @@ -86,12 +86,12 @@ static TODO_LOCALE: NativeFunction = NativeFunction { static TO_STRING: NativeFunction = NativeFunction { fn_: |this: ThisWrapper, params: Vec| -> Result { Ok(match this.get() { - Val::Number(_) => match params.get(0) { + Val::Number(number) => match params.get(0) { Some(_) => { return Err("TODO: toString with radix".to_error()); } - None => this.get().to_val_string(), + None => number.to_val().to_string().to_val(), }, _ => return Err("number indirection".to_error()), }) diff --git a/valuescript_vm/src/vs_array.rs b/valuescript_vm/src/vs_array.rs index f30fb53..efd4a45 100644 --- a/valuescript_vm/src/vs_array.rs +++ b/valuescript_vm/src/vs_array.rs @@ -17,7 +17,7 @@ use crate::operations::op_triple_eq_impl; use crate::todo_fn::TODO; use crate::vs_class::VsClass; use crate::vs_object::VsObject; -use crate::vs_value::{LoadFunctionResult, ToVal, ToValString, Val, ValTrait, VsType}; +use crate::vs_value::{LoadFunctionResult, ToVal, Val, ValTrait, VsType}; #[derive(Clone, Debug)] pub struct VsArray { @@ -73,7 +73,7 @@ impl ValTrait for ArrayPrototype { false } fn to_primitive(&self) -> Val { - self.to_val_string() + self.to_string().to_val() } fn is_truthy(&self) -> bool { true @@ -403,7 +403,7 @@ static JOIN: NativeFunction = NativeFunction { } if vals.elements.len() == 1 { - return Ok(vals.elements[0].to_val_string()); + return Ok(vals.elements[0].clone().to_val_string()); } let separator = match params.get(0) { @@ -657,7 +657,7 @@ static SPLICE: NativeFunction = NativeFunction { // TODO: Share this? (JS doesn't?) static TO_STRING: NativeFunction = NativeFunction { fn_: |this: ThisWrapper, _params: Vec| -> Result { - Ok(this.get().to_val_string()) + Ok(this.get().to_string().to_val()) }, }; diff --git a/valuescript_vm/src/vs_value.rs b/valuescript_vm/src/vs_value.rs index 0e20188..b334fa0 100644 --- a/valuescript_vm/src/vs_value.rs +++ b/valuescript_vm/src/vs_value.rs @@ -120,6 +120,15 @@ impl fmt::Debug for dyn ValTrait { } } +impl Val { + pub fn to_val_string(self) -> Val { + match self { + Val::String(_) => self, + _ => self.to_string().to_val(), + } + } +} + impl ValTrait for Val { fn typeof_(&self) -> VsType { use Val::*; @@ -216,7 +225,7 @@ impl ValTrait for Val { if self.is_primitive() { self.clone() } else { - self.to_val_string() + self.clone().to_val_string() } } @@ -490,16 +499,6 @@ impl fmt::Display for Val { } } -pub trait ToValString { - fn to_val_string(&self) -> Val; -} - -impl ToValString for T { - fn to_val_string(&self) -> Val { - Val::String(Rc::new(self.to_string())) - } -} - pub trait ToVal { fn to_val(self) -> Val; }