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.
This commit is contained in:
David Wendt 2021-07-24 23:30:38 -04:00 committed by kmeisthax
parent dcf6d87363
commit bf4492c454
15 changed files with 431 additions and 2 deletions

View File

@ -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<Multiname<'gc>> {
&self.super_class
}

View File

@ -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<Object<'gc>>,
activation: &mut Activation<'_, 'gc, '_>,
this: Option<Object<'gc>>,
_args: &[Value<'gc>],
) -> Result<Value<'gc>, 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)
}

View File

@ -75,6 +75,10 @@ impl<'gc> Namespace<'gc> {
Self::Package(package_name.into())
}
pub fn internal(package_name: impl Into<AvmString<'gc>>) -> Self {
Self::PackageInternal(package_name.into())
}
pub fn private(name: impl Into<AvmString<'gc>>) -> Self {
Self::Private(name.into())
}

View File

@ -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.

View File

@ -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.<int>");
trace(Vector$int === Vector.<int>);
trace("///Vector$uint === Vector.<uint>");
trace(Vector$uint === Vector.<uint>);
trace("///Vector$double === Vector.<Number>");
trace(Vector$double === Vector.<Number>);
trace("///Vector$object === Vector.<Object>");
trace(Vector$object === Vector.<Object>);
trace("///Vector$object === Vector.<*>");
trace(Vector$object === Vector.<*>);

View File

@ -0,0 +1,10 @@
///Vector$int === Vector.<int>
true
///Vector$uint === Vector.<uint>
true
///Vector$double === Vector.<Number>
true
///Vector$object === Vector.<Object>
false
///Vector$object === Vector.<*>
true

Binary file not shown.

View File

@ -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

View File

@ -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.<int>"
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.<uint>"
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.<Number>"
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.<Object>"
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

View File

@ -0,0 +1,9 @@
#version 4
program
minorversion 16
majorversion 46
#include "Test.script.asasm"
#include "test_fla/MainTimeline.script.asasm"
end ; program

View File

@ -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

View File

@ -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

Binary file not shown.

Binary file not shown.