private static bool CheckOptionalArgs(ClassFile classFile, ClassFile.BootstrapMethod bsm, ClassFile.ConstantType type, ref int argpos)
        {
            if (bsm.ArgumentCount - argpos < 1)
            {
                return(false);
            }
            if (classFile.GetConstantPoolConstantType(bsm.GetArgument(argpos)) != ClassFile.ConstantType.Integer)
            {
                return(false);
            }
            int count = classFile.GetConstantPoolConstantInteger(bsm.GetArgument(argpos++));

            if (count < 0 || bsm.ArgumentCount - argpos < count)
            {
                return(false);
            }
            for (int i = 0; i < count; i++)
            {
                if (classFile.GetConstantPoolConstantType(bsm.GetArgument(argpos++)) != type)
                {
                    return(false);
                }
            }
            return(true);
        }
 private static bool IsLambdaMetafactory(ClassFile classFile, ClassFile.BootstrapMethod bsm)
 {
     ClassFile.ConstantPoolItemMethodHandle mh;
     return(bsm.ArgumentCount == 3 &&
            classFile.GetConstantPoolConstantType(bsm.GetArgument(0)) == ClassFile.ConstantType.MethodType &&
            classFile.GetConstantPoolConstantType(bsm.GetArgument(1)) == ClassFile.ConstantType.MethodHandle &&
            classFile.GetConstantPoolConstantType(bsm.GetArgument(2)) == ClassFile.ConstantType.MethodType &&
            (mh = classFile.GetConstantPoolConstantMethodHandle(bsm.BootstrapMethodIndex)).Kind == ClassFile.RefKind.invokeStatic &&
            IsLambdaMetafactory(mh.Member));
 }
        private static bool IsLambdaAltMetafactory(ClassFile classFile, ClassFile.BootstrapMethod bsm)
        {
            ClassFile.ConstantPoolItemMethodHandle mh;
            AltFlags flags;
            int      argpos = 4;

            return(bsm.ArgumentCount >= 4 &&
                   (mh = classFile.GetConstantPoolConstantMethodHandle(bsm.BootstrapMethodIndex)).Kind == ClassFile.RefKind.invokeStatic &&
                   IsLambdaAltMetafactory(mh.Member) &&
                   classFile.GetConstantPoolConstantType(bsm.GetArgument(0)) == ClassFile.ConstantType.MethodType &&
                   classFile.GetConstantPoolConstantType(bsm.GetArgument(1)) == ClassFile.ConstantType.MethodHandle &&
                   classFile.GetConstantPoolConstantType(bsm.GetArgument(2)) == ClassFile.ConstantType.MethodType &&
                   classFile.GetConstantPoolConstantType(bsm.GetArgument(3)) == ClassFile.ConstantType.Integer &&
                   ((flags = (AltFlags)classFile.GetConstantPoolConstantInteger(bsm.GetArgument(3))) & ~AltFlags.Mask) == 0 &&
                   ((flags & AltFlags.Markers) == 0 || CheckOptionalArgs(classFile, bsm, ClassFile.ConstantType.Class, ref argpos)) &&
                   ((flags & AltFlags.Bridges) == 0 || CheckOptionalArgs(classFile, bsm, ClassFile.ConstantType.MethodType, ref argpos)) &&
                   argpos == bsm.ArgumentCount);
        }
Пример #4
0
 internal ClassFile.ConstantType GetConstantType(int offset)
 {
     return(ClassFile.GetConstantPoolConstantType(Code[OpcodeIndex + offset].Arg1));
 }