From bf4492c4543c40bf2ef5f116b13181249ca311fb Mon Sep 17 00:00:00 2001 From: David Wendt Date: Sat, 24 Jul 2021 23:30:38 -0400 Subject: [PATCH] avm2: Add the legacy Vector types that old movies can use. This one was rather tough to test, as I actually can't generate ABCs in Animate CC that reference these classes. I instead had to modify a compiled SWF to open the package-internal namespace that these pre-specialized classes exist in. --- core/src/avm2/class.rs | 4 + core/src/avm2/globals/vector.rs | 87 +++++++++++++- core/src/avm2/names.rs | 4 + tests/tests/regression_tests.rs | 1 + tests/tests/swfs/avm2/vector_legacy/Test.as | 34 ++++++ .../tests/swfs/avm2/vector_legacy/output.txt | 10 ++ .../tests/swfs/avm2/vector_legacy/test-0.abc | Bin 0 -> 1846 bytes .../vector_legacy/test-0/Test.class.asasm | 46 ++++++++ .../vector_legacy/test-0/Test.script.asasm | 106 ++++++++++++++++++ .../avm2/vector_legacy/test-0/test-0.main.abc | Bin 0 -> 1846 bytes .../vector_legacy/test-0/test-0.main.asasm | 9 ++ .../test-0/test_fla/MainTimeline.class.asasm | 76 +++++++++++++ .../test-0/test_fla/MainTimeline.script.asasm | 56 +++++++++ tests/tests/swfs/avm2/vector_legacy/test.fla | Bin 0 -> 4061 bytes tests/tests/swfs/avm2/vector_legacy/test.swf | Bin 0 -> 1095 bytes 15 files changed, 431 insertions(+), 2 deletions(-) create mode 100644 tests/tests/swfs/avm2/vector_legacy/Test.as create mode 100644 tests/tests/swfs/avm2/vector_legacy/output.txt create mode 100644 tests/tests/swfs/avm2/vector_legacy/test-0.abc create mode 100644 tests/tests/swfs/avm2/vector_legacy/test-0/Test.class.asasm create mode 100644 tests/tests/swfs/avm2/vector_legacy/test-0/Test.script.asasm create mode 100644 tests/tests/swfs/avm2/vector_legacy/test-0/test-0.main.abc create mode 100644 tests/tests/swfs/avm2/vector_legacy/test-0/test-0.main.asasm create mode 100644 tests/tests/swfs/avm2/vector_legacy/test-0/test_fla/MainTimeline.class.asasm create mode 100644 tests/tests/swfs/avm2/vector_legacy/test-0/test_fla/MainTimeline.script.asasm create mode 100644 tests/tests/swfs/avm2/vector_legacy/test.fla create mode 100644 tests/tests/swfs/avm2/vector_legacy/test.swf diff --git a/core/src/avm2/class.rs b/core/src/avm2/class.rs index 1e8d122c9..f5d18e6fd 100644 --- a/core/src/avm2/class.rs +++ b/core/src/avm2/class.rs @@ -450,6 +450,10 @@ impl<'gc> Class<'gc> { &self.name } + pub fn set_name(&mut self, name: QName<'gc>) { + self.name = name; + } + pub fn super_class_name(&self) -> &Option> { &self.super_class } diff --git a/core/src/avm2/globals/vector.rs b/core/src/avm2/globals/vector.rs index 1ebcb30cd..582953a70 100644 --- a/core/src/avm2/globals/vector.rs +++ b/core/src/avm2/globals/vector.rs @@ -48,10 +48,93 @@ pub fn instance_init<'gc>( /// Implements `Vector`'s class constructor. pub fn class_init<'gc>( - _activation: &mut Activation<'_, 'gc, '_>, - _this: Option>, + activation: &mut Activation<'_, 'gc, '_>, + this: Option>, _args: &[Value<'gc>], ) -> Result, Error> { + if let Some(this) = this { + let mut globals = this.get_scope().map(|s| s.read().globals()).unwrap(); + let mut domain = globals.as_application_domain().unwrap(); + + //We have to grab Object's defining script instead of our own, because + //at this point Vector hasn't actually been defined yet. It doesn't + //matter because we only have one script for our globals. + let (_, script) = domain + .get_defining_script(&QName::new(Namespace::public(), "Object").into())? + .unwrap(); + + let int_class = activation.avm2().classes().int; + let int_vector_class = this.apply(activation, &[int_class.into()])?; + let int_vector_name = QName::new(Namespace::internal(NS_VECTOR), "Vector$int"); + int_vector_class + .as_class() + .unwrap() + .write(activation.context.gc_context) + .set_name(int_vector_name.clone()); + + globals.install_const( + activation.context.gc_context, + int_vector_name.clone(), + 0, + int_vector_class.into(), + false, + ); + domain.export_definition(int_vector_name, script, activation.context.gc_context)?; + + let uint_class = activation.avm2().classes().uint; + let uint_vector_class = this.apply(activation, &[uint_class.into()])?; + let uint_vector_name = QName::new(Namespace::internal(NS_VECTOR), "Vector$uint"); + uint_vector_class + .as_class() + .unwrap() + .write(activation.context.gc_context) + .set_name(uint_vector_name.clone()); + + globals.install_const( + activation.context.gc_context, + uint_vector_name.clone(), + 0, + uint_vector_class.into(), + false, + ); + domain.export_definition(uint_vector_name, script, activation.context.gc_context)?; + + let number_class = activation.avm2().classes().number; + let number_vector_class = this.apply(activation, &[number_class.into()])?; + let number_vector_name = QName::new(Namespace::internal(NS_VECTOR), "Vector$double"); + number_vector_class + .as_class() + .unwrap() + .write(activation.context.gc_context) + .set_name(number_vector_name.clone()); + + globals.install_const( + activation.context.gc_context, + number_vector_name.clone(), + 0, + number_vector_class.into(), + false, + ); + domain.export_definition(number_vector_name, script, activation.context.gc_context)?; + + let object_vector_class = this.apply(activation, &[Value::Null])?; + let object_vector_name = QName::new(Namespace::internal(NS_VECTOR), "Vector$object"); + object_vector_class + .as_class() + .unwrap() + .write(activation.context.gc_context) + .set_name(object_vector_name.clone()); + + globals.install_const( + activation.context.gc_context, + object_vector_name.clone(), + 0, + object_vector_class.into(), + false, + ); + domain.export_definition(object_vector_name, script, activation.context.gc_context)?; + } + Ok(Value::Undefined) } diff --git a/core/src/avm2/names.rs b/core/src/avm2/names.rs index e0b05be3a..fa56201d6 100644 --- a/core/src/avm2/names.rs +++ b/core/src/avm2/names.rs @@ -75,6 +75,10 @@ impl<'gc> Namespace<'gc> { Self::Package(package_name.into()) } + pub fn internal(package_name: impl Into>) -> Self { + Self::PackageInternal(package_name.into()) + } + pub fn private(name: impl Into>) -> Self { Self::Private(name.into()) } diff --git a/tests/tests/regression_tests.rs b/tests/tests/regression_tests.rs index bee9b8f12..31f7b74a3 100644 --- a/tests/tests/regression_tests.rs +++ b/tests/tests/regression_tests.rs @@ -651,6 +651,7 @@ swf_tests! { (as3_vector_splice, "avm2/vector_splice", 1), (as3_vector_tostring, "avm2/vector_tostring", 1), (as3_vector_constr, "avm2/vector_constr", 1), + (as3_vector_legacy, "avm2/vector_legacy", 1), } // TODO: These tests have some inaccuracies currently, so we use approx_eq to test that numeric values are close enough. diff --git a/tests/tests/swfs/avm2/vector_legacy/Test.as b/tests/tests/swfs/avm2/vector_legacy/Test.as new file mode 100644 index 000000000..ac478de35 --- /dev/null +++ b/tests/tests/swfs/avm2/vector_legacy/Test.as @@ -0,0 +1,34 @@ +package { + public class Test { + } +} + +/* NOTE: This is not the actual source to this test. + * + * This is just a tribute. The actual source is in test-0 and this file (as + * well as the accompanying FLA) is provided purely for reference only. + * + * The AS3 compiler in modern versions of Adobe Animate does not allow + * generating references to the package-internal specializations of Vector, so + * this code will yield runtime errors if compiled normally. + * + * Instead, compile the test, disassemble the resulting ABC (using rabcasm), + * and open the PackageInternalNs("__AS3__.vec") namespace in each access to + * the Vector$... classes. After reassembling and running the movie you should + * be able to get debug output (at least in Scout). + */ + +trace("///Vector$int === Vector."); +trace(Vector$int === Vector.); + +trace("///Vector$uint === Vector."); +trace(Vector$uint === Vector.); + +trace("///Vector$double === Vector."); +trace(Vector$double === Vector.); + +trace("///Vector$object === Vector."); +trace(Vector$object === Vector.); + +trace("///Vector$object === Vector.<*>"); +trace(Vector$object === Vector.<*>); \ No newline at end of file diff --git a/tests/tests/swfs/avm2/vector_legacy/output.txt b/tests/tests/swfs/avm2/vector_legacy/output.txt new file mode 100644 index 000000000..1df073f34 --- /dev/null +++ b/tests/tests/swfs/avm2/vector_legacy/output.txt @@ -0,0 +1,10 @@ +///Vector$int === Vector. +true +///Vector$uint === Vector. +true +///Vector$double === Vector. +true +///Vector$object === Vector. +false +///Vector$object === Vector.<*> +true \ No newline at end of file diff --git a/tests/tests/swfs/avm2/vector_legacy/test-0.abc b/tests/tests/swfs/avm2/vector_legacy/test-0.abc new file mode 100644 index 0000000000000000000000000000000000000000..6eef66d53480e40bab18c5aff18116930bde2e02 GIT binary patch literal 1846 zcmb7^>r&fB6o9p>>-vJtZEeiW1Vh55wgPF|n&31gp`|k^Kge|Q!;CH4Yf!6;M_N

tW@iY9T8`iBWcdvfM+T0Hs4!f}0HwOpN!m<@=r>&m=%tvb)UB{}vw`}i&?J~#q zShCT0bGF}Tlwqyb4J?;EH^zpzWR@zG%8w(jrHEZi@xAm3t%G z;}aGj*H-VbKZ<0+V!QTWk4Lx&zE-?<(*JamNKs3_wZooc-3WU+AszW1hn!iEd3VJ; z9x;ozFIlkv|I1pRKJhpUtTwl=nAj}!u%P6dQqp8P_iKKgK#WF zT??0DG7_qvbaE<&*U%f!a^eiTwgYmQ5b%QeZd{xT$8TAV{j0@o-%ASYvW{&LG4~jc zUBIl|3EbE}w9@0YcX22BumuZZ+t6}*4`}%gnog&og#9 z(!lXFghAhq;~OA_O!H->)rY)oPlj06$A`K6@FT5G z`~#N%#YX%NcE)sKP32MT#-rMMTj5dVaD12&ea5>K(RHJy=IJ&yazY!v^*}93LAyZ!qdXD!cIZe zWu(XojP=a~L7FZnX$t4mbbeu~u(*`TPR}f_tj-qK=8T;=_yUaR9gS~b9EmwrWKsg9rW%H%pbU~!Ns=Xuk)lYFhBO6%2ZUrr9+=<4atKpR z49vlabSn?%K!X*G zBBMl-jv_xNw_guYNg8x>rvwi%WT7IU8A#&IP(Ihc*QKqY0%{F|gPnoNq$sZ`vzaiP ZDYKb0n`yJD!u=5~i|bOmof+m~$=|hk9c};s literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/vector_legacy/test-0/Test.class.asasm b/tests/tests/swfs/avm2/vector_legacy/test-0/Test.class.asasm new file mode 100644 index 000000000..72e48bd0c --- /dev/null +++ b/tests/tests/swfs/avm2/vector_legacy/test-0/Test.class.asasm @@ -0,0 +1,46 @@ +class + refid "Test" + instance QName(PackageNamespace(""), "Test") + extends QName(PackageNamespace(""), "Object") + flag SEALED + flag PROTECTEDNS + protectedns ProtectedNamespace("Test") + iinit + name "Test/Test" + refid "Test/instance/init" + body + maxstack 1 + localcount 1 + initscopedepth 4 + maxscopedepth 5 + code + getlocal0 + pushscope + + getlocal0 + constructsuper 0 + + debugfile "I:\\Code\\ruffle\\tests\\tests\\swfs\\avm2\\vector_legacy;;Test.as" + debugline 20 + returnvoid + end ; code + end ; body + end ; method + end ; instance + cinit + name "" + refid "Test/class/init" + body + maxstack 1 + localcount 1 + initscopedepth 3 + maxscopedepth 4 + code + getlocal0 + pushscope + + returnvoid + end ; code + end ; body + end ; method +end ; class diff --git a/tests/tests/swfs/avm2/vector_legacy/test-0/Test.script.asasm b/tests/tests/swfs/avm2/vector_legacy/test-0/Test.script.asasm new file mode 100644 index 000000000..54c1f5db7 --- /dev/null +++ b/tests/tests/swfs/avm2/vector_legacy/test-0/Test.script.asasm @@ -0,0 +1,106 @@ +script + sinit + name "" + refid "Test/init" + body + maxstack 4 + localcount 2 + initscopedepth 1 + maxscopedepth 3 + code + getlocal0 + pushscope + + debugfile "I:\\Code\\ruffle\\tests\\tests\\swfs\\avm2\\vector_legacy;;Test.as" + debugline 2 + findpropstrict Multiname("Test", [PackageNamespace("")]) + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex Multiname("Object", [PackageNamespace(""), PrivateNamespace("Test.as$40"), PackageInternalNs(""), Namespace("http://adobe.com/AS3/2006/builtin")]) + newclass "Test" + popscope + initproperty QName(PackageNamespace(""), "Test") + + debugfile "I:\\Code\\ruffle\\tests\\tests\\swfs\\avm2\\vector_legacy;;Test.as" + debugline 6 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + pushstring "///Vector$int === Vector." + callpropvoid Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + + debugline 7 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + getlex Multiname("Vector$int", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageInternalNs("__AS3__.vec")]) + getlex Multiname("Vector", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageNamespace("__AS3__.vec")]) + getlex Multiname("int", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + applytype 1 + strictequals + callpropvoid Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + + debugline 9 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + pushstring "///Vector$uint === Vector." + callpropvoid Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + + debugline 10 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + getlex Multiname("Vector$uint", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageInternalNs("__AS3__.vec")]) + getlex Multiname("Vector", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageNamespace("__AS3__.vec")]) + getlex Multiname("uint", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + applytype 1 + strictequals + callpropvoid Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + + debugline 12 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + pushstring "///Vector$double === Vector." + callpropvoid Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + + debugline 13 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + getlex Multiname("Vector$double", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageInternalNs("__AS3__.vec")]) + getlex Multiname("Vector", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageNamespace("__AS3__.vec")]) + getlex Multiname("Number", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + applytype 1 + strictequals + callpropvoid Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + + debugline 15 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + pushstring "///Vector$object === Vector." + callpropvoid Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + + debugline 16 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + getlex Multiname("Vector$object", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageInternalNs("__AS3__.vec")]) + getlex Multiname("Vector", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageNamespace("__AS3__.vec")]) + getlex Multiname("Object", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + applytype 1 + strictequals + callpropvoid Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + + debugline 18 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + pushstring "///Vector$object === Vector.<*>" + callpropvoid Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + + debugline 19 + findpropstrict Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]) + getlex Multiname("Vector$object", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageInternalNs("__AS3__.vec")]) + getlex Multiname("Vector", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin"), PackageNamespace("__AS3__.vec")]) + pushnull + applytype 1 + strictequals + callproperty Multiname("trace", [PackageNamespace(""), PrivateNamespace("Test.as$40"), Namespace("http://adobe.com/AS3/2006/builtin")]), 1 + coerce_a + setlocal1 + + getlocal1 + returnvalue + end ; code + end ; body + end ; method + trait class QName(PackageNamespace(""), "Test") + #include "Test.class.asasm" + end ; trait +end ; script diff --git a/tests/tests/swfs/avm2/vector_legacy/test-0/test-0.main.abc b/tests/tests/swfs/avm2/vector_legacy/test-0/test-0.main.abc new file mode 100644 index 0000000000000000000000000000000000000000..6eef66d53480e40bab18c5aff18116930bde2e02 GIT binary patch literal 1846 zcmb7^>r&fB6o9p>>-vJtZEeiW1Vh55wgPF|n&31gp`|k^Kge|Q!;CH4Yf!6;M_N

tW@iY9T8`iBWcdvfM+T0Hs4!f}0HwOpN!m<@=r>&m=%tvb)UB{}vw`}i&?J~#q zShCT0bGF}Tlwqyb4J?;EH^zpzWR@zG%8w(jrHEZi@xAm3t%G z;}aGj*H-VbKZ<0+V!QTWk4Lx&zE-?<(*JamNKs3_wZooc-3WU+AszW1hn!iEd3VJ; z9x;ozFIlkv|I1pRKJhpUtTwl=nAj}!u%P6dQqp8P_iKKgK#WF zT??0DG7_qvbaE<&*U%f!a^eiTwgYmQ5b%QeZd{xT$8TAV{j0@o-%ASYvW{&LG4~jc zUBIl|3EbE}w9@0YcX22BumuZZ+t6}*4`}%gnog&og#9 z(!lXFghAhq;~OA_O!H->)rY)oPlj06$A`K6@FT5G z`~#N%#YX%NcE)sKP32MT#-rMMTj5dVaD12&ea5>K(RHJy=IJ&yazY!v^*}93LAyZ!qdXD!cIZe zWu(XojP=a~L7FZnX$t4mbbeu~u(*`TPR}f_tj-qK=8T;=_yUaR9gS~b9EmwrWKsg9rW%H%pbU~!Ns=Xuk)lYFhBO6%2ZUrr9+=<4atKpR z49vlabSn?%K!X*G zBBMl-jv_xNw_guYNg8x>rvwi%WT7IU8A#&IP(Ihc*QKqY0%{F|gPnoNq$sZ`vzaiP ZDYKb0n`yJD!u=5~i|bOmof+m~$=|hk9c};s literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/vector_legacy/test-0/test-0.main.asasm b/tests/tests/swfs/avm2/vector_legacy/test-0/test-0.main.asasm new file mode 100644 index 000000000..fe88d369c --- /dev/null +++ b/tests/tests/swfs/avm2/vector_legacy/test-0/test-0.main.asasm @@ -0,0 +1,9 @@ +#version 4 +program + minorversion 16 + majorversion 46 + + #include "Test.script.asasm" + #include "test_fla/MainTimeline.script.asasm" + +end ; program diff --git a/tests/tests/swfs/avm2/vector_legacy/test-0/test_fla/MainTimeline.class.asasm b/tests/tests/swfs/avm2/vector_legacy/test-0/test_fla/MainTimeline.class.asasm new file mode 100644 index 000000000..4937fcd36 --- /dev/null +++ b/tests/tests/swfs/avm2/vector_legacy/test-0/test_fla/MainTimeline.class.asasm @@ -0,0 +1,76 @@ +class + refid "test_fla:MainTimeline" + instance QName(PackageNamespace("test_fla"), "MainTimeline") + extends QName(PackageNamespace("flash.display"), "MovieClip") + flag PROTECTEDNS + protectedns ProtectedNamespace("test_fla:MainTimeline") + iinit + name "test_fla:MainTimeline/test_fla:MainTimeline" + refid "test_fla:MainTimeline/instance/init" + body + maxstack 3 + localcount 1 + initscopedepth 10 + maxscopedepth 11 + code + getlocal0 + pushscope + + getlocal0 + constructsuper 0 + + findpropstrict Multiname("addFrameScript", [PrivateNamespace("test_fla:MainTimeline"), PrivateNamespace("$0"), PackageNamespace(""), PackageNamespace("test_fla"), PackageInternalNs("test_fla"), Namespace("http://adobe.com/AS3/2006/builtin"), Namespace("adobe.utils"), PackageNamespace("flash.accessibility"), Namespace("flash.desktop"), PackageNamespace("flash.display"), PackageNamespace("flash.errors"), PackageNamespace("flash.events"), Namespace("flash.external"), PackageNamespace("flash.filters"), PackageNamespace("flash.geom"), Namespace("flash.globalization"), PackageNamespace("flash.media"), PackageNamespace("flash.net"), PackageNamespace("flash.net.drm"), Namespace("flash.printing"), Namespace("flash.profiler"), Namespace("flash.sampler"), Namespace("flash.sensors"), PackageNamespace("flash.system"), PackageNamespace("flash.text"), PackageNamespace("flash.text.ime"), Namespace("flash.text.engine"), PackageNamespace("flash.ui"), PackageNamespace("flash.utils"), Namespace("flash.xml"), ProtectedNamespace("test_fla:MainTimeline"), StaticProtectedNs("test_fla:MainTimeline"), StaticProtectedNs("flash.display:MovieClip"), StaticProtectedNs("flash.display:Sprite"), StaticProtectedNs("flash.display:DisplayObjectContainer"), StaticProtectedNs("flash.display:InteractiveObject"), StaticProtectedNs("flash.display:DisplayObject"), StaticProtectedNs("flash.events:EventDispatcher")]) + debugfile "test_fla.MainTimeline::MainTimeline" + debugline 1 + pushbyte 0 + getlocal0 + getproperty Multiname("frame1", [PrivateNamespace("test_fla:MainTimeline"), PrivateNamespace("$0"), PackageNamespace(""), PackageNamespace("test_fla"), PackageInternalNs("test_fla"), Namespace("http://adobe.com/AS3/2006/builtin"), Namespace("adobe.utils"), PackageNamespace("flash.accessibility"), Namespace("flash.desktop"), PackageNamespace("flash.display"), PackageNamespace("flash.errors"), PackageNamespace("flash.events"), Namespace("flash.external"), PackageNamespace("flash.filters"), PackageNamespace("flash.geom"), Namespace("flash.globalization"), PackageNamespace("flash.media"), PackageNamespace("flash.net"), PackageNamespace("flash.net.drm"), Namespace("flash.printing"), Namespace("flash.profiler"), Namespace("flash.sampler"), Namespace("flash.sensors"), PackageNamespace("flash.system"), PackageNamespace("flash.text"), PackageNamespace("flash.text.ime"), Namespace("flash.text.engine"), PackageNamespace("flash.ui"), PackageNamespace("flash.utils"), Namespace("flash.xml"), ProtectedNamespace("test_fla:MainTimeline"), StaticProtectedNs("test_fla:MainTimeline"), StaticProtectedNs("flash.display:MovieClip"), StaticProtectedNs("flash.display:Sprite"), StaticProtectedNs("flash.display:DisplayObjectContainer"), StaticProtectedNs("flash.display:InteractiveObject"), StaticProtectedNs("flash.display:DisplayObject"), StaticProtectedNs("flash.events:EventDispatcher")]) + callpropvoid Multiname("addFrameScript", [PrivateNamespace("test_fla:MainTimeline"), PrivateNamespace("$0"), PackageNamespace(""), PackageNamespace("test_fla"), PackageInternalNs("test_fla"), Namespace("http://adobe.com/AS3/2006/builtin"), Namespace("adobe.utils"), PackageNamespace("flash.accessibility"), Namespace("flash.desktop"), PackageNamespace("flash.display"), PackageNamespace("flash.errors"), PackageNamespace("flash.events"), Namespace("flash.external"), PackageNamespace("flash.filters"), PackageNamespace("flash.geom"), Namespace("flash.globalization"), PackageNamespace("flash.media"), PackageNamespace("flash.net"), PackageNamespace("flash.net.drm"), Namespace("flash.printing"), Namespace("flash.profiler"), Namespace("flash.sampler"), Namespace("flash.sensors"), PackageNamespace("flash.system"), PackageNamespace("flash.text"), PackageNamespace("flash.text.ime"), Namespace("flash.text.engine"), PackageNamespace("flash.ui"), PackageNamespace("flash.utils"), Namespace("flash.xml"), ProtectedNamespace("test_fla:MainTimeline"), StaticProtectedNs("test_fla:MainTimeline"), StaticProtectedNs("flash.display:MovieClip"), StaticProtectedNs("flash.display:Sprite"), StaticProtectedNs("flash.display:DisplayObjectContainer"), StaticProtectedNs("flash.display:InteractiveObject"), StaticProtectedNs("flash.display:DisplayObject"), StaticProtectedNs("flash.events:EventDispatcher")]), 2 + + debugline 2 + returnvoid + end ; code + end ; body + end ; method + trait method QName(PackageInternalNs("test_fla"), "frame1") + method + name "test_fla:MainTimeline/test_fla:frame1" + refid "test_fla:MainTimeline/instance/test_fla:frame1" + body + maxstack 1 + localcount 1 + initscopedepth 10 + maxscopedepth 11 + code + getlocal0 + pushscope + + debugfile "test_fla.MainTimeline::frame1" + debugline 3 + findpropstrict Multiname("Test", [PrivateNamespace("test_fla:MainTimeline"), PrivateNamespace("$0"), PackageNamespace(""), PackageNamespace("test_fla"), PackageInternalNs("test_fla"), Namespace("http://adobe.com/AS3/2006/builtin"), Namespace("adobe.utils"), PackageNamespace("flash.accessibility"), Namespace("flash.desktop"), PackageNamespace("flash.display"), PackageNamespace("flash.errors"), PackageNamespace("flash.events"), Namespace("flash.external"), PackageNamespace("flash.filters"), PackageNamespace("flash.geom"), Namespace("flash.globalization"), PackageNamespace("flash.media"), PackageNamespace("flash.net"), PackageNamespace("flash.net.drm"), Namespace("flash.printing"), Namespace("flash.profiler"), Namespace("flash.sampler"), Namespace("flash.sensors"), PackageNamespace("flash.system"), PackageNamespace("flash.text"), PackageNamespace("flash.text.ime"), Namespace("flash.text.engine"), PackageNamespace("flash.ui"), PackageNamespace("flash.utils"), Namespace("flash.xml"), ProtectedNamespace("test_fla:MainTimeline"), StaticProtectedNs("test_fla:MainTimeline"), StaticProtectedNs("flash.display:MovieClip"), StaticProtectedNs("flash.display:Sprite"), StaticProtectedNs("flash.display:DisplayObjectContainer"), StaticProtectedNs("flash.display:InteractiveObject"), StaticProtectedNs("flash.display:DisplayObject"), StaticProtectedNs("flash.events:EventDispatcher")]) + constructprop Multiname("Test", [PrivateNamespace("test_fla:MainTimeline"), PrivateNamespace("$0"), PackageNamespace(""), PackageNamespace("test_fla"), PackageInternalNs("test_fla"), Namespace("http://adobe.com/AS3/2006/builtin"), Namespace("adobe.utils"), PackageNamespace("flash.accessibility"), Namespace("flash.desktop"), PackageNamespace("flash.display"), PackageNamespace("flash.errors"), PackageNamespace("flash.events"), Namespace("flash.external"), PackageNamespace("flash.filters"), PackageNamespace("flash.geom"), Namespace("flash.globalization"), PackageNamespace("flash.media"), PackageNamespace("flash.net"), PackageNamespace("flash.net.drm"), Namespace("flash.printing"), Namespace("flash.profiler"), Namespace("flash.sampler"), Namespace("flash.sensors"), PackageNamespace("flash.system"), PackageNamespace("flash.text"), PackageNamespace("flash.text.ime"), Namespace("flash.text.engine"), PackageNamespace("flash.ui"), PackageNamespace("flash.utils"), Namespace("flash.xml"), ProtectedNamespace("test_fla:MainTimeline"), StaticProtectedNs("test_fla:MainTimeline"), StaticProtectedNs("flash.display:MovieClip"), StaticProtectedNs("flash.display:Sprite"), StaticProtectedNs("flash.display:DisplayObjectContainer"), StaticProtectedNs("flash.display:InteractiveObject"), StaticProtectedNs("flash.display:DisplayObject"), StaticProtectedNs("flash.events:EventDispatcher")]), 0 + pop + debugline 4 + returnvoid + end ; code + end ; body + end ; method + end ; trait + end ; instance + cinit + name "" + refid "test_fla:MainTimeline/class/init" + body + maxstack 1 + localcount 1 + initscopedepth 9 + maxscopedepth 10 + code + getlocal0 + pushscope + + returnvoid + end ; code + end ; body + end ; method +end ; class diff --git a/tests/tests/swfs/avm2/vector_legacy/test-0/test_fla/MainTimeline.script.asasm b/tests/tests/swfs/avm2/vector_legacy/test-0/test_fla/MainTimeline.script.asasm new file mode 100644 index 000000000..597226f33 --- /dev/null +++ b/tests/tests/swfs/avm2/vector_legacy/test-0/test_fla/MainTimeline.script.asasm @@ -0,0 +1,56 @@ +script + sinit + name "" + refid "test_fla:MainTimeline/init" + body + maxstack 2 + localcount 1 + initscopedepth 1 + maxscopedepth 9 + code + getlocal0 + pushscope + + getscopeobject 0 + getlex QName(PackageNamespace(""), "Object") + pushscope + + getlex QName(PackageNamespace("flash.events"), "EventDispatcher") + pushscope + + getlex QName(PackageNamespace("flash.display"), "DisplayObject") + pushscope + + getlex QName(PackageNamespace("flash.display"), "InteractiveObject") + pushscope + + getlex QName(PackageNamespace("flash.display"), "DisplayObjectContainer") + pushscope + + getlex QName(PackageNamespace("flash.display"), "Sprite") + pushscope + + getlex QName(PackageNamespace("flash.display"), "MovieClip") + pushscope + + getlex QName(PackageNamespace("flash.display"), "MovieClip") + newclass "test_fla:MainTimeline" + popscope + popscope + popscope + popscope + popscope + popscope + popscope + initproperty QName(PackageNamespace("test_fla"), "MainTimeline") + + debugfile "I:\\Code\\ruffle\\tests\\tests\\swfs\\avm2\\vector_legacy\\" + debugline 24 + returnvoid + end ; code + end ; body + end ; method + trait class QName(PackageNamespace("test_fla"), "MainTimeline") slotid 1 + #include "MainTimeline.class.asasm" + end ; trait +end ; script diff --git a/tests/tests/swfs/avm2/vector_legacy/test.fla b/tests/tests/swfs/avm2/vector_legacy/test.fla new file mode 100644 index 0000000000000000000000000000000000000000..d81dc7a66bb9e075064e3286353f927dd6094a55 GIT binary patch literal 4061 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 KzmGoy0R9iCP=M$F literal 0 HcmV?d00001 diff --git a/tests/tests/swfs/avm2/vector_legacy/test.swf b/tests/tests/swfs/avm2/vector_legacy/test.swf new file mode 100644 index 0000000000000000000000000000000000000000..90a0a29ee69d90d7fed04bff2dad3096e912b478 GIT binary patch literal 1095 zcmV-N1i1S{S5pkT2LJ$g+Lcw?cG^Z1of+M^W3a&ZhGW@@F9rG1q{Xq5_?9|dsUOH{ z^MDr!7>rsWu_WQzdF(gz1Ns5|hx`J4=zriZaE~n6K;ovWTDqKl_L-w|_KZfCh^rzL z{{x{cMu$leA#^})Zf^E72+b#YQ_6;7eXnf)RDO2U{@|W$?zbJ&&`w+0o2H6BPKF^K zqjH0qG{1q+$MlZiIp9d3g7-K^>^thXJ13>efz_lHyVq(NwBmx#3GU9XEvKSgbT%s& zwBcHI)u88E<7#Ke8(7dB{v7AO&YFNUzNA2)dGy=TejAr z8{%CcQBQ2|tuKaj;3>{de3q4aiesn=i*W)y|(Wds+|ChCrJTYBr zYYkVwpnm$usG!nY>q4gohTi3UdH8bI)?FG3W<%LlCC@B+H{Nd{Iwo;wsAY6am+*)H zF|FA=_NJ@cu=TDR)|ytG7J9C3I4PJqr(Mt*4eB_0T{m?1D(d^1)cM7=x_8LeXnG8l z#*|aOz}>4lKOXd%KACa;UZC{2-`6SPJE?73wsQx(S#xGaLFtp3j0NN+yxY`_pu?7K z0Cqw?I;U1A5a-;m>YAZ{&|KXz!@jRWo4O|Xwn^RSy;W%1oghDyXu7(2eh)2p1+{}% zN9%M)5H+1)56+e2(oRr`3w0)kW`UaLAY^RB1FK2&VNVb0yPe#izRQlW(01K!saW)9 zzF~EW@F5pBRrP7H-h;k%lYv?n?>^?j=prqR?E$m@660?NYY*-l#Rt7h{}JnF~{FPjgRe3|+ zl%L7p$R&A4exAV@K1*^+ZYj5%dz^ccTg!0*gIR`!YjHUwVP0Uua)e~KXm%==o1Td$ zk`uFY^QrtoT3mawvix{y6=N@Y5^j%}oOFmK$bne_6M;+$d|D!mG)ts;Mj&y4Bm|NY zNJik2f*?pTmRLA>iLlZ%k!FZAMG7wV%5dk9P8Brk8KqLYp4n)*55*ey6O5&hUpdR*P*}dL{7kxjIlv0)w=$;^84zGO3~U^l zcr{?ogf{|O8L;5y2_#tSs}y;C#nf6ztwq#YSgl3X8VBclJnJ8A{(54Ng&{9exj^Oz N*ED(w%s)&`IkQ)AC4&F} literal 0 HcmV?d00001