Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
        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);
        }