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); } }
internal ScriptClass(QName name, ABCClassFlags flags, ApplicationDomain domain) : base(name, domain, ClassTag.OBJECT) { m_flags = flags; setIsDynamic((flags & ABCClassFlags.ClassSealed) == 0); }