示例#1
0
        private void _readClassInfo()
        {
            const ABCClassFlags validClassFlags =
                ABCClassFlags.ClassFinal
                | ABCClassFlags.ClassSealed
                | ABCClassFlags.ClassInterface
                | ABCClassFlags.ClassProtectedNs;

            int classCount   = _readU30();
            var classInfoArr = new ABCClassInfo[classCount];

            // Since a class can refer to another via a class trait in its instance_info
            // or static_info traits, we must create all ABCClassInfo instances upfront.

            for (int i = 0; i < classInfoArr.Length; i++)
            {
                classInfoArr[i] = new ABCClassInfo(i);
            }

            m_abcFile.setClassInfo(classInfoArr);

            // Read instance_info

            for (int i = 0; i < classInfoArr.Length; i++)
            {
                ABCMultiname className = m_abcFile.resolveMultiname(_readU30());
                if (className.kind != ABCConstKind.QName)
                {
                    throw ErrorHelper.createError(ErrorCode.MARIANA__ABC_CLASS_TRAIT_NAME_NOT_QNAME);
                }

                QName classQualifiedName = new QName(
                    m_abcFile.resolveNamespace(className.namespaceIndex),
                    m_abcFile.resolveString(className.localNameIndex)
                    );

                if (classQualifiedName.ns.kind == NamespaceKind.ANY || classQualifiedName.localName == null)
                {
                    throw ErrorHelper.createError(ErrorCode.MARIANA__ABC_CLASS_TRAIT_NAME_NULL);
                }

                ABCMultiname parentName = m_abcFile.resolveMultiname(_readU30());

                var flags = (ABCClassFlags)_readU8();

                if ((flags & ~validClassFlags) != 0)
                {
                    throw ErrorHelper.createError(ErrorCode.MARIANA__ABC_INVALID_INSTANCE_INFO_FLAGS);
                }

                const ABCClassFlags finalOrInterface = ABCClassFlags.ClassFinal | ABCClassFlags.ClassInterface;
                if ((flags & finalOrInterface) == finalOrInterface)
                {
                    // ClassFinal and ClassInterface cannot be used together
                    throw ErrorHelper.createError(ErrorCode.MARIANA__ABC_INVALID_INSTANCE_INFO_FLAGS);
                }

                Namespace protectedNS = default(Namespace);
                if ((flags & ABCClassFlags.ClassProtectedNs) != 0)
                {
                    protectedNS = m_abcFile.resolveNamespace(_readU30());
                }

                int            interfaceCount = _readU30();
                ABCMultiname[] interfaceNames = Array.Empty <ABCMultiname>();

                if (interfaceCount != 0)
                {
                    interfaceNames = new ABCMultiname[interfaceCount];
                    for (int j = 0; j < interfaceNames.Length; j++)
                    {
                        interfaceNames[j] = m_abcFile.resolveMultiname(_readU30());
                    }
                }

                ABCMethodInfo  instanceInit = m_abcFile.resolveMethodInfo(_readU30());
                ABCTraitInfo[] traits       = _readTraitInfo(_readU30());

                classInfoArr[i].init(classQualifiedName, parentName, interfaceNames, protectedNS, flags);
                classInfoArr[i].initInstanceInfo(instanceInit, traits);
            }

            // Read class_info
            for (int i = 0; i < classCount; i++)
            {
                ABCMethodInfo  staticInit = m_abcFile.resolveMethodInfo(_readU30());
                ABCTraitInfo[] traits     = _readTraitInfo(_readU30());
                classInfoArr[i].initStaticInfo(staticInit, traits);
            }
        }
示例#2
0
 internal ScriptClass(QName name, ABCClassFlags flags, ApplicationDomain domain)
     : base(name, domain, ClassTag.OBJECT)
 {
     m_flags = flags;
     setIsDynamic((flags & ABCClassFlags.ClassSealed) == 0);
 }