Ejemplo n.º 1
0
        public static ConstantPoolEntry FromMemory(ref IntPtr pointer)
        {
            ConstantType type = (ConstantType)Marshal.ReadByte(pointer);

            switch (type)
            {
            case ConstantType.Utf8:
                ushort length = ByteSwap((ushort)Marshal.ReadInt16(pointer, 1));
                unsafe
                {
                    var result = new ConstantUtf8(ModifiedUTF8Encoding.GetString((byte *)(pointer + 3), length));
                    pointer += 3 + length;
                    return(result);
                }

            case ConstantType.Integer:
            {
                var result = new ConstantInteger((int)ByteSwap((uint)Marshal.ReadInt32(pointer, 1)));
                pointer += 5;
                return(result);
            }

            case ConstantType.Float:
            {
                var result = new ConstantFloat(ValueHelper.Int32BitsToSingle((int)ByteSwap((uint)Marshal.ReadInt32(pointer, 1))));
                pointer += 5;
                return(result);
            }

            case ConstantType.Long:
            {
                var result = new ConstantLong((long)ByteSwap((ulong)Marshal.ReadInt64(pointer, 1)));
                pointer += 9;
                return(result);
            }

            case ConstantType.Double:
            {
                var result = new ConstantDouble(BitConverter.Int64BitsToDouble((long)ByteSwap((ulong)Marshal.ReadInt64(pointer, 1))));
                pointer += 9;
                return(result);
            }

            case ConstantType.Class:
            {
                ushort nameIndex = ByteSwap((ushort)Marshal.ReadInt16(pointer, 1));
                var    result    = new ConstantClass(nameIndex);
                pointer += 3;
                return(result);
            }

            case ConstantType.String:
            {
                ushort stringIndex = ByteSwap((ushort)Marshal.ReadInt16(pointer, 1));
                var    result      = new ConstantString(stringIndex);
                pointer += 3;
                return(result);
            }

            case ConstantType.FieldReference:
            {
                ushort classIndex       = ByteSwap((ushort)Marshal.ReadInt16(pointer, 1));
                ushort nameAndTypeIndex = ByteSwap((ushort)Marshal.ReadInt16(pointer, 3));
                var    result           = new ConstantFieldReference(classIndex, nameAndTypeIndex);
                pointer += 5;
                return(result);
            }

            case ConstantType.MethodReference:
            {
                ushort classIndex       = ByteSwap((ushort)Marshal.ReadInt16(pointer, 1));
                ushort nameAndTypeIndex = ByteSwap((ushort)Marshal.ReadInt16(pointer, 3));
                var    result           = new ConstantMethodReference(classIndex, nameAndTypeIndex);
                pointer += 5;
                return(result);
            }

            case ConstantType.InterfaceMethodReference:
            {
                ushort classIndex       = ByteSwap((ushort)Marshal.ReadInt16(pointer, 1));
                ushort nameAndTypeIndex = ByteSwap((ushort)Marshal.ReadInt16(pointer, 3));
                var    result           = new ConstantInterfaceMethodReference(classIndex, nameAndTypeIndex);
                pointer += 5;
                return(result);
            }

            case ConstantType.NameAndType:
            {
                ushort nameIndex       = ByteSwap((ushort)Marshal.ReadInt16(pointer, 1));
                ushort descriptorIndex = ByteSwap((ushort)Marshal.ReadInt16(pointer, 3));
                var    result          = new ConstantNameAndType(nameIndex, descriptorIndex);
                pointer += 5;
                return(result);
            }

            case ConstantType.MethodHandle:
            {
                MethodHandleKind referenceKind  = (MethodHandleKind)Marshal.ReadByte(pointer, 1);
                ushort           referenceIndex = ByteSwap((ushort)Marshal.ReadInt16(pointer, 2));
                var result = new ConstantMethodHandle(referenceKind, referenceIndex);
                pointer += 4;
                return(result);
            }

            case ConstantType.MethodType:
            {
                ushort descriptorIndex = ByteSwap((ushort)Marshal.ReadInt16(pointer, 1));
                var    result          = new ConstantMethodType(descriptorIndex);
                pointer += 3;
                return(result);
            }

            case ConstantType.InvokeDynamic:
            {
                ushort bootstrapMethodAttrIndex = ByteSwap((ushort)Marshal.ReadInt16(pointer, 1));
                ushort nameAndTypeIndex         = ByteSwap((ushort)Marshal.ReadInt16(pointer, 3));
                var    result = new ConstantInvokeDynamic(bootstrapMethodAttrIndex, nameAndTypeIndex);
                pointer += 5;
                return(result);
            }

            case ConstantType.Invalid:
            default:
                throw new ArgumentException(string.Format("Unknown constant type: {0}", type));
            }
        }
 public ConstantMethodHandle(MethodHandleKind referenceKind, ushort referenceIndex)
 {
     _referenceKind  = referenceKind;
     _referenceIndex = referenceIndex;
 }
Ejemplo n.º 3
0
 public ConstantMethodHandle(MethodHandleKind referenceKind, ushort referenceIndex)
 {
     _referenceKind = referenceKind;
     _referenceIndex = referenceIndex;
 }