avm1: Remove unnecessary calls to create_bare_object

In favor of ScriptObject::object and ScriptObject::array, which
always succeed.
This commit is contained in:
relrelb 2021-05-21 13:02:35 +03:00 committed by Mike Welsh
parent aeb8902f8c
commit 7717b97027
3 changed files with 49 additions and 40 deletions

View File

@ -408,8 +408,10 @@ pub fn clone<'gc>(
) -> Result<Value<'gc>, Error<'gc>> { ) -> Result<Value<'gc>, Error<'gc>> {
if let Some(bitmap_data) = this.as_bitmap_data_object() { if let Some(bitmap_data) = this.as_bitmap_data_object() {
if !bitmap_data.disposed() { if !bitmap_data.disposed() {
let prototype = activation.context.avm1.prototypes.bitmap_data; let new_bitmap_data = BitmapDataObject::empty_object(
let new_bitmap_data = prototype.create_bare_object(activation, prototype)?; activation.context.gc_context,
Some(activation.context.avm1.prototypes.bitmap_data),
);
new_bitmap_data new_bitmap_data
.as_bitmap_data_object() .as_bitmap_data_object()
@ -1132,8 +1134,10 @@ pub fn load_bitmap<'gc>(
if let Some(Character::Bitmap(bitmap_object)) = character { if let Some(Character::Bitmap(bitmap_object)) = character {
if let Some(bitmap) = renderer.get_bitmap_pixels(bitmap_object.bitmap_handle()) { if let Some(bitmap) = renderer.get_bitmap_pixels(bitmap_object.bitmap_handle()) {
let prototype = activation.context.avm1.prototypes.bitmap_data; let new_bitmap_data = BitmapDataObject::empty_object(
let new_bitmap_data = prototype.create_bare_object(activation, prototype)?; activation.context.gc_context,
Some(activation.context.avm1.prototypes.bitmap_data),
);
let pixels: Vec<i32> = bitmap.data.into(); let pixels: Vec<i32> = bitmap.data.into();
new_bitmap_data new_bitmap_data

View File

@ -25,8 +25,10 @@ pub fn constructor<'gc>(
this.set("onSelect", callback.into(), activation)?; this.set("onSelect", callback.into(), activation)?;
let prototype = activation.context.avm1.prototypes.object; let built_in_items = ScriptObject::object(
let built_in_items = prototype.create_bare_object(activation, prototype)?; activation.context.gc_context,
Some(activation.context.avm1.prototypes.object),
);
built_in_items.set("print", true.into(), activation)?; built_in_items.set("print", true.into(), activation)?;
built_in_items.set("forward_back", true.into(), activation)?; built_in_items.set("forward_back", true.into(), activation)?;

View File

@ -4,7 +4,7 @@ use crate::avm1::function::{Executable, FunctionObject};
use crate::avm1::object::shared_object::SharedObject; use crate::avm1::object::shared_object::SharedObject;
use crate::avm1::property::Attribute; use crate::avm1::property::Attribute;
use crate::avm1::property_decl::{define_properties_on, Declaration}; 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::avm_warn;
use crate::display_object::TDisplayObject; use crate::display_object::TDisplayObject;
use flash_lso::types::Value as AmfValue; use flash_lso::types::Value as AmfValue;
@ -158,8 +158,10 @@ fn deserialize_value<'gc>(activation: &mut Activation<'_, 'gc, '_>, val: &AmfVal
} }
AmfValue::Object(elements, _) => { AmfValue::Object(elements, _) => {
// Deserialize Object // Deserialize Object
let obj_proto = activation.context.avm1.prototypes.object; let obj = ScriptObject::object(
if let Ok(obj) = obj_proto.create_bare_object(activation, obj_proto) { activation.context.gc_context,
Some(activation.context.avm1.prototypes.object),
);
for entry in elements { for entry in elements {
let value = deserialize_value(activation, entry.value()); let value = deserialize_value(activation, entry.value());
obj.define_value( obj.define_value(
@ -170,9 +172,6 @@ fn deserialize_value<'gc>(activation: &mut Activation<'_, 'gc, '_>, val: &AmfVal
); );
} }
obj.into() obj.into()
} else {
Value::Undefined
}
} }
AmfValue::Date(time, _) => { AmfValue::Date(time, _) => {
let date_proto = activation.context.avm1.prototypes.date_constructor; let date_proto = activation.context.avm1.prototypes.date_constructor;
@ -210,8 +209,10 @@ fn deserialize_lso<'gc>(
activation: &mut Activation<'_, 'gc, '_>, activation: &mut Activation<'_, 'gc, '_>,
lso: &Lso, lso: &Lso,
) -> Result<Object<'gc>, Error<'gc>> { ) -> Result<Object<'gc>, Error<'gc>> {
let obj_proto = activation.context.avm1.prototypes.object; let obj = ScriptObject::object(
let obj = obj_proto.create_bare_object(activation, obj_proto)?; activation.context.gc_context,
Some(activation.context.avm1.prototypes.object),
);
for child in &lso.body { for child in &lso.body {
obj.define_value( 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 /// Deserialize a Json shared object element into a Value
@ -255,8 +256,10 @@ fn deserialize_object_json<'gc>(
activation: &mut Activation<'_, 'gc, '_>, activation: &mut Activation<'_, 'gc, '_>,
) -> Value<'gc> { ) -> Value<'gc> {
// Deserialize Object // Deserialize Object
let obj_proto = activation.context.avm1.prototypes.object; let obj = ScriptObject::object(
if let Ok(obj) = obj_proto.create_bare_object(activation, obj_proto) { activation.context.gc_context,
Some(activation.context.avm1.prototypes.object),
);
for entry in json_obj.iter() { for entry in json_obj.iter() {
let value = recursive_deserialize_json(entry.1.clone(), activation); let value = recursive_deserialize_json(entry.1.clone(), activation);
obj.define_value( obj.define_value(
@ -267,9 +270,6 @@ fn deserialize_object_json<'gc>(
); );
} }
obj.into() obj.into()
} else {
Value::Undefined
}
} }
/// Deserialize an Array and any children from a JSON object /// Deserialize an Array and any children from a JSON object
@ -447,8 +447,11 @@ pub fn get_local<'gc>(
if data == Value::Undefined { if data == Value::Undefined {
// No data; create a fresh data object. // No data; create a fresh data object.
let prototype = activation.context.avm1.prototypes.object; data = ScriptObject::object(
data = prototype.create_bare_object(activation, prototype)?.into(); activation.context.gc_context,
Some(activation.context.avm1.prototypes.object),
)
.into();
} }
this.define_value( this.define_value(