From cbc6e1f1da305a88b34c921fa8b73989f5f1067d Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Mon, 29 May 2023 09:12:29 +1000 Subject: [PATCH] IterationResult, remove as_object_data --- valuescript_vm/src/builtins/builtin_object.rs | 5 - .../src/iteration/iteration_result.rs | 91 +++++++++++++++++++ valuescript_vm/src/iteration/mod.rs | 1 + valuescript_vm/src/lib.rs | 1 + valuescript_vm/src/native_frame_function.rs | 4 - valuescript_vm/src/native_function.rs | 4 - valuescript_vm/src/vs_array.rs | 3 - valuescript_vm/src/vs_value.rs | 12 --- 8 files changed, 93 insertions(+), 28 deletions(-) create mode 100644 valuescript_vm/src/iteration/iteration_result.rs create mode 100644 valuescript_vm/src/iteration/mod.rs diff --git a/valuescript_vm/src/builtins/builtin_object.rs b/valuescript_vm/src/builtins/builtin_object.rs index 4782d5f..fb1d47a 100644 --- a/valuescript_vm/src/builtins/builtin_object.rs +++ b/valuescript_vm/src/builtins/builtin_object.rs @@ -5,7 +5,6 @@ use num_bigint::BigInt; use crate::{ vs_array::VsArray, vs_class::VsClass, - vs_object::VsObject, vs_value::{Val, VsType}, LoadFunctionResult, ValTrait, }; @@ -59,10 +58,6 @@ where None } - fn as_object_data(&self) -> Option> { - None - } - fn as_class_data(&self) -> Option> { Self::bo_as_class_data() } diff --git a/valuescript_vm/src/iteration/iteration_result.rs b/valuescript_vm/src/iteration/iteration_result.rs new file mode 100644 index 0000000..33cba6e --- /dev/null +++ b/valuescript_vm/src/iteration/iteration_result.rs @@ -0,0 +1,91 @@ +use std::{fmt, rc::Rc}; + +use num_bigint::BigInt; + +use crate::{ + builtins::type_error_builtin::ToTypeError, + vs_array::VsArray, + vs_class::VsClass, + vs_value::{ToVal, Val, VsType}, + LoadFunctionResult, ValTrait, +}; + +struct IterationResult { + pub value: Val, + pub done: bool, +} + +impl ValTrait for IterationResult { + fn typeof_(&self) -> VsType { + VsType::Object + } + + fn to_number(&self) -> f64 { + core::f64::NAN + } + + fn to_index(&self) -> Option { + None + } + + fn is_primitive(&self) -> bool { + false + } + + fn is_truthy(&self) -> bool { + true + } + + fn is_nullish(&self) -> bool { + false + } + + fn bind(&self, _params: Vec) -> Option { + None + } + + fn as_bigint_data(&self) -> Option { + None + } + + fn as_array_data(&self) -> Option> { + None + } + + fn as_class_data(&self) -> Option> { + None + } + + fn load_function(&self) -> LoadFunctionResult { + LoadFunctionResult::NotAFunction + } + + fn sub(&self, key: Val) -> Result { + Ok(match key.to_string().as_str() { + "value" => self.value.clone(), + "done" => self.done.to_val(), + _ => Val::Undefined, + }) + } + + fn submov(&mut self, _key: Val, _value: Val) -> Result<(), Val> { + Err("Cannot assign to iteration result".to_type_error()) + } + + fn pretty_fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self.done { + false => write!(f, "Iteration({})", self.value.pretty()), + true => write!(f, "IterationDone({})", self.value.pretty()), + } + } + + fn codify(&self) -> String { + format!("{{ value: {}, done: {} }}", self.value.codify(), self.done) + } +} + +impl fmt::Display for IterationResult { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("[object Object]") + } +} diff --git a/valuescript_vm/src/iteration/mod.rs b/valuescript_vm/src/iteration/mod.rs new file mode 100644 index 0000000..9bbb3a3 --- /dev/null +++ b/valuescript_vm/src/iteration/mod.rs @@ -0,0 +1 @@ +mod iteration_result; diff --git a/valuescript_vm/src/lib.rs b/valuescript_vm/src/lib.rs index 4ff4113..8e980a5 100644 --- a/valuescript_vm/src/lib.rs +++ b/valuescript_vm/src/lib.rs @@ -6,6 +6,7 @@ mod bytecode_decoder; mod bytecode_stack_frame; mod first_stack_frame; mod helpers; +mod iteration; mod native_frame_function; mod native_function; mod number_methods; diff --git a/valuescript_vm/src/native_frame_function.rs b/valuescript_vm/src/native_frame_function.rs index a525a6a..af141a4 100644 --- a/valuescript_vm/src/native_frame_function.rs +++ b/valuescript_vm/src/native_frame_function.rs @@ -8,7 +8,6 @@ use crate::builtins::type_error_builtin::ToTypeError; 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, Val, ValTrait, VsType}; pub struct NativeFrameFunction { @@ -45,9 +44,6 @@ impl ValTrait for NativeFrameFunction { fn as_array_data(&self) -> Option> { None } - fn as_object_data(&self) -> Option> { - None - } fn as_class_data(&self) -> Option> { None } diff --git a/valuescript_vm/src/native_function.rs b/valuescript_vm/src/native_function.rs index b4d9dea..bd49950 100644 --- a/valuescript_vm/src/native_function.rs +++ b/valuescript_vm/src/native_function.rs @@ -7,7 +7,6 @@ use crate::builtins::error_builtin::ToError; 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, Val, ValTrait, VsType}; pub struct ThisWrapper<'a> { @@ -73,9 +72,6 @@ impl ValTrait for NativeFunction { fn as_array_data(&self) -> Option> { None } - fn as_object_data(&self) -> Option> { - None - } fn as_class_data(&self) -> Option> { None } diff --git a/valuescript_vm/src/vs_array.rs b/valuescript_vm/src/vs_array.rs index c38318c..f63c1bb 100644 --- a/valuescript_vm/src/vs_array.rs +++ b/valuescript_vm/src/vs_array.rs @@ -89,9 +89,6 @@ impl ValTrait for ArrayPrototype { fn as_array_data(&self) -> Option> { None } - fn as_object_data(&self) -> Option> { - None - } fn as_class_data(&self) -> Option> { None } diff --git a/valuescript_vm/src/vs_value.rs b/valuescript_vm/src/vs_value.rs index b42575d..7be748e 100644 --- a/valuescript_vm/src/vs_value.rs +++ b/valuescript_vm/src/vs_value.rs @@ -66,7 +66,6 @@ pub trait ValTrait: fmt::Display { fn as_bigint_data(&self) -> Option; fn as_array_data(&self) -> Option>; - fn as_object_data(&self) -> Option>; fn as_class_data(&self) -> Option>; fn load_function(&self) -> LoadFunctionResult; @@ -272,17 +271,6 @@ impl ValTrait for Val { }; } - fn as_object_data(&self) -> Option> { - use Val::*; - - return match self { - Object(obj) => Some(obj.clone()), - Custom(val) => val.as_object_data(), - - _ => None, - }; - } - fn as_class_data(&self) -> Option> { use Val::*;