From 49bee3fe5c503feaadbccf84e1a9fcd12f0ef4f1 Mon Sep 17 00:00:00 2001 From: CUB3D Date: Mon, 27 Jul 2020 17:20:49 +0100 Subject: [PATCH] core: Implement Object() function --- core/src/avm1/globals/object.rs | 24 +++++++++++++++--- core/tests/regression_tests.rs | 1 + .../swfs/avm1/object_function/output.txt | 6 +++++ core/tests/swfs/avm1/object_function/test.fla | Bin 0 -> 4458 bytes core/tests/swfs/avm1/object_function/test.swf | Bin 0 -> 653 bytes 5 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 core/tests/swfs/avm1/object_function/output.txt create mode 100644 core/tests/swfs/avm1/object_function/test.fla create mode 100644 core/tests/swfs/avm1/object_function/test.swf diff --git a/core/src/avm1/globals/object.rs b/core/src/avm1/globals/object.rs index 5a486edcf..2ffb4b997 100644 --- a/core/src/avm1/globals/object.rs +++ b/core/src/avm1/globals/object.rs @@ -3,7 +3,7 @@ use crate::avm1::activation::Activation; use crate::avm1::error::Error; use crate::avm1::function::{Executable, FunctionObject}; use crate::avm1::property::Attribute::{self, *}; -use crate::avm1::{Object, TObject, UpdateContext, Value}; +use crate::avm1::{Object, ScriptObject, TObject, UpdateContext, Value}; use crate::avm_warn; use crate::character::Character; use crate::display_object::TDisplayObject; @@ -11,7 +11,7 @@ use enumset::EnumSet; use gc_arena::MutationContext; use std::borrow::Cow; -/// Implements `Object` +/// Implements `Object` constructor pub fn constructor<'gc>( _activation: &mut Activation<'_, 'gc>, _action_context: &mut UpdateContext<'_, 'gc, '_>, @@ -21,6 +21,23 @@ pub fn constructor<'gc>( Ok(Value::Undefined) } +/// Implements `Object` function +pub fn object_function<'gc>( + activation: &mut Activation<'_, 'gc>, + action_context: &mut UpdateContext<'_, 'gc, '_>, + _this: Object<'gc>, + args: &[Value<'gc>], +) -> Result, Error<'gc>> { + if let Some(val) = args.get(0) { + Ok(val.coerce_to_object(activation, action_context).into()) + } else { + //TODO: more testing + Ok(Value::Undefined + .coerce_to_object(activation, action_context) + .into()) + } +} + /// Implements `Object.prototype.addProperty` pub fn add_property<'gc>( activation: &mut Activation<'_, 'gc>, @@ -372,8 +389,9 @@ pub fn create_object_object<'gc>( proto: Object<'gc>, fn_proto: Object<'gc>, ) -> Object<'gc> { - let object_function = FunctionObject::constructor( + let object_function = FunctionObject::function_and_constructor( gc_context, + Executable::Native(object_function), Executable::Native(constructor), Some(fn_proto), Some(proto), diff --git a/core/tests/regression_tests.rs b/core/tests/regression_tests.rs index 2fbc994dd..9a9695b8e 100644 --- a/core/tests/regression_tests.rs +++ b/core/tests/regression_tests.rs @@ -235,6 +235,7 @@ swf_tests! { (global_array, "avm1/global_array", 1), (array_constructor, "avm1/array_constructor", 1), (array_apply, "avm1/array_constructor", 1), + (object_function, "avm1/object_function", 1), (as3_hello_world, "avm2/hello_world", 1), (as3_function_call, "avm2/function_call", 1), (as3_function_call_via_call, "avm2/function_call_via_call", 1), diff --git a/core/tests/swfs/avm1/object_function/output.txt b/core/tests/swfs/avm1/object_function/output.txt new file mode 100644 index 000000000..b386d1514 --- /dev/null +++ b/core/tests/swfs/avm1/object_function/output.txt @@ -0,0 +1,6 @@ +[type Object] +Test +[object Object] +[type Function] +11234 +[type Object] diff --git a/core/tests/swfs/avm1/object_function/test.fla b/core/tests/swfs/avm1/object_function/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..1737a9d1e96a1c377bcedf987ef9e985060da0ca GIT binary patch literal 4458 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 TkbW0Y;13W!G*`a=9Rc`1QvQQa literal 0 HcmV?d00001 diff --git a/core/tests/swfs/avm1/object_function/test.swf b/core/tests/swfs/avm1/object_function/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..cb0db3bbb8672e37d0c81eee522b63731a91a4fa GIT binary patch literal 653 zcmV;80&@LBS5prO1^@tfoTZdcZ__Xs#@$WjkA&C|m)(fEip!KZPPcB2+Ctm3q7r4O zbP_k@ChnS%#F6c;tq|hM6$$mS3m3iv2R;Nx&Pbg32*c^pKkLdEBT^Lm&GYz&BGxWlXRLx0xFXmj+5S$8FjZg;XlW4*YP64Y-CK+9sM!eK^1& zM4ApGjue>{MzEl)MX6UTMJlD{Vcu1qGuk1XOFZ_J%8RU`D(#-@Im-4P%ELwH9E(`; zEgHI^tNN~L?6%Ohsprfcw520c*XO)v$}?+&2<%{imzWVUkuh&Rr;Y8@aXZ5+nP*BR z4;PZWTDFcojW+BtZ`?1(hQuR22?Uq%qH(;AZFVU0u_)p&^jsT9KsZo&m)fuU_?W1j zDC#_%39q{(xwA&&@`n39oT#~IlFsF7-WrAkHVLOaW)msjj1NqsVb%jKaA1?VRg?wI zbsaNTGcp;JE$dlJua*$XW%tTeYr9f1YSnUPr#8<1ymdmesNIWli)qe3(B`ZY+CFm+ zU3p}eQLU>{mmsEVCCoi0PK{B2+=UP`PNJj=sYz5(Oyhh_cS%ftUBU(HgyvjlLl>+Q z8vUP`{)kYfjhW@N{7A$25-cj9vT}NQ`as@~X_S7}PqU2n)Ecs5p&zxM92}vbWK<{u z-`3dMpT9oed09XC^5(<$gRdVSt&ZfK`u;9h0sHMEVhhkBT!7JSa0A58Xa(E?g@@56 nF-n4)iMiUGtg`U$BpKTmEOPo|>tZ