From 9079b699916c1bc73660cbffbfc3b0a4ff642b82 Mon Sep 17 00:00:00 2001 From: Mike Welsh Date: Wed, 18 Dec 2019 13:34:19 -0800 Subject: [PATCH] avm1: Push Undefined when trying to construct invalid object --- core/src/avm1.rs | 51 ++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/core/src/avm1.rs b/core/src/avm1.rs index f732b867e..3878a238f 100644 --- a/core/src/avm1.rs +++ b/core/src/avm1.rs @@ -1682,27 +1682,40 @@ impl<'gc> Avm1<'gc> { args.push(self.pop()?); } - let constructor = self - .stack_frames - .last() - .unwrap() - .clone() - .read() - .resolve(fn_name.as_string()?, self, context)? - .resolve(self, context)? - .as_object()?; - let prototype = constructor - .get("prototype", self, context)? - .resolve(self, context)? - .as_object()?; + let mut ret = Value::Undefined; - let this = prototype.new(self, context, prototype, &args)?; + if let Ok(fn_name) = fn_name.as_string() { + if let Ok(constructor) = self + .stack_frames + .last() + .unwrap() + .clone() + .read() + .resolve(fn_name, self, context)? + .resolve(self, context)? + .as_object() + { + if let Ok(prototype) = constructor + .get("prototype", self, context)? + .resolve(self, context)? + .as_object() + { + let this = prototype.new(self, context, prototype, &args)?; + constructor + .call(self, context, this, &args)? + .resolve(self, context)?; + ret = this.into(); + } else { + log::warn!("NewObject: Constructor has invalid prototype: {}", fn_name); + } + } else { + log::warn!("NewObject: Object is not a function: {}", fn_name); + } + } else { + log::warn!("NewObject: Expected String for object name: {:?}", fn_name); + } - constructor - .call(self, context, this, &args)? - .resolve(self, context)?; - - self.push(this); + self.push(ret); Ok(()) }