internal ABCMethodInfo( int abcIndex, ABCMultiname returnTypeName, string methodName, ABCMethodFlags flags, ABCMultiname[] paramTypeNames, string?[]?paramNames, ASAny[]?paramDefaultValues ) { m_abcIndex = abcIndex; m_paramTypeNames = paramTypeNames; m_paramNames = paramNames; m_paramDefaultValues = paramDefaultValues; m_returnTypeName = returnTypeName; m_methodName = methodName; m_flags = flags; }
private void _readMethodInfo() { const ABCMethodFlags validMethodFlags = ABCMethodFlags.NEED_REST | ABCMethodFlags.HAS_OPTIONAL | ABCMethodFlags.NEED_ACTIVATION | ABCMethodFlags.NEED_ARGUMENTS | ABCMethodFlags.SET_DXNS | ABCMethodFlags.HAS_PARAM_NAMES; int methodCount = _readU30(); var methodInfoArr = new ABCMethodInfo[methodCount]; for (int i = 0; i < methodCount; i++) { int paramCount = _readU30(); ABCMultiname retTypeName = m_abcFile.resolveMultiname(_readU30()); ABCMultiname[] paramTypeNames = Array.Empty <ABCMultiname>(); ASAny[]? defaultValues = null; string?[]? paramNames = null; if (paramCount != 0) { paramTypeNames = new ABCMultiname[paramCount]; for (int j = 0; j < paramCount; j++) { paramTypeNames[j] = m_abcFile.resolveMultiname(_readU30()); } } string methodName = m_abcFile.resolveString(_readU30()) ?? ""; ABCMethodFlags methodFlags = (ABCMethodFlags)_readU8(); if ((methodFlags & ~validMethodFlags) != 0) { throw ErrorHelper.createError(ErrorCode.METHOD_INFO_INVALID_FLAGS, i, (int)methodFlags); } // NEED_ARGUMENTS and NEED_REST cannot be set together. const ABCMethodFlags needArgumentsOrRest = ABCMethodFlags.NEED_ARGUMENTS | ABCMethodFlags.NEED_REST; if ((methodFlags & needArgumentsOrRest) == needArgumentsOrRest) { throw ErrorHelper.createError(ErrorCode.METHOD_INFO_INVALID_FLAGS, i, (int)methodFlags); } if ((methodFlags & ABCMethodFlags.HAS_OPTIONAL) != 0) { int optionCount = _readU30(); if (optionCount > paramCount) { throw ErrorHelper.createError(ErrorCode.MARIANA__ABC_METHOD_INFO_OPTIONAL_EXCEEDS_PARAM, i); } defaultValues = new ASAny[optionCount]; for (int j = 0; j < optionCount; j++) { int val = _readU30(); var kind = (ABCConstKind)_readU8(); defaultValues[j] = m_abcFile.resolveConstant(kind, val); } } if ((methodFlags & ABCMethodFlags.HAS_PARAM_NAMES) != 0) { paramNames = new string?[paramCount]; for (int j = 0; j < paramNames.Length; j++) { paramNames[j] = m_abcFile.resolveString(_readU30()); } } methodInfoArr[i] = new ABCMethodInfo( i, retTypeName, methodName, methodFlags, paramTypeNames, paramNames, defaultValues); } m_abcFile.setMethodInfo(methodInfoArr); }