internal Multiname CreateMultiname(Multiname.MultinameKind kind, string name, Namespace ns, NamespaceSet set) { Multiname mn = new Multiname(kind, name, ns, set); this.multinameConsts.Add(mn); return(mn); }
/// <summary> /// Reads in all the constant values referenced from the bytecode. /// </summary> private void ReadConstantPool() { uint intCount = this.abcdtr.ReadU30(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("Constant ints length " + intCount); } #endif this.code.SetIntCount(intCount); for (int i = 1; i < intCount; i++) { this.code.IntConsts[i] = this.abcdtr.ReadSI32(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("int #" + i + ": " + this.code.IntConsts[i]); } #endif } uint uintCount = this.abcdtr.ReadU30(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("Constant uints length " + uintCount); } #endif this.code.SetUintCount(uintCount); for (int i = 1; i < uintCount; i++) { this.code.UIntConsts[i] = this.abcdtr.ReadUI32(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("uint #" + i + ": " + this.code.UIntConsts[i]); } #endif } uint double64Count = this.abcdtr.ReadU30(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("Constant d64 length " + double64Count); } #endif this.code.SetDoubleCount(double64Count); for (int i = 1; i < double64Count; i++) { /* See the comment on AbcCode.DoubleConsts for the reason for all * of this strange ulong shenanigans. */ ulong ul = (ulong)this.abcdtr.ReadInt32(); ul |= ((ulong)this.abcdtr.ReadInt32()) << 32; this.code.DoubleConsts[i] = ul; #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("d64 #" + i + ": " + this.code.DoubleConsts[i]); } #endif } uint stringCount = this.abcdtr.ReadU30(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("Constant string length " + stringCount); } #endif this.code.SetStringCount(stringCount); for (int i = 1; i < stringCount; i++) { this.code.StringConsts[i] = this.abcdtr.ReadString(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("str #" + i + ": " + this.code.StringConsts[i]); } #endif } uint nspaceCount = this.abcdtr.ReadU30(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("Constant ns length " + nspaceCount); } #endif for (int i = 1; i < nspaceCount; i++) { Namespace.NamespaceKind kind = (Namespace.NamespaceKind) this.abcdtr.ReadUI8(); Namespace ns = null; if (kind == Namespace.NamespaceKind.Private) { uint sidx = this.abcdtr.ReadU30(); string name = string.Empty; if (sidx > 0) { name = this.code.StringConsts[sidx]; } ns = this.code.CreateNamespace(kind, name); } else { ns = this.code.CreateNamespace(kind, this.ReadString()); } #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("ns #" + i + ": " + ns); } #endif } uint nssetCount = this.abcdtr.ReadU30(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("Constant ns set length " + nssetCount); } #endif for (int i = 1; i < nssetCount; i++) { uint count = this.abcdtr.ReadU30(); Namespace[] nsRefs = new Namespace[count]; for (int j = 0; j < count; j++) { nsRefs[j] = this.code.GetNamespace((int)this.abcdtr.ReadU30()); } NamespaceSet nss = this.code.CreateNamespaceSet(nsRefs); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("nss #" + i + ": " + nss); } #endif } uint multinameCount = this.abcdtr.ReadU30(); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("Constant mname length " + multinameCount); } #endif for (int i = 1; i < multinameCount; i++) { string name = null; Namespace ns = null; NamespaceSet set = null; Multiname.MultinameKind kind = (Multiname.MultinameKind) this.abcdtr.ReadUI8(); switch (kind) { case Multiname.MultinameKind.QName: case Multiname.MultinameKind.QNameA: int nsi = (int)this.abcdtr.ReadU30(); ns = this.code.GetNamespace(nsi); name = this.ReadString(); break; case Multiname.MultinameKind.RTQName: case Multiname.MultinameKind.RTQNameA: name = this.ReadString(); break; case Multiname.MultinameKind.RTQNameL: case Multiname.MultinameKind.RTQNameLA: /* No data */ break; case Multiname.MultinameKind.Multiname: case Multiname.MultinameKind.MultinameA: name = this.ReadString(); set = this.code.GetNamespaceSet((int)this.abcdtr.ReadU30()); break; case Multiname.MultinameKind.MultinameL: case Multiname.MultinameKind.MultinameLA: set = this.code.GetNamespaceSet((int)this.abcdtr.ReadU30()); break; default: throw new SWFModellerException( SWFModellerError.ABCParsing, "Bad multiname kind in ABC data."); } Multiname mn = this.code.CreateMultiname(kind, name, ns, set); #if DEBUG if (this.ReadLog != null) { this.ReadLog.AppendLine("mn #" + i + ": " + mn); } #endif } }