From 4c18613747d79946d37235a95dbe663dc5e86132 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Mon, 2 May 2022 12:12:07 +1000 Subject: [PATCH] to_primitive --- src/vstc/virtual_machine/operations.rs | 10 +++++++--- src/vstc/virtual_machine/vs_number.rs | 4 ++++ src/vstc/virtual_machine/vs_pointer.rs | 13 +++++++++++++ src/vstc/virtual_machine/vs_string.rs | 4 ++++ src/vstc/virtual_machine/vs_value.rs | 15 +++++++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/vstc/virtual_machine/operations.rs b/src/vstc/virtual_machine/operations.rs index 003f096..d448ba2 100644 --- a/src/vstc/virtual_machine/operations.rs +++ b/src/vstc/virtual_machine/operations.rs @@ -1,12 +1,16 @@ use super::vs_value::Val; +use super::vs_value::ValTrait; use super::vs_value::VsType; use super::vs_string::VsString; use super::vs_number::VsNumber; pub fn op_plus(left: &Val, right: &Val) -> Val { - if left.typeof_() == VsType::String || right.typeof_() == VsType::String { - return VsString::from_string(left.to_string() + &right.to_string()); + let left_prim = left.to_primitive(); + let right_prim = right.to_primitive(); + + if left_prim.typeof_() == VsType::String || right_prim.typeof_() == VsType::String { + return VsString::from_string(left_prim.to_string() + &right_prim.to_string()); } - return VsNumber::from_f64(left.to_number() + right.to_number()); + return VsNumber::from_f64(left_prim.to_number() + right_prim.to_number()); } diff --git a/src/vstc/virtual_machine/vs_number.rs b/src/vstc/virtual_machine/vs_number.rs index f520693..93f4fb1 100644 --- a/src/vstc/virtual_machine/vs_number.rs +++ b/src/vstc/virtual_machine/vs_number.rs @@ -26,4 +26,8 @@ impl VsValue for VsNumber { fn to_number(&self) -> f64 { return self.value; } + + fn is_primitive(&self) -> bool { + return true; + } } diff --git a/src/vstc/virtual_machine/vs_pointer.rs b/src/vstc/virtual_machine/vs_pointer.rs index 13382b6..dc6ec66 100644 --- a/src/vstc/virtual_machine/vs_pointer.rs +++ b/src/vstc/virtual_machine/vs_pointer.rs @@ -75,4 +75,17 @@ impl VsValue for VsPointer { fn to_number(&self) -> f64 { return self.decode().to_number(); } + + fn is_primitive(&self) -> bool { + return match self.typeof_() { + Undefined => true, + Null => true, + Bool => true, + Number => true, + String => true, + Array => false, + Object => true, + Function => false, + } + } } diff --git a/src/vstc/virtual_machine/vs_string.rs b/src/vstc/virtual_machine/vs_string.rs index f2607b4..40bab25 100644 --- a/src/vstc/virtual_machine/vs_string.rs +++ b/src/vstc/virtual_machine/vs_string.rs @@ -30,4 +30,8 @@ impl VsValue for VsString { fn to_number(&self) -> f64 { std::panic!("not implemented"); } + + fn is_primitive(&self) -> bool { + return true; + } } \ No newline at end of file diff --git a/src/vstc/virtual_machine/vs_value.rs b/src/vstc/virtual_machine/vs_value.rs index 1690917..41f638b 100644 --- a/src/vstc/virtual_machine/vs_value.rs +++ b/src/vstc/virtual_machine/vs_value.rs @@ -35,6 +35,21 @@ pub trait VsValue { fn typeof_(&self) -> VsType; fn to_string(&self) -> String; fn to_number(&self) -> f64; + fn is_primitive(&self) -> bool; +} + +pub trait ValTrait { + fn to_primitive(&self) -> Val; +} + +impl ValTrait for Val { + fn to_primitive(&self) -> Val { + if self.is_primitive() { + return self.clone(); + } + + return VsString::from_string(self.to_string()); + } } impl std::fmt::Display for dyn VsValue {