Example #1
0
        internal Namespace CreateNamespace(Namespace.NamespaceKind kind, string name, string prefix = null)
        {
            Namespace ns = new Namespace(kind, name, prefix);

            this.nsConsts.Add(ns);
            return(ns);
        }
Example #2
0
        /// <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
            }
        }