diff --git a/Assembly-CSharp-Editor.csproj b/Assembly-CSharp-Editor.csproj index 7d33f70..8db068a 100644 --- a/Assembly-CSharp-Editor.csproj +++ b/Assembly-CSharp-Editor.csproj @@ -49,6 +49,8 @@ + + @@ -61,7 +63,7 @@ - + diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2.meta b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2.meta new file mode 100644 index 0000000..4fea13c --- /dev/null +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8dce9e2d646224ac8bd1d856706867b9 +folderAsset: yes +timeCreated: 1471422116 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcCode.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcCode.cs new file mode 100644 index 0000000..a8321b5 --- /dev/null +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcCode.cs @@ -0,0 +1,87 @@ +namespace FlashTools.Internal.SwfTools.SwfAvm2 { + public class SwfAbcCode { + public static SwfAbcCode Read(SwfStreamReader reader) { + return new SwfAbcCode(); + } + } +} +/* +const int OP_popscope = 0x1D; +const int OP_pushbyte = 0x24; +const int OP_pushscope = 0x30; +const int OP_returnvoid = 0x47; +const int OP_constructsuper = 0x49; +const int OP_callpropvoid = 0x4F; +const int OP_newclass = 0x58; +const int OP_findpropstrict = 0x5D; +const int OP_getlex = 0x60; +const int OP_getscopeobject = 0x65; +const int OP_getproperty = 0x66; +const int OP_initproperty = 0x68; +const int OP_getlocal0 = 0xD0; + +static void ParseAVM2Instructions(SwfStreamReader reader) { + while ( !reader.IsEOF ) { + var op_code = reader.ReadByte(); + switch ( op_code ) { + case OP_popscope: + break; + case OP_pushbyte: + { + var value = reader.ReadByte(); + } + break; + case OP_pushscope: + break; + case OP_returnvoid: + break; + case OP_constructsuper: + { + var arg_count = reader.ReadEncodedU32(); + } + break; + case OP_callpropvoid: + { + var index = reader.ReadEncodedU32(); + var arg_count = reader.ReadEncodedU32(); + } + break; + case OP_newclass: + { + var index = reader.ReadEncodedU32(); + } + break; + case OP_findpropstrict: + { + var index = reader.ReadEncodedU32(); + } + break; + case OP_getlex: + { + var index = reader.ReadEncodedU32(); + } + break; + case OP_getscopeobject: + { + var index = reader.ReadByte(); + } + break; + case OP_getproperty: + { + var index = reader.ReadEncodedU32(); + } + break; + case OP_initproperty: + { + var index = reader.ReadEncodedU32(); + } + break; + case OP_getlocal0: + break; + default: + throw new UnityException(string.Format( + "Unknown OpCode: {0}", + op_code)); + } + } +}*/ \ No newline at end of file diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcCode.cs.meta b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcCode.cs.meta new file mode 100644 index 0000000..1601038 --- /dev/null +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcCode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f2f840c022ac04f2d9bf391eb5e47425 +timeCreated: 1471423209 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcFile.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcFile.cs new file mode 100644 index 0000000..a01ed64 --- /dev/null +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcFile.cs @@ -0,0 +1,765 @@ +using UnityEngine; +using System; +using System.Collections.Generic; + +namespace FlashTools.Internal.SwfTools.SwfAvm2 { + public class SwfAbcFile { + public AbcFileInfo Info; + + public static SwfAbcFile Read(SwfStreamReader reader) { + return new SwfAbcFile{ + Info = ParseAbcFileInfo(reader)}; + } + + // ------------------------------------------------------------------------ + // + // Data + // + // ------------------------------------------------------------------------ + + public class AbcFileInfo { + public ushort MinorVersion; + public ushort MajorVersion; + public ConstantPoolInfo ConstantPool; + public List Methods; + public List Metadata; + public List Instances; + public List Classes; + public List Scripts; + public List MethodBodies; + } + + public class ConstantPoolInfo { + public List Integers; + public List UIntegers; + public List Doubles; + public List Strings; + public List Namespaces; + public List NSSets; + public List Multinames; + } + + public class NamespaceInfo { + public enum Kinds : byte { + Namespace = 0x08, + PackageNamespace = 0x16, + PackageInternalNs = 0x17, + ProtectedNamespace = 0x18, + ExplicitNamespace = 0x19, + StaticProtectedNs = 0x1A, + PrivateNs = 0x05 + } + public Kinds Kind = Kinds.Namespace; + public uint Name = 0; + } + + public class NSSetInfo { + public List Ns = new List(); + } + + public class MultinameInfo { + public enum Kinds : byte { + QName = 0x07, + QNameA = 0x0D, + RTQName = 0x0F, + RTQNameA = 0x10, + RTQNameL = 0x11, + RTQNameLA = 0x12, + Multiname = 0x09, + MultinameA = 0x0E, + MultinameL = 0x1B, + MultinameLA = 0x1C, + Multiname0x1D = 0x1D + } + public class TypeQName { + public uint Namespace; + public uint NameIndex; + } + public class TypeRTQName { + public uint NameIndex; + } + public class TypeRTQNameL { + } + public class TypeMultiname { + public uint NameIndex; + public uint NsSet; + } + public class TypeMultinameL { + public uint NsSet; + } + public class Type0x1D { + public uint NameIndex; + public List TypeIndices; + } + public Kinds Kind = Kinds.RTQNameL; + public TypeQName KindQName = null; + public TypeRTQName KindRTQName = null; + public TypeRTQNameL KindRTQNameL = new TypeRTQNameL(); + public TypeMultiname KindMultiname = null; + public TypeMultinameL KindMultinameL = null; + public Type0x1D Kind0x1D = null; + } + + public class MethodInfo { + public struct OptionInfo { + public uint Val; + public byte Kind; + } + public uint ReturnType; + public List ParamTypes; + public uint Name; + public bool FlagNeedArguments; + public bool FlagActivation; + public bool FlagNeedRest; + public bool FlagHasOptional; + public bool FlagSetDxns; + public bool FlagHasParamNames; + public List Options; + public List ParamNames; + } + + public class MetadataInfo { + public struct ItemInfo { + public uint Key; + public uint Value; + } + public uint Name; + public List Items; + } + + public class InstanceInfo { + public uint Name; + public uint Supername; + public bool FlagClassSealed; + public bool FlagClassFinal; + public bool FlagClassInterface; + public bool FlagClassProtectedNs; + public uint ProtectedNs; + public List Interface; + public uint Iinit; + public List Traits; + } + + public class TraitInfo { + public enum Kinds : byte { + Slot = 0, + Method = 1, + Getter = 2, + Setter = 3, + Class = 4, + Function = 5, + Const = 6 + } + public class KindSlot { + public uint SlotId; + public uint TypeName; + public uint Vindex; + public byte Vkind; + } + + public class KindClass { + public uint SlotId; + public uint ClassI; + } + + public class KindFunction { + public uint SlotId; + public uint Funciton; + } + + public class KindMethod { + public uint DispID; + public uint Method; + } + public uint Name; + public Kinds Kind; + public bool AttrFinal; + public bool AttrOverride; + public bool AttrMetadata; + public KindSlot Slot; + public KindClass Class; + public KindFunction Function; + public KindMethod Method; + public List Metadata; + } + + public class ClassInfo { + public uint Cinit; + public List Traits; + } + + public class ScriptInfo { + public uint Init; + public List Traits; + } + + public class MethodBodyInfo { + public uint Method; + public uint MaxStack; + public uint LocalCount; + public uint InitScopeDepth; + public uint MaxScopeDepth; + public byte[] Code; + public List Exceptions; + public List Traits; + } + + public class ExceptionInfo { + public uint From; + public uint To; + public uint Target; + public uint ExcType; + public uint VarName; + } + + // ------------------------------------------------------------------------ + // + // Parsers + // + // ------------------------------------------------------------------------ + + /*abcFile{ + u16 minor_version + u16 major_version + cpool_info constant_pool + u30 method_count + method_info method[method_count] + u30 metadata_count + metadata_info metadata[metadata_count] + u30 class_count + instance_info instance[class_count] + class_info class[class_count] + u30 script_count + script_info script[script_count] + u30 method_body_count + method_body_info method_body[method_body_count] + }*/ + static AbcFileInfo ParseAbcFileInfo(SwfStreamReader reader) { + var abc_file_info = new AbcFileInfo(); + + abc_file_info.MinorVersion = reader.ReadUInt16(); + abc_file_info.MajorVersion = reader.ReadUInt16(); + + abc_file_info.ConstantPool = ParseConstantPoolInfo(reader); + + abc_file_info.Methods = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < abc_file_info.Methods.Capacity; ++i ) { + abc_file_info.Methods.Add(ParseMethodInfo(reader)); + } + + abc_file_info.Metadata = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < abc_file_info.Metadata.Capacity; ++i ) { + abc_file_info.Metadata.Add(ParseMetadataInfo(reader)); + } + + abc_file_info.Instances = new List((int)reader.ReadEncodedU32()); + abc_file_info.Classes = new List(abc_file_info.Instances.Capacity); + for ( var i = 0; i < abc_file_info.Instances.Capacity; ++i ) { + abc_file_info.Instances.Add(ParseInstanceInfo(reader)); + abc_file_info.Classes.Add(ParseClassInfo(reader)); + } + + abc_file_info.Scripts = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < abc_file_info.Scripts.Capacity; ++i ) { + abc_file_info.Scripts.Add(ParseScriptInfo(reader)); + } + + abc_file_info.MethodBodies = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < abc_file_info.MethodBodies.Capacity; ++i ) { + abc_file_info.MethodBodies.Add(ParseMethodBodyInfo(reader)); + } + return abc_file_info; + } + + /*cpool_info{ + u30 int_count + s32 integer[int_count] + u30 uint_count + u32 uinteger[uint_count] + u30 double_count + d64 double[double_count] + u30 string_count + string_info string[string_count] + u30 namespace_count + namespace_info namespace[namespace_count] + u30 ns_set_count + ns_set_info ns_set[ns_set_count] + u30 multiname_count + multiname_info multiname[multiname_count] + }*/ + static ConstantPoolInfo ParseConstantPoolInfo(SwfStreamReader reader) { + var integer_count = reader.ReadEncodedU32(); + var integers = new List((int)integer_count); + integers.Add(0); + for ( var i = 1; i < integer_count; ++i ) { + integers.Add(reader.ReadInt32()); + } + + var uinteger_count = reader.ReadEncodedU32(); + var uintegers = new List((int)uinteger_count); + uintegers.Add(0); + for ( var i = 1; i < uinteger_count; ++i ) { + uintegers.Add(reader.ReadUInt32()); + } + + var double_count = reader.ReadEncodedU32(); + var doubles = new List((int)double_count); + doubles.Add(double.NaN); + for ( var i = 1; i < double_count; ++i ) { + doubles.Add(reader.ReadDouble64()); + } + + var string_count = reader.ReadEncodedU32(); + var strings = new List((int)string_count); + strings.Add(string.Empty); + for ( var i = 1; i < string_count; ++i ) { + strings.Add(ParseStringInfo(reader)); + } + + var namespace_count = reader.ReadEncodedU32(); + var namespaces = new List((int)namespace_count); + namespaces.Add(new NamespaceInfo()); + for ( var i = 1; i < namespace_count; ++i ) { + namespaces.Add(ParseNamespaceInfo(reader)); + } + + var ns_set_count = reader.ReadEncodedU32(); + var ns_sets = new List((int)ns_set_count); + ns_sets.Add(new NSSetInfo()); + for ( var i = 1; i < ns_set_count; ++i ) { + ns_sets.Add(ParseNSSetInfo(reader)); + } + + var multiname_count = reader.ReadEncodedU32(); + var multinames = new List((int)multiname_count); + multinames.Add(new MultinameInfo()); + for ( var i = 1; i < multiname_count; ++i ) { + multinames.Add(ParseMultinameInfo(reader)); + } + + return new ConstantPoolInfo{ + Integers = integers, + UIntegers = uintegers, + Doubles = doubles, + Strings = strings, + Namespaces = namespaces, + NSSets = ns_sets, + Multinames = multinames}; + } + + /*string_info{ + u30 size + u8 utf8[size] + }*/ + static string ParseStringInfo(SwfStreamReader reader) { + var size = reader.ReadEncodedU32(); + var bytes = reader.ReadBytes((int)size); + return System.Text.Encoding.UTF8.GetString(bytes); + } + + /*namespace_info{ + u8 kind + u30 name + }*/ + static NamespaceInfo ParseNamespaceInfo(SwfStreamReader reader) { + var kind_id = reader.ReadByte(); + if ( !Enum.IsDefined(typeof(NamespaceInfo.Kinds), (byte)kind_id) ) { + throw new UnityException(string.Format( + "Incorrect NamespaceInfo.Kinds id: {0}", + kind_id)); + } + var name = reader.ReadEncodedU32(); + return new NamespaceInfo{ + Kind = (NamespaceInfo.Kinds)kind_id, + Name = name}; + } + + /*ns_set_info{ + u30 count + u30 ns[count] + }*/ + static NSSetInfo ParseNSSetInfo(SwfStreamReader reader) { + var ns = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < ns.Capacity; ++i ) { + ns.Add(reader.ReadEncodedU32()); + } + return new NSSetInfo{ + Ns = ns}; + } + + /*multiname_info { + u8 kind + u8 data[] + } + multiname_kind_QName { + u30 ns + u30 name + } + multiname_kind_RTQName { + u30 name + } + multiname_kind_RTQNameL { + } + multiname_kind_Multiname { + u30 name + u30 ns_set + } + multiname_kind_MultinameL { + u30 ns_set + }*/ + static MultinameInfo ParseMultinameInfo(SwfStreamReader reader) { + var info = new MultinameInfo(); + + var kind_id = reader.ReadByte(); + if ( !Enum.IsDefined(typeof(MultinameInfo.Kinds), (byte)kind_id) ) { + throw new UnityException(string.Format( + "Incorrect MultinameInfo.Kinds id: {0}", + kind_id)); + } + + info.Kind = (MultinameInfo.Kinds)kind_id; + switch ( info.Kind ) { + case MultinameInfo.Kinds.QName: + case MultinameInfo.Kinds.QNameA: + { + info.KindQName = new MultinameInfo.TypeQName(); + info.KindQName.Namespace = reader.ReadEncodedU32(); + info.KindQName.NameIndex = reader.ReadEncodedU32(); + break; + } + case MultinameInfo.Kinds.RTQName: + case MultinameInfo.Kinds.RTQNameA: + { + info.KindRTQName = new MultinameInfo.TypeRTQName(); + info.KindRTQName.NameIndex = reader.ReadEncodedU32(); + break; + } + case MultinameInfo.Kinds.RTQNameL: + case MultinameInfo.Kinds.RTQNameLA: + { + info.KindRTQNameL = new MultinameInfo.TypeRTQNameL(); + break; + } + case MultinameInfo.Kinds.Multiname: + case MultinameInfo.Kinds.MultinameA: + { + info.KindMultiname = new MultinameInfo.TypeMultiname(); + info.KindMultiname.NameIndex = reader.ReadEncodedU32(); + info.KindMultiname.NsSet = reader.ReadEncodedU32(); + break; + } + case MultinameInfo.Kinds.MultinameL: + case MultinameInfo.Kinds.MultinameLA: + { + info.KindMultinameL = new MultinameInfo.TypeMultinameL(); + info.KindMultinameL.NsSet = reader.ReadEncodedU32(); + break; + } + case MultinameInfo.Kinds.Multiname0x1D: + { + info.Kind0x1D = new MultinameInfo.Type0x1D(); + info.Kind0x1D.NameIndex = reader.ReadEncodedU32(); + info.Kind0x1D.TypeIndices = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < info.Kind0x1D.TypeIndices.Capacity; ++i ) { + info.Kind0x1D.TypeIndices.Add(reader.ReadEncodedU32()); + } + break; + } + default: + throw new UnityException(string.Format( + "Incorrect MultinameInfo.Kinds id: {0}", + kind_id)); + } + return info; + } + + /*method_info + { + u30 param_count + u30 return_type + u30 param_type[param_count] + u30 name + u8 flags + option_info options + param_info param_names + } + option_info + { + u30 option_count + option_detail option[option_count] + } + option_detail + { + u30 val + u8 kind + } + param_info + { + u30 param_name[param_count] + }*/ + static MethodInfo ParseMethodInfo(SwfStreamReader reader) { + var info = new MethodInfo(); + var param_count = reader.ReadEncodedU32(); + info.ReturnType = reader.ReadEncodedU32(); + info.ParamTypes = new List((int)param_count); + for ( var i = 0; i < info.ParamTypes.Capacity; ++i ) { + info.ParamTypes.Add(reader.ReadEncodedU32()); + } + info.Name = reader.ReadEncodedU32(); + var flags = reader.ReadByte(); + info.FlagNeedArguments = ((flags & 0x01) != 0); + info.FlagActivation = ((flags & 0x02) != 0); + info.FlagNeedRest = ((flags & 0x04) != 0); + info.FlagHasOptional = ((flags & 0x08) != 0); + info.FlagSetDxns = ((flags & 0x40) != 0); + info.FlagHasParamNames = ((flags & 0x80) != 0); + if ( info.FlagHasOptional ) { + info.Options = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < info.Options.Capacity; ++i ) { + info.Options.Add(new MethodInfo.OptionInfo{ + Val = reader.ReadEncodedU32(), + Kind = reader.ReadByte()}); + } + } else { + info.Options = new List(); + } + if ( info.FlagHasParamNames ) { + info.ParamNames = new List((int)param_count); + for ( var i = 0; i < info.ParamNames.Capacity; ++i ) { + info.ParamNames.Add(reader.ReadEncodedU32()); + } + } else { + info.ParamNames = new List(); + } + return info; + } + + /*metadata_info + { + u30 name + u30 item_count + item_info items[item_count] + } + item_info + { + u30 key + u30 value + }*/ + static MetadataInfo ParseMetadataInfo(SwfStreamReader reader) { + var info = new MetadataInfo(); + info.Name = reader.ReadEncodedU32(); + info.Items = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < info.Items.Capacity; ++i ) { + info.Items.Add(new MetadataInfo.ItemInfo{ + Key = reader.ReadEncodedU32(), + Value = reader.ReadEncodedU32()}); + } + return info; + } + + /*traits_info + { + u30 name + u8 kind + u8 data[] + u30 metadata_count + u30 metadata[metadata_count] + }*/ + static List ParseTraitsInfo(SwfStreamReader reader) { + var traits = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < traits.Capacity; ++i ) { + traits.Add(ParseTraitInfo(reader)); + } + return traits; + } + + static TraitInfo ParseTraitInfo(SwfStreamReader reader) { + var info = new TraitInfo(); + info.Name = reader.ReadEncodedU32(); + + var kind_attr = reader.ReadByte(); + var kind_id = (kind_attr & 0x0F); + var attr = ((kind_attr & 0xF0) >> 4); + + if ( !Enum.IsDefined(typeof(TraitInfo.Kinds), (byte)kind_id) ) { + throw new UnityException(string.Format( + "Incorrect TraitInfo.Kinds id: {0}", + kind_id)); + } + + info.Kind = (TraitInfo.Kinds)kind_id; + info.AttrFinal = (attr & 0x01) != 0; + info.AttrOverride = (attr & 0x02) != 0; + info.AttrMetadata = (attr & 0x04) != 0; + + var kind = (TraitInfo.Kinds)kind_id; + switch ( kind ) { + case TraitInfo.Kinds.Slot: + case TraitInfo.Kinds.Const: + { + info.Slot = new TraitInfo.KindSlot(); + info.Slot.SlotId = reader.ReadEncodedU32(); + info.Slot.TypeName = reader.ReadEncodedU32(); + info.Slot.Vindex = reader.ReadEncodedU32(); + if ( 0 != info.Slot.Vindex ) { + info.Slot.Vkind = reader.ReadByte(); + } else { + info.Slot.Vkind = 0; + } + break; + } + case TraitInfo.Kinds.Class: + { + info.Class = new TraitInfo.KindClass(); + info.Class.SlotId = reader.ReadEncodedU32(); + info.Class.ClassI = reader.ReadEncodedU32(); + break; + } + case TraitInfo.Kinds.Function: + { + info.Function = new TraitInfo.KindFunction(); + info.Function.SlotId = reader.ReadEncodedU32(); + info.Function.Funciton = reader.ReadEncodedU32(); + break; + } + case TraitInfo.Kinds.Method: + case TraitInfo.Kinds.Getter: + case TraitInfo.Kinds.Setter: + { + info.Method = new TraitInfo.KindMethod(); + info.Method.DispID = reader.ReadEncodedU32(); + info.Method.Method = reader.ReadEncodedU32(); + break; + } + default: + throw new UnityException(string.Format( + "Incorrect TraitInfo.Kinds id: {0}", + kind_id)); + } + if ( info.AttrMetadata ) { + info.Metadata = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < info.Metadata.Capacity; ++i ) { + info.Metadata.Add(reader.ReadEncodedU32()); + } + } else { + info.Metadata = new List(); + } + return info; + } + + /*exception_info + { + u30 from + u30 to + u30 target + u30 exc_type + u30 var_name + }*/ + static List ParseExceptionsInfo(SwfStreamReader reader) { + var exceptions = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < exceptions.Capacity; ++i ) { + exceptions.Add(ParseExceptionInfo(reader)); + } + return exceptions; + } + + static ExceptionInfo ParseExceptionInfo(SwfStreamReader reader) { + var info = new ExceptionInfo(); + info.From = reader.ReadEncodedU32(); + info.To = reader.ReadEncodedU32(); + info.Target = reader.ReadEncodedU32(); + info.ExcType = reader.ReadEncodedU32(); + info.VarName = reader.ReadEncodedU32(); + return info; + } + + /*instance_info + { + u30 name + u30 super_name + u8 flags + u30 protectedNs + u30 intrf_count + u30 interface[intrf_count] + u30 iinit + u30 trait_count + traits_info trait[trait_count] + }*/ + static InstanceInfo ParseInstanceInfo(SwfStreamReader reader) { + var info = new InstanceInfo(); + info.Name = reader.ReadEncodedU32(); + info.Supername = reader.ReadEncodedU32(); + var flags = reader.ReadByte(); + info.FlagClassSealed = (flags & 0x01 ) != 0; + info.FlagClassFinal = (flags & 0x02 ) != 0; + info.FlagClassInterface = (flags & 0x04 ) != 0; + info.FlagClassProtectedNs = (flags & 0x08 ) != 0; + if ( info.FlagClassProtectedNs ) { + info.ProtectedNs = reader.ReadEncodedU32(); + } else { + info.ProtectedNs = 0; + } + + info.Interface = new List((int)reader.ReadEncodedU32()); + for ( var i = 0; i < info.Interface.Capacity; ++i ) { + info.Interface.Add(reader.ReadEncodedU32()); + } + info.Iinit = reader.ReadEncodedU32(); + info.Traits = ParseTraitsInfo(reader); + return info; + } + + /*class_info + { + u30 cinit + u30 trait_count + traits_info traits[trait_count] + }*/ + static ClassInfo ParseClassInfo(SwfStreamReader reader) { + var info = new ClassInfo(); + info.Cinit = reader.ReadEncodedU32(); + info.Traits = ParseTraitsInfo(reader); + return info; + } + + /*script_info + { + u30 init + u30 trait_count + traits_info trait[trait_count] + }*/ + static ScriptInfo ParseScriptInfo(SwfStreamReader reader) { + var info = new ScriptInfo(); + info.Init = reader.ReadEncodedU32(); + info.Traits = ParseTraitsInfo(reader); + return info; + } + + /*method_body_info + { + u30 method + u30 max_stack + u30 local_count + u30 init_scope_depth + u30 max_scope_depth + u30 code_length + u8 code[code_length] + u30 exception_count + exception_info exception[exception_count] + u30 trait_count + traits_info trait[trait_count] + }*/ + static MethodBodyInfo ParseMethodBodyInfo(SwfStreamReader reader) { + var info = new MethodBodyInfo(); + info.Method = reader.ReadEncodedU32(); + info.MaxStack = reader.ReadEncodedU32(); + info.LocalCount = reader.ReadEncodedU32(); + info.InitScopeDepth = reader.ReadEncodedU32(); + info.MaxScopeDepth = reader.ReadEncodedU32(); + info.Code = reader.ReadBytes((int)reader.ReadEncodedU32()); + info.Exceptions = ParseExceptionsInfo(reader); + info.Traits = ParseTraitsInfo(reader); + return info; + } + } +} \ No newline at end of file diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcFile.cs.meta b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcFile.cs.meta new file mode 100644 index 0000000..2b0e4ae --- /dev/null +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfAvm2/SwfAbcFile.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 381e76ca714de41f582c8fa6a98542d8 +timeCreated: 1471422151 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs index 932d2f0..95bac32 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfContextExecuter.cs @@ -206,7 +206,7 @@ namespace FlashTools.Internal.SwfTools { return dl; } - public SwfDisplayList Visit(DoABCTag tag, SwfDisplayList dl) { + public SwfDisplayList Visit(DoAbcTag tag, SwfDisplayList dl) { Debug.Log(tag); return dl; } diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/DoABCTag.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/DoABCTag.cs index 0cdd6f5..3af686a 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/DoABCTag.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/DoABCTag.cs @@ -1,15 +1,13 @@ -using UnityEngine; -using System; -using System.Collections.Generic; +using FlashTools.Internal.SwfTools.SwfAvm2; namespace FlashTools.Internal.SwfTools.SwfTags { - public class DoABCTag : SwfTagBase { - public bool ExecuteImmediately; - public string Name; - public ABCFileInfo ABCFile; + public class DoAbcTag : SwfTagBase { + public bool ExecuteImmediately; + public string Name; + public SwfAbcFile AbcFile; public override SwfTagType TagType { - get { return SwfTagType.DoABC; } + get { return SwfTagType.DoAbc; } } public override TResult AcceptVistor(SwfTagVisitor visitor, TArg arg) { @@ -17,778 +15,18 @@ namespace FlashTools.Internal.SwfTools.SwfTags { } public override string ToString() { - return "DoABC."; + return "DoAbc."; } - public static DoABCTag Create(SwfStreamReader reader) { + public static DoAbcTag Create(SwfStreamReader reader) { const int kDoAbcLazyInitializeFlag = 1; var flags = reader.ReadUInt32(); var name = reader.ReadString(); - var abc_file = ParseABCFileInfo(reader); - return new DoABCTag{ + var abc_file = SwfAbcFile.Read(reader); + return new DoAbcTag{ ExecuteImmediately = (flags & kDoAbcLazyInitializeFlag) == 0, Name = name, - ABCFile = abc_file - }; - } - - // ------------------------------------------------------------------------ - // - // ABCFile data - // - // ------------------------------------------------------------------------ - - public class ABCFileInfo { - public ushort MinorVersion; - public ushort MajorVersion; - public ConstantPoolInfo ConstantPool; - public List Methods; - public List Metadata; - public List Instances; - public List Classes; - public List Scripts; - public List MethodBodies; - } - - public class ConstantPoolInfo { - public List Integers; - public List UIntegers; - public List Doubles; - public List Strings; - public List Namespaces; - public List NSSets; - public List Multinames; - } - - public class NamespaceInfo { - public enum Kinds : byte { - Namespace = 0x08, - PackageNamespace = 0x16, - PackageInternalNs = 0x17, - ProtectedNamespace = 0x18, - ExplicitNamespace = 0x19, - StaticProtectedNs = 0x1A, - PrivateNs = 0x05 - } - public Kinds Kind = Kinds.Namespace; - public uint Name = 0; - } - - public class NSSetInfo { - public List Ns = new List(); - } - - public class MultinameInfo { - public enum Kinds : byte { - QName = 0x07, - QNameA = 0x0D, - RTQName = 0x0F, - RTQNameA = 0x10, - RTQNameL = 0x11, - RTQNameLA = 0x12, - Multiname = 0x09, - MultinameA = 0x0E, - MultinameL = 0x1B, - MultinameLA = 0x1C, - Multiname0x1D = 0x1D - } - public class TypeQName { - public uint Namespace; - public uint NameIndex; - } - public class TypeRTQName { - public uint NameIndex; - } - public class TypeRTQNameL { - } - public class TypeMultiname { - public uint NameIndex; - public uint NsSet; - } - public class TypeMultinameL { - public uint NsSet; - } - public class Type0x1D { - public uint NameIndex; - public List TypeIndices; - } - public Kinds Kind = Kinds.RTQNameL; - public TypeQName KindQName = null; - public TypeRTQName KindRTQName = null; - public TypeRTQNameL KindRTQNameL = new TypeRTQNameL(); - public TypeMultiname KindMultiname = null; - public TypeMultinameL KindMultinameL = null; - public Type0x1D Kind0x1D = null; - } - - public class MethodInfo { - public struct OptionInfo { - public uint Val; - public byte Kind; - } - public uint ReturnType; - public List ParamTypes; - public uint Name; - public bool FlagNeedArguments; - public bool FlagActivation; - public bool FlagNeedRest; - public bool FlagHasOptional; - public bool FlagSetDxns; - public bool FlagHasParamNames; - public List Options; - public List ParamNames; - } - - public class MetadataInfo { - public struct ItemInfo { - public uint Key; - public uint Value; - } - public uint Name; - public List Items; - } - - public class InstanceInfo { - public uint Name; - public uint Supername; - public bool FlagClassSealed; - public bool FlagClassFinal; - public bool FlagClassInterface; - public bool FlagClassProtectedNs; - public uint ProtectedNs; - public List Interface; - public uint Iinit; - public List Traits; - } - - public class TraitInfo { - public enum Kinds : byte { - Slot = 0, - Method = 1, - Getter = 2, - Setter = 3, - Class = 4, - Function = 5, - Const = 6, - } - public class KindSlot { - public uint SlotId; - public uint TypeName; - public uint Vindex; - public byte Vkind; - } - - public class KindClass { - public uint SlotId; - public uint ClassI; - } - - public class KindFunction { - public uint SlotId; - public uint Funciton; - } - - public class KindMethod { - public uint DispID; - public uint Method; - } - public uint Name; - public Kinds Kind; - public bool AttrFinal; - public bool AttrOverride; - public bool AttrMetadata; - public KindSlot Slot; - public KindClass Class; - public KindFunction Function; - public KindMethod Method; - public List Metadata; - } - - public class ClassInfo { - public uint Cinit; - public List Traits; - } - - public class ScriptInfo { - public uint Init; - public List Traits; - } - - public class MethodBodyInfo { - public uint Method; - public uint MaxStack; - public uint LocalCount; - public uint InitScopeDepth; - public uint MaxScopeDepth; - public byte[] Code; - public List Exceptions; - public List Traits; - } - - public class ExceptionInfo { - public uint From; - public uint To; - public uint Target; - public uint ExcType; - public uint VarName; - } - - // ------------------------------------------------------------------------ - // - // ABCFile parsers - // - // ------------------------------------------------------------------------ - - /*abcFile{ - u16 minor_version - u16 major_version - cpool_info constant_pool - u30 method_count - method_info method[method_count] - u30 metadata_count - metadata_info metadata[metadata_count] - u30 class_count - instance_info instance[class_count] - class_info class[class_count] - u30 script_count - script_info script[script_count] - u30 method_body_count - method_body_info method_body[method_body_count] - }*/ - static ABCFileInfo ParseABCFileInfo(SwfStreamReader reader) { - var abc_file_info = new ABCFileInfo(); - - abc_file_info.MinorVersion = reader.ReadUInt16(); - abc_file_info.MajorVersion = reader.ReadUInt16(); - - abc_file_info.ConstantPool = ParseConstantPoolInfo(reader); - - abc_file_info.Methods = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < abc_file_info.Methods.Capacity; ++i ) { - abc_file_info.Methods.Add(ParseMethodInfo(reader)); - } - - abc_file_info.Metadata = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < abc_file_info.Metadata.Capacity; ++i ) { - abc_file_info.Metadata.Add(ParseMetadataInfo(reader)); - } - - abc_file_info.Instances = new List((int)reader.ReadEncodedU32()); - abc_file_info.Classes = new List(abc_file_info.Instances.Capacity); - for ( var i = 0; i < abc_file_info.Instances.Capacity; ++i ) { - abc_file_info.Instances.Add(ParseInstanceInfo(reader)); - abc_file_info.Classes.Add(ParseClassInfo(reader)); - } - - abc_file_info.Scripts = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < abc_file_info.Scripts.Capacity; ++i ) { - abc_file_info.Scripts.Add(ParseScriptInfo(reader)); - } - - abc_file_info.MethodBodies = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < abc_file_info.MethodBodies.Capacity; ++i ) { - abc_file_info.MethodBodies.Add(ParseMethodBodyInfo(reader)); - } - return abc_file_info; - } - - /*cpool_info{ - u30 int_count - s32 integer[int_count] - u30 uint_count - u32 uinteger[uint_count] - u30 double_count - d64 double[double_count] - u30 string_count - string_info string[string_count] - u30 namespace_count - namespace_info namespace[namespace_count] - u30 ns_set_count - ns_set_info ns_set[ns_set_count] - u30 multiname_count - multiname_info multiname[multiname_count] - }*/ - static ConstantPoolInfo ParseConstantPoolInfo(SwfStreamReader reader) { - var integer_count = reader.ReadEncodedU32(); - var integers = new List((int)integer_count); - integers.Add(0); - for ( var i = 1; i < integer_count; ++i ) { - integers.Add(reader.ReadInt32()); - } - - var uinteger_count = reader.ReadEncodedU32(); - var uintegers = new List((int)uinteger_count); - uintegers.Add(0); - for ( var i = 1; i < uinteger_count; ++i ) { - uintegers.Add(reader.ReadUInt32()); - } - - var double_count = reader.ReadEncodedU32(); - var doubles = new List((int)double_count); - doubles.Add(double.NaN); - for ( var i = 1; i < double_count; ++i ) { - doubles.Add(reader.ReadDouble64()); - } - - var string_count = reader.ReadEncodedU32(); - var strings = new List((int)string_count); - strings.Add(string.Empty); - for ( var i = 1; i < string_count; ++i ) { - strings.Add(ParseStringInfo(reader)); - } - - var namespace_count = reader.ReadEncodedU32(); - var namespaces = new List((int)namespace_count); - namespaces.Add(new NamespaceInfo()); - for ( var i = 1; i < namespace_count; ++i ) { - namespaces.Add(ParseNamespaceInfo(reader)); - } - - var ns_set_count = reader.ReadEncodedU32(); - var ns_sets = new List((int)ns_set_count); - ns_sets.Add(new NSSetInfo()); - for ( var i = 1; i < ns_set_count; ++i ) { - ns_sets.Add(ParseNSSetInfo(reader)); - } - - var multiname_count = reader.ReadEncodedU32(); - var multinames = new List((int)multiname_count); - multinames.Add(new MultinameInfo()); - for ( var i = 1; i < multiname_count; ++i ) { - multinames.Add(ParseMultinameInfo(reader)); - } - - return new ConstantPoolInfo{ - Integers = integers, - UIntegers = uintegers, - Doubles = doubles, - Strings = strings, - Namespaces = namespaces, - NSSets = ns_sets, - Multinames = multinames}; - } - - /*string_info{ - u30 size - u8 utf8[size] - }*/ - static string ParseStringInfo(SwfStreamReader reader) { - var size = reader.ReadEncodedU32(); - var bytes = reader.ReadBytes((int)size); - return System.Text.Encoding.UTF8.GetString(bytes); - } - - /*namespace_info{ - u8 kind - u30 name - }*/ - static NamespaceInfo ParseNamespaceInfo(SwfStreamReader reader) { - var kind_id = reader.ReadByte(); - if ( !Enum.IsDefined(typeof(NamespaceInfo.Kinds), (byte)kind_id) ) { - throw new UnityException(string.Format( - "Incorrect NamespaceInfo.Kinds id: {0}", - kind_id)); - } - var name = reader.ReadEncodedU32(); - return new NamespaceInfo{ - Kind = (NamespaceInfo.Kinds)kind_id, - Name = name}; - } - - /*ns_set_info{ - u30 count - u30 ns[count] - }*/ - static NSSetInfo ParseNSSetInfo(SwfStreamReader reader) { - var ns = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < ns.Capacity; ++i ) { - ns.Add(reader.ReadEncodedU32()); - } - return new NSSetInfo{ - Ns = ns}; - } - - /*multiname_info { - u8 kind - u8 data[] - } - multiname_kind_QName { - u30 ns - u30 name - } - multiname_kind_RTQName { - u30 name - } - multiname_kind_RTQNameL { - } - multiname_kind_Multiname { - u30 name - u30 ns_set - } - multiname_kind_MultinameL { - u30 ns_set - }*/ - static MultinameInfo ParseMultinameInfo(SwfStreamReader reader) { - var info = new MultinameInfo(); - - var kind_id = reader.ReadByte(); - if ( !Enum.IsDefined(typeof(MultinameInfo.Kinds), (byte)kind_id) ) { - throw new UnityException(string.Format( - "Incorrect MultinameInfo.Kinds id: {0}", - kind_id)); - } - - info.Kind = (MultinameInfo.Kinds)kind_id; - switch ( info.Kind ) { - case MultinameInfo.Kinds.QName: - case MultinameInfo.Kinds.QNameA: - { - info.KindQName = new MultinameInfo.TypeQName(); - info.KindQName.Namespace = reader.ReadEncodedU32(); - info.KindQName.NameIndex = reader.ReadEncodedU32(); - break; - } - case MultinameInfo.Kinds.RTQName: - case MultinameInfo.Kinds.RTQNameA: - { - info.KindRTQName = new MultinameInfo.TypeRTQName(); - info.KindRTQName.NameIndex = reader.ReadEncodedU32(); - break; - } - case MultinameInfo.Kinds.RTQNameL: - case MultinameInfo.Kinds.RTQNameLA: - { - info.KindRTQNameL = new MultinameInfo.TypeRTQNameL(); - break; - } - case MultinameInfo.Kinds.Multiname: - case MultinameInfo.Kinds.MultinameA: - { - info.KindMultiname = new MultinameInfo.TypeMultiname(); - info.KindMultiname.NameIndex = reader.ReadEncodedU32(); - info.KindMultiname.NsSet = reader.ReadEncodedU32(); - break; - } - case MultinameInfo.Kinds.MultinameL: - case MultinameInfo.Kinds.MultinameLA: - { - info.KindMultinameL = new MultinameInfo.TypeMultinameL(); - info.KindMultinameL.NsSet = reader.ReadEncodedU32(); - break; - } - case MultinameInfo.Kinds.Multiname0x1D: - { - info.Kind0x1D = new MultinameInfo.Type0x1D(); - info.Kind0x1D.NameIndex = reader.ReadEncodedU32(); - info.Kind0x1D.TypeIndices = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < info.Kind0x1D.TypeIndices.Capacity; ++i ) { - info.Kind0x1D.TypeIndices.Add(reader.ReadEncodedU32()); - } - break; - } - default: - throw new UnityException(string.Format( - "Incorrect MultinameInfo.Kinds id: {0}", - kind_id)); - } - return info; - } - - /* - method_info - { - u30 param_count - u30 return_type - u30 param_type[param_count] - u30 name - u8 flags - option_info options - param_info param_names - } - option_info - { - u30 option_count - option_detail option[option_count] - } - option_detail - { - u30 val - u8 kind - } - param_info - { - u30 param_name[param_count] - }*/ - static MethodInfo ParseMethodInfo(SwfStreamReader reader) { - var info = new MethodInfo(); - var param_count = reader.ReadEncodedU32(); - info.ReturnType = reader.ReadEncodedU32(); - info.ParamTypes = new List((int)param_count); - for ( var i = 0; i < info.ParamTypes.Capacity; ++i ) { - info.ParamTypes.Add(reader.ReadEncodedU32()); - } - info.Name = reader.ReadEncodedU32(); - var flags = reader.ReadByte(); - info.FlagNeedArguments = ((flags & 0x01) != 0); - info.FlagActivation = ((flags & 0x02) != 0); - info.FlagNeedRest = ((flags & 0x04) != 0); - info.FlagHasOptional = ((flags & 0x08) != 0); - info.FlagSetDxns = ((flags & 0x40) != 0); - info.FlagHasParamNames = ((flags & 0x80) != 0); - if ( info.FlagHasOptional ) { - info.Options = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < info.Options.Capacity; ++i ) { - info.Options.Add(new MethodInfo.OptionInfo{ - Val = reader.ReadEncodedU32(), - Kind = reader.ReadByte()}); - } - } else { - info.Options = new List(); - } - if ( info.FlagHasParamNames ) { - info.ParamNames = new List((int)param_count); - for ( var i = 0; i < info.ParamNames.Capacity; ++i ) { - info.ParamNames.Add(reader.ReadEncodedU32()); - } - } else { - info.ParamNames = new List(); - } - return info; - } - - /* - metadata_info - { - u30 name - u30 item_count - item_info items[item_count] - } - item_info - { - u30 key - u30 value - }*/ - static MetadataInfo ParseMetadataInfo(SwfStreamReader reader) { - var info = new MetadataInfo(); - info.Name = reader.ReadEncodedU32(); - info.Items = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < info.Items.Capacity; ++i ) { - info.Items.Add(new MetadataInfo.ItemInfo{ - Key = reader.ReadEncodedU32(), - Value = reader.ReadEncodedU32()}); - } - return info; - } - - /* - traits_info - { - u30 name - u8 kind - u8 data[] - u30 metadata_count - u30 metadata[metadata_count] - }*/ - static List ParseTraitsInfo(SwfStreamReader reader) { - var traits = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < traits.Capacity; ++i ) { - traits.Add(ParseTraitInfo(reader)); - } - return traits; - } - - static TraitInfo ParseTraitInfo(SwfStreamReader reader) { - var info = new TraitInfo(); - info.Name = reader.ReadEncodedU32(); - - var kind_attr = reader.ReadByte(); - var kind_id = (kind_attr & 0x0F); - var attr = ((kind_attr & 0xF0) >> 4); - - if ( !Enum.IsDefined(typeof(TraitInfo.Kinds), (byte)kind_id) ) { - throw new UnityException(string.Format( - "Incorrect TraitInfo.Kinds id: {0}", - kind_id)); - } - - info.Kind = (TraitInfo.Kinds)kind_id; - info.AttrFinal = (attr & 0x01) != 0; - info.AttrOverride = (attr & 0x02) != 0; - info.AttrMetadata = (attr & 0x04) != 0; - - var kind = (TraitInfo.Kinds)kind_id; - switch ( kind ) { - case TraitInfo.Kinds.Slot: - case TraitInfo.Kinds.Const: - { - info.Slot = new TraitInfo.KindSlot(); - info.Slot.SlotId = reader.ReadEncodedU32(); - info.Slot.TypeName = reader.ReadEncodedU32(); - info.Slot.Vindex = reader.ReadEncodedU32(); - if ( 0 != info.Slot.Vindex ) { - info.Slot.Vkind = reader.ReadByte(); - } else { - info.Slot.Vkind = 0; - } - break; - } - case TraitInfo.Kinds.Class: - { - info.Class = new TraitInfo.KindClass(); - info.Class.SlotId = reader.ReadEncodedU32(); - info.Class.ClassI = reader.ReadEncodedU32(); - break; - } - case TraitInfo.Kinds.Function: - { - info.Function = new TraitInfo.KindFunction(); - info.Function.SlotId = reader.ReadEncodedU32(); - info.Function.Funciton = reader.ReadEncodedU32(); - break; - } - case TraitInfo.Kinds.Method: - case TraitInfo.Kinds.Getter: - case TraitInfo.Kinds.Setter: - { - info.Method = new TraitInfo.KindMethod(); - info.Method.DispID = reader.ReadEncodedU32(); - info.Method.Method = reader.ReadEncodedU32(); - break; - } - default: - throw new UnityException(string.Format( - "Incorrect TraitInfo.Kinds id: {0}", - kind_id)); - } - if ( info.AttrMetadata ) { - info.Metadata = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < info.Metadata.Capacity; ++i ) { - info.Metadata.Add(reader.ReadEncodedU32()); - } - } else { - info.Metadata = new List(); - } - return info; - } - - /* - exception_info - { - u30 from - u30 to - u30 target - u30 exc_type - u30 var_name - }*/ - static List ParseExceptionsInfo(SwfStreamReader reader) { - var exceptions = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < exceptions.Capacity; ++i ) { - exceptions.Add(ParseExceptionInfo(reader)); - } - return exceptions; - } - - static ExceptionInfo ParseExceptionInfo(SwfStreamReader reader) { - var info = new ExceptionInfo(); - info.From = reader.ReadEncodedU32(); - info.To = reader.ReadEncodedU32(); - info.Target = reader.ReadEncodedU32(); - info.ExcType = reader.ReadEncodedU32(); - info.VarName = reader.ReadEncodedU32(); - return info; - } - - /* - instance_info - { - u30 name - u30 super_name - u8 flags - u30 protectedNs - u30 intrf_count - u30 interface[intrf_count] - u30 iinit - u30 trait_count - traits_info trait[trait_count] - }*/ - static InstanceInfo ParseInstanceInfo(SwfStreamReader reader) { - var info = new InstanceInfo(); - info.Name = reader.ReadEncodedU32(); - info.Supername = reader.ReadEncodedU32(); - var flags = reader.ReadByte(); - info.FlagClassSealed = (flags & 0x01 ) != 0; - info.FlagClassFinal = (flags & 0x02 ) != 0; - info.FlagClassInterface = (flags & 0x04 ) != 0; - info.FlagClassProtectedNs = (flags & 0x08 ) != 0; - if ( info.FlagClassProtectedNs ) { - info.ProtectedNs = reader.ReadEncodedU32(); - } else { - info.ProtectedNs = 0; - } - - info.Interface = new List((int)reader.ReadEncodedU32()); - for ( var i = 0; i < info.Interface.Capacity; ++i ) { - info.Interface.Add(reader.ReadEncodedU32()); - } - info.Iinit = reader.ReadEncodedU32(); - info.Traits = ParseTraitsInfo(reader); - return info; - } - - /* - class_info - { - u30 cinit - u30 trait_count - traits_info traits[trait_count] - }*/ - static ClassInfo ParseClassInfo(SwfStreamReader reader) { - var info = new ClassInfo(); - info.Cinit = reader.ReadEncodedU32(); - info.Traits = ParseTraitsInfo(reader); - return info; - } - - /* - script_info - { - u30 init - u30 trait_count - traits_info trait[trait_count] - }*/ - static ScriptInfo ParseScriptInfo(SwfStreamReader reader) { - var info = new ScriptInfo(); - info.Init = reader.ReadEncodedU32(); - info.Traits = ParseTraitsInfo(reader); - return info; - } - - /* - method_body_info - { - u30 method - u30 max_stack - u30 local_count - u30 init_scope_depth - u30 max_scope_depth - u30 code_length - u8 code[code_length] - u30 exception_count - exception_info exception[exception_count] - u30 trait_count - traits_info trait[trait_count] - }*/ - static MethodBodyInfo ParseMethodBodyInfo(SwfStreamReader reader) { - var info = new MethodBodyInfo(); - info.Method = reader.ReadEncodedU32(); - info.MaxStack = reader.ReadEncodedU32(); - info.LocalCount = reader.ReadEncodedU32(); - info.InitScopeDepth = reader.ReadEncodedU32(); - info.MaxScopeDepth = reader.ReadEncodedU32(); - info.Code = reader.ReadBytes((int)reader.ReadEncodedU32()); - info.Exceptions = ParseExceptionsInfo(reader); - info.Traits = ParseTraitsInfo(reader); - return info; + AbcFile = abc_file}; } } } \ No newline at end of file diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/SwfTagBase.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/SwfTagBase.cs index a7d84f9..c12909c 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/SwfTagBase.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/SwfTagBase.cs @@ -37,7 +37,7 @@ //DoAction = 12, //DoInitAction = 59, - DoABC = 82, + DoAbc = 82, // ----------------------------- // Shape @@ -167,7 +167,7 @@ case (int)SwfTagType.End: return EndTag.Create(reader); case (int)SwfTagType.SymbolClass: return SymbolClassTag.Create(reader); case (int)SwfTagType.DefineSceneAndFrameLabelData: return DefineSceneAndFrameLabelDataTag.Create(reader); - case (int)SwfTagType.DoABC: return DoABCTag.Create(reader); + case (int)SwfTagType.DoAbc: return DoAbcTag.Create(reader); case (int)SwfTagType.DefineShape: return DefineShapeTag.Create(reader); case (int)SwfTagType.DefineShape2: return DefineShape2Tag.Create(reader); case (int)SwfTagType.DefineShape3: return DefineShape3Tag.Create(reader); diff --git a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/SwfTagVisitor.cs b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/SwfTagVisitor.cs index 2950cab..b0a6028 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/SwfTagVisitor.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/SwfTools/SwfTags/SwfTagVisitor.cs @@ -11,7 +11,7 @@ TResult Visit(EndTag tag, TArg arg); TResult Visit(SymbolClassTag tag, TArg arg); TResult Visit(DefineSceneAndFrameLabelDataTag tag, TArg arg); - TResult Visit(DoABCTag tag, TArg arg); + TResult Visit(DoAbcTag tag, TArg arg); TResult Visit(DefineShapeTag tag, TArg arg); TResult Visit(DefineShape2Tag tag, TArg arg); TResult Visit(DefineShape3Tag tag, TArg arg);