From 7717b97027019f7194999cdbc6b13f6520a2dc19 Mon Sep 17 00:00:00 2001 From: relrelb Date: Fri, 21 May 2021 13:02:35 +0300 Subject: [PATCH] avm1: Remove unnecessary calls to create_bare_object In favor of ScriptObject::object and ScriptObject::array, which always succeed. --- core/src/avm1/globals/bitmap_data.rs | 12 +++-- core/src/avm1/globals/context_menu.rs | 6 ++- core/src/avm1/globals/shared_object.rs | 71 ++++++++++++++------------ 3 files changed, 49 insertions(+), 40 deletions(-) diff --git a/core/src/avm1/globals/bitmap_data.rs b/core/src/avm1/globals/bitmap_data.rs index 754f42242..f78530f66 100644 --- a/core/src/avm1/globals/bitmap_data.rs +++ b/core/src/avm1/globals/bitmap_data.rs @@ -408,8 +408,10 @@ pub fn clone<'gc>( ) -> Result, Error<'gc>> { if let Some(bitmap_data) = this.as_bitmap_data_object() { if !bitmap_data.disposed() { - let prototype = activation.context.avm1.prototypes.bitmap_data; - let new_bitmap_data = prototype.create_bare_object(activation, prototype)?; + let new_bitmap_data = BitmapDataObject::empty_object( + activation.context.gc_context, + Some(activation.context.avm1.prototypes.bitmap_data), + ); new_bitmap_data .as_bitmap_data_object() @@ -1132,8 +1134,10 @@ pub fn load_bitmap<'gc>( if let Some(Character::Bitmap(bitmap_object)) = character { if let Some(bitmap) = renderer.get_bitmap_pixels(bitmap_object.bitmap_handle()) { - let prototype = activation.context.avm1.prototypes.bitmap_data; - let new_bitmap_data = prototype.create_bare_object(activation, prototype)?; + let new_bitmap_data = BitmapDataObject::empty_object( + activation.context.gc_context, + Some(activation.context.avm1.prototypes.bitmap_data), + ); let pixels: Vec = bitmap.data.into(); new_bitmap_data diff --git a/core/src/avm1/globals/context_menu.rs b/core/src/avm1/globals/context_menu.rs index 86aa16db6..dd2cbb2eb 100644 --- a/core/src/avm1/globals/context_menu.rs +++ b/core/src/avm1/globals/context_menu.rs @@ -25,8 +25,10 @@ pub fn constructor<'gc>( this.set("onSelect", callback.into(), activation)?; - let prototype = activation.context.avm1.prototypes.object; - let built_in_items = prototype.create_bare_object(activation, prototype)?; + let built_in_items = ScriptObject::object( + activation.context.gc_context, + Some(activation.context.avm1.prototypes.object), + ); built_in_items.set("print", true.into(), activation)?; built_in_items.set("forward_back", true.into(), activation)?; diff --git a/core/src/avm1/globals/shared_object.rs b/core/src/avm1/globals/shared_object.rs index 0a2b9db58..6e90a9596 100644 --- a/core/src/avm1/globals/shared_object.rs +++ b/core/src/avm1/globals/shared_object.rs @@ -4,7 +4,7 @@ use crate::avm1::function::{Executable, FunctionObject}; use crate::avm1::object::shared_object::SharedObject; use crate::avm1::property::Attribute; use crate::avm1::property_decl::{define_properties_on, Declaration}; -use crate::avm1::{AvmString, Object, TObject, Value}; +use crate::avm1::{AvmString, Object, ScriptObject, TObject, Value}; use crate::avm_warn; use crate::display_object::TDisplayObject; use flash_lso::types::Value as AmfValue; @@ -158,21 +158,20 @@ fn deserialize_value<'gc>(activation: &mut Activation<'_, 'gc, '_>, val: &AmfVal } AmfValue::Object(elements, _) => { // Deserialize Object - let obj_proto = activation.context.avm1.prototypes.object; - if let Ok(obj) = obj_proto.create_bare_object(activation, obj_proto) { - for entry in elements { - let value = deserialize_value(activation, entry.value()); - obj.define_value( - activation.context.gc_context, - &entry.name, - value, - Attribute::empty(), - ); - } - obj.into() - } else { - Value::Undefined + let obj = ScriptObject::object( + activation.context.gc_context, + Some(activation.context.avm1.prototypes.object), + ); + for entry in elements { + let value = deserialize_value(activation, entry.value()); + obj.define_value( + activation.context.gc_context, + &entry.name, + value, + Attribute::empty(), + ); } + obj.into() } AmfValue::Date(time, _) => { let date_proto = activation.context.avm1.prototypes.date_constructor; @@ -210,8 +209,10 @@ fn deserialize_lso<'gc>( activation: &mut Activation<'_, 'gc, '_>, lso: &Lso, ) -> Result, Error<'gc>> { - let obj_proto = activation.context.avm1.prototypes.object; - let obj = obj_proto.create_bare_object(activation, obj_proto)?; + let obj = ScriptObject::object( + activation.context.gc_context, + Some(activation.context.avm1.prototypes.object), + ); for child in &lso.body { obj.define_value( @@ -222,7 +223,7 @@ fn deserialize_lso<'gc>( ); } - Ok(obj) + Ok(obj.into()) } /// Deserialize a Json shared object element into a Value @@ -255,21 +256,20 @@ fn deserialize_object_json<'gc>( activation: &mut Activation<'_, 'gc, '_>, ) -> Value<'gc> { // Deserialize Object - let obj_proto = activation.context.avm1.prototypes.object; - if let Ok(obj) = obj_proto.create_bare_object(activation, obj_proto) { - for entry in json_obj.iter() { - let value = recursive_deserialize_json(entry.1.clone(), activation); - obj.define_value( - activation.context.gc_context, - entry.0, - value, - Attribute::empty(), - ); - } - obj.into() - } else { - Value::Undefined + let obj = ScriptObject::object( + activation.context.gc_context, + Some(activation.context.avm1.prototypes.object), + ); + for entry in json_obj.iter() { + let value = recursive_deserialize_json(entry.1.clone(), activation); + obj.define_value( + activation.context.gc_context, + entry.0, + value, + Attribute::empty(), + ); } + obj.into() } /// Deserialize an Array and any children from a JSON object @@ -447,8 +447,11 @@ pub fn get_local<'gc>( if data == Value::Undefined { // No data; create a fresh data object. - let prototype = activation.context.avm1.prototypes.object; - data = prototype.create_bare_object(activation, prototype)?.into(); + data = ScriptObject::object( + activation.context.gc_context, + Some(activation.context.avm1.prototypes.object), + ) + .into(); } this.define_value(