diff --git a/storage/src/storage_ptr.rs b/storage/src/storage_ptr.rs index 44a27cf..2fbccac 100644 --- a/storage/src/storage_ptr.rs +++ b/storage/src/storage_ptr.rs @@ -14,10 +14,7 @@ pub struct StoragePtr { impl Clone for StoragePtr { fn clone(&self) -> Self { - Self { - _marker: std::marker::PhantomData, - data: self.data, - } + *self } } diff --git a/valuescript_vm/src/array_higher_functions/array_mapping_frame.rs b/valuescript_vm/src/array_higher_functions/array_mapping_frame.rs index a4d66bf..7f06ecd 100644 --- a/valuescript_vm/src/array_higher_functions/array_mapping_frame.rs +++ b/valuescript_vm/src/array_higher_functions/array_mapping_frame.rs @@ -146,6 +146,10 @@ impl StackFrameTrait for ArrayMappingFrame { panic!("Not appropriate for MapFrame") } + fn can_catch_exception(&self, _exception: &Val) -> bool { + false + } + fn catch_exception(&mut self, _exception: &mut Val) {} fn clone_to_stack_frame(&self) -> StackFrame { diff --git a/valuescript_vm/src/array_higher_functions/array_reduce.rs b/valuescript_vm/src/array_higher_functions/array_reduce.rs index f55a1f8..afcd039 100644 --- a/valuescript_vm/src/array_higher_functions/array_reduce.rs +++ b/valuescript_vm/src/array_higher_functions/array_reduce.rs @@ -111,6 +111,10 @@ impl StackFrameTrait for ReduceFrame { panic!("Not appropriate for ReduceFrame") } + fn can_catch_exception(&self, _exception: &Val) -> bool { + false + } + fn catch_exception(&mut self, _exception: &mut Val) {} fn clone_to_stack_frame(&self) -> StackFrame { diff --git a/valuescript_vm/src/array_higher_functions/array_reduce_right.rs b/valuescript_vm/src/array_higher_functions/array_reduce_right.rs index a2e41e6..d0daadb 100644 --- a/valuescript_vm/src/array_higher_functions/array_reduce_right.rs +++ b/valuescript_vm/src/array_higher_functions/array_reduce_right.rs @@ -124,6 +124,10 @@ impl StackFrameTrait for ReduceRightFrame { panic!("Not appropriate for ReduceRightFrame") } + fn can_catch_exception(&self, _exception: &Val) -> bool { + false + } + fn catch_exception(&mut self, _exception: &mut Val) {} fn clone_to_stack_frame(&self) -> StackFrame { diff --git a/valuescript_vm/src/array_higher_functions/array_sort.rs b/valuescript_vm/src/array_higher_functions/array_sort.rs index ecaee53..9988e42 100644 --- a/valuescript_vm/src/array_higher_functions/array_sort.rs +++ b/valuescript_vm/src/array_higher_functions/array_sort.rs @@ -305,6 +305,10 @@ impl StackFrameTrait for SortFrame { panic!("Not appropriate for SortFrame") } + fn can_catch_exception(&self, _exception: &Val) -> bool { + false + } + fn catch_exception(&mut self, _exception: &mut Val) {} fn clone_to_stack_frame(&self) -> StackFrame { diff --git a/valuescript_vm/src/bytecode_stack_frame.rs b/valuescript_vm/src/bytecode_stack_frame.rs index 4d9a585..dbf91b9 100644 --- a/valuescript_vm/src/bytecode_stack_frame.rs +++ b/valuescript_vm/src/bytecode_stack_frame.rs @@ -709,6 +709,10 @@ impl StackFrameTrait for BytecodeStackFrame { panic!("Not appropriate for BytecodeStackFrame") } + fn can_catch_exception(&self, _exception: &Val) -> bool { + self.catch_setting.is_some() + } + fn catch_exception(&mut self, exception: &mut Val) { if let Some(catch_setting) = &self.catch_setting { let exception = take(exception); diff --git a/valuescript_vm/src/cat_stack_frame.rs b/valuescript_vm/src/cat_stack_frame.rs index 299b897..ecd4646 100644 --- a/valuescript_vm/src/cat_stack_frame.rs +++ b/valuescript_vm/src/cat_stack_frame.rs @@ -145,6 +145,10 @@ impl StackFrameTrait for CatStackFrame { panic!("Not appropriate for CatStackFrame"); } + fn can_catch_exception(&self, _exception: &Val) -> bool { + false + } + fn catch_exception(&mut self, _exception: &mut Val) {} fn clone_to_stack_frame(&self) -> StackFrame { diff --git a/valuescript_vm/src/first_stack_frame.rs b/valuescript_vm/src/first_stack_frame.rs index 02a4664..740c2d9 100644 --- a/valuescript_vm/src/first_stack_frame.rs +++ b/valuescript_vm/src/first_stack_frame.rs @@ -19,6 +19,12 @@ impl FirstStackFrame { } } +impl Default for FirstStackFrame { + fn default() -> Self { + Self::new() + } +} + impl StackFrameTrait for FirstStackFrame { fn write_this(&mut self, _const: bool, _this: Val) -> Result<(), Val> { panic!("Not appropriate for FirstStackFrame"); @@ -41,6 +47,10 @@ impl StackFrameTrait for FirstStackFrame { self.call_result.clone() } + fn can_catch_exception(&self, _exception: &Val) -> bool { + panic!("Not appropriate for FirstStackFrame"); + } + fn catch_exception(&mut self, _exception: &mut Val) { panic!("Not appropriate for FirstStackFrame"); } diff --git a/valuescript_vm/src/generator.rs b/valuescript_vm/src/generator.rs index 08715c3..020b93d 100644 --- a/valuescript_vm/src/generator.rs +++ b/valuescript_vm/src/generator.rs @@ -230,6 +230,10 @@ impl StackFrameTrait for GeneratorFrame { panic!("Not appropriate for GeneratorFrame") } + fn can_catch_exception(&self, exception: &Val) -> bool { + self.generator.frame.can_catch_exception(exception) + } + fn catch_exception(&mut self, exception: &mut Val) { self.generator.frame.catch_exception(exception) } @@ -343,6 +347,10 @@ impl StackFrameTrait for YieldStarFrame { panic!("Not appropriate for YieldStarFrame") } + fn can_catch_exception(&self, _exception: &Val) -> bool { + false + } + fn catch_exception(&mut self, _exception: &mut Val) {} fn clone_to_stack_frame(&self) -> StackFrame { diff --git a/valuescript_vm/src/make_generator_frame.rs b/valuescript_vm/src/make_generator_frame.rs index 2ae1844..a447362 100644 --- a/valuescript_vm/src/make_generator_frame.rs +++ b/valuescript_vm/src/make_generator_frame.rs @@ -50,6 +50,10 @@ impl StackFrameTrait for MakeGeneratorFrame { panic!("Not appropriate for MakeGeneratorFrame") } + fn can_catch_exception(&self, _exception: &Val) -> bool { + panic!("Not appropriate for MakeGeneratorFrame"); + } + fn catch_exception(&mut self, _exception: &mut Val) { panic!("Not appropriate for MakeGeneratorFrame"); } diff --git a/valuescript_vm/src/stack_frame.rs b/valuescript_vm/src/stack_frame.rs index b9499ce..7825877 100644 --- a/valuescript_vm/src/stack_frame.rs +++ b/valuescript_vm/src/stack_frame.rs @@ -24,6 +24,7 @@ pub trait StackFrameTrait { fn step(&mut self) -> FrameStepResult; fn apply_call_result(&mut self, call_result: CallResult); fn get_call_result(&mut self) -> CallResult; + fn can_catch_exception(&self, exception: &Val) -> bool; fn catch_exception(&mut self, exception: &mut Val); fn clone_to_stack_frame(&self) -> StackFrame; } @@ -63,6 +64,10 @@ impl StackFrameTrait for VoidStackFrame { } } + fn can_catch_exception(&self, _exception: &Val) -> bool { + false + } + fn catch_exception(&mut self, _exception: &mut Val) {} fn clone_to_stack_frame(&self) -> StackFrame { diff --git a/valuescript_vm/src/virtual_machine.rs b/valuescript_vm/src/virtual_machine.rs index 0657c0b..66a9894 100644 --- a/valuescript_vm/src/virtual_machine.rs +++ b/valuescript_vm/src/virtual_machine.rs @@ -119,9 +119,8 @@ impl VirtualMachine { pub fn handle_exception(&mut self, mut exception: Val) -> Result<(), Val> { while !self.stack.is_empty() { - self.frame.catch_exception(&mut exception); - - if let Val::Void = exception { + if self.frame.can_catch_exception(&exception) { + self.frame.catch_exception(&mut exception); return Ok(()); }