diff --git a/core/src/avm2.rs b/core/src/avm2.rs index 3613aa666..82e924f52 100644 --- a/core/src/avm2.rs +++ b/core/src/avm2.rs @@ -730,11 +730,12 @@ impl<'gc> Avm2<'gc> { index: Index, ) -> Result<(), Error> { let multiname = self.pool_multiname(index)?; - let result = if let Some(scope) = self.current_stack_frame().unwrap().read().scope() { - scope.read().find(&multiname, self, context)? - } else { - None - }; + let result = self + .current_stack_frame() + .unwrap() + .read() + .scope() + .and_then(|scope| scope.read().find(&multiname, self, context)); self.push(result.map(|o| o.into()).unwrap_or(Value::Undefined)); @@ -747,12 +748,12 @@ impl<'gc> Avm2<'gc> { index: Index, ) -> Result<(), Error> { let multiname = self.pool_multiname(index)?; - let found: Result, Error> = - if let Some(scope) = self.current_stack_frame().unwrap().read().scope() { - scope.read().find(&multiname, self, context)? - } else { - None - } + let found: Result, Error> = self + .current_stack_frame() + .unwrap() + .read() + .scope() + .and_then(|scope| scope.read().find(&multiname, self, context)) .ok_or_else(|| format!("Property does not exist: {:?}", multiname.local_name()).into()); let result: Value<'gc> = found?.into(); @@ -767,13 +768,14 @@ impl<'gc> Avm2<'gc> { index: Index, ) -> Result<(), Error> { let multiname = self.pool_multiname_static(index)?; - let found: Result, Error> = - if let Some(scope) = self.current_stack_frame().unwrap().read().scope() { - Ok(scope.read().resolve(&multiname, self, context)?) - } else { - Err("No objects exist on scope".into()) - }; - let result: Value<'gc> = found?.resolve(self, context)?; + let found: Result, Error>, Error> = self + .current_stack_frame() + .unwrap() + .read() + .scope() + .and_then(|scope| scope.read().resolve(&multiname, self, context)) + .ok_or_else(|| format!("Property does not exist: {:?}", multiname.local_name()).into()); + let result: Value<'gc> = found??.resolve(self, context)?; self.push(result); diff --git a/core/src/avm2/scope.rs b/core/src/avm2/scope.rs index 585dfcad2..3fb8a7db6 100644 --- a/core/src/avm2/scope.rs +++ b/core/src/avm2/scope.rs @@ -3,7 +3,6 @@ use crate::avm2::names::Multiname; use crate::avm2::object::{Object, TObject}; use crate::avm2::return_value::ReturnValue; -use crate::avm2::value::Value; use crate::avm2::{Avm2, Error}; use crate::context::UpdateContext; use gc_arena::{Collect, GcCell, MutationContext}; @@ -96,15 +95,17 @@ impl<'gc> Scope<'gc> { } /// Find an object that contains a given property in the scope stack. + /// + /// This function yields `None` if no such scope exists. pub fn find( &self, name: &Multiname, avm: &mut Avm2<'gc>, context: &mut UpdateContext<'_, 'gc, '_>, - ) -> Result>, Error> { + ) -> Option> { if let Some(qname) = self.locals().resolve_multiname(name) { if self.locals().has_property(&qname) { - return Ok(Some(*self.locals())); + return Some(*self.locals()); } } @@ -112,20 +113,22 @@ impl<'gc> Scope<'gc> { return scope.find(name, avm, context); } - //TODO: This should actually be an error. - Ok(None) + None } /// Resolve a particular value in the scope chain. + /// + /// This function yields `None` if no such scope exists to provide the + /// property's value. pub fn resolve( &self, name: &Multiname, avm: &mut Avm2<'gc>, context: &mut UpdateContext<'_, 'gc, '_>, - ) -> Result, Error> { + ) -> Option, Error>> { if let Some(qname) = self.locals().resolve_multiname(name) { if self.locals().has_property(&qname) { - return self.locals().get_property(&qname, avm, context); + return Some(self.locals().get_property(&qname, avm, context)); } } @@ -134,6 +137,6 @@ impl<'gc> Scope<'gc> { } //TODO: Should undefined variables halt execution? - Ok(Value::Undefined.into()) + None } }