зеркало из https://github.com/mono/ikvm-fork.git
- Changed FieldInfo.__FieldOffset property to __TryGetFieldOffset() method.
- Implemented __TryGetFieldMarshal() & __TryGetFieldOffest() for FieldBuilder. - Fixed FieldBuilder to throw NotImplementedException when trying to get custom attributes on unbaked type. - Fixed FieldBuilder to return pseudo custom attributes (but it is currently still broken after the module has been saved).
This commit is contained in:
Родитель
0bdb0b74dd
Коммит
04ccbd540e
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2008 Jeroen Frijters
|
||||
Copyright (C) 2008-2012 Jeroen Frijters
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
@ -22,6 +22,7 @@
|
|||
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.CompilerServices;
|
||||
using IKVM.Reflection.Metadata;
|
||||
using IKVM.Reflection.Writer;
|
||||
|
@ -94,15 +95,30 @@ namespace IKVM.Reflection.Emit
|
|||
get { throw new NotImplementedException(); }
|
||||
}
|
||||
|
||||
public override int __FieldOffset
|
||||
public override bool __TryGetFieldOffset(out int offset)
|
||||
{
|
||||
get { throw new NotImplementedException(); }
|
||||
int token = pseudoToken;
|
||||
if (typeBuilder.ModuleBuilder.IsSaved)
|
||||
{
|
||||
token = typeBuilder.ModuleBuilder.ResolvePseudoToken(pseudoToken);
|
||||
}
|
||||
foreach (int i in typeBuilder.Module.FieldLayout.Filter(token))
|
||||
{
|
||||
offset = typeBuilder.Module.FieldLayout.records[i].Offset;
|
||||
return true;
|
||||
}
|
||||
offset = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool __TryGetFieldMarshal(out FieldMarshal fieldMarshal)
|
||||
{
|
||||
fieldMarshal = new FieldMarshal();
|
||||
return false;
|
||||
int token = pseudoToken;
|
||||
if (typeBuilder.ModuleBuilder.IsSaved)
|
||||
{
|
||||
token = typeBuilder.ModuleBuilder.ResolvePseudoToken(pseudoToken);
|
||||
}
|
||||
return FieldMarshal.ReadFieldMarshal(typeBuilder.Module, token, out fieldMarshal);
|
||||
}
|
||||
|
||||
public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
|
||||
|
@ -196,5 +212,33 @@ namespace IKVM.Reflection.Emit
|
|||
{
|
||||
return other.ImportMethodOrField(typeBuilder, name, fieldSig);
|
||||
}
|
||||
|
||||
internal override IList<CustomAttributeData> GetCustomAttributesData(Type attributeType)
|
||||
{
|
||||
if (!typeBuilder.IsCreated())
|
||||
{
|
||||
// like .NET we we don't return custom attributes for unbaked types
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
IList<CustomAttributeData> list = base.GetCustomAttributesData(attributeType);
|
||||
if (attributeType == null || attributeType.IsAssignableFrom(typeBuilder.Universe.System_Runtime_InteropServices_MarshalAsAttribute))
|
||||
{
|
||||
FieldMarshal spec;
|
||||
if (__TryGetFieldMarshal(out spec))
|
||||
{
|
||||
list.Add(spec.ToCustomAttribute(typeBuilder.Module));
|
||||
}
|
||||
}
|
||||
if (attributeType == null || attributeType.IsAssignableFrom(typeBuilder.Universe.System_Runtime_InteropServices_FieldOffsetAttribute))
|
||||
{
|
||||
int offset;
|
||||
if (__TryGetFieldOffset(out offset))
|
||||
{
|
||||
ConstructorInfo constructor = typeBuilder.Universe.System_Runtime_InteropServices_FieldOffsetAttribute.GetPseudoCustomAttributeConstructor(typeBuilder.Universe.System_Int32);
|
||||
list.Add(new CustomAttributeData(typeBuilder.Module, constructor, new object[] { offset }, null));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ namespace IKVM.Reflection
|
|||
public abstract FieldAttributes Attributes { get; }
|
||||
public abstract void __GetDataFromRVA(byte[] data, int offset, int length);
|
||||
public abstract int __FieldRVA { get; }
|
||||
public abstract int __FieldOffset { get; }
|
||||
public abstract bool __TryGetFieldOffset(out int offset);
|
||||
public abstract bool __TryGetFieldMarshal(out FieldMarshal fieldMarshal);
|
||||
public abstract Object GetRawConstantValue();
|
||||
internal abstract FieldSignature FieldSignature { get; }
|
||||
|
@ -185,9 +185,9 @@ namespace IKVM.Reflection
|
|||
get { return field.__FieldRVA; }
|
||||
}
|
||||
|
||||
public override int __FieldOffset
|
||||
public override bool __TryGetFieldOffset(out int offset)
|
||||
{
|
||||
get { return field.__FieldOffset; }
|
||||
return field.__TryGetFieldOffset(out offset);
|
||||
}
|
||||
|
||||
public override bool __TryGetFieldMarshal(out FieldMarshal fieldMarshal)
|
||||
|
|
|
@ -335,9 +335,9 @@ namespace IKVM.Reflection
|
|||
get { return field.__FieldRVA; }
|
||||
}
|
||||
|
||||
public override int __FieldOffset
|
||||
public override bool __TryGetFieldOffset(out int offset)
|
||||
{
|
||||
get { return field.__FieldOffset; }
|
||||
return field.__TryGetFieldOffset(out offset);
|
||||
}
|
||||
|
||||
public override bool __TryGetFieldMarshal(out FieldMarshal fieldMarshal)
|
||||
|
|
|
@ -975,9 +975,9 @@ namespace IKVM.Reflection
|
|||
get { return Forwarder.__FieldRVA; }
|
||||
}
|
||||
|
||||
public override int __FieldOffset
|
||||
public override bool __TryGetFieldOffset(out int offset)
|
||||
{
|
||||
get { return Forwarder.__FieldOffset; }
|
||||
return Forwarder.__TryGetFieldOffset(out offset);
|
||||
}
|
||||
|
||||
public override bool __TryGetFieldMarshal(out FieldMarshal fieldMarshal)
|
||||
|
|
|
@ -102,16 +102,15 @@ namespace IKVM.Reflection.Reader
|
|||
}
|
||||
}
|
||||
|
||||
public override int __FieldOffset
|
||||
public override bool __TryGetFieldOffset(out int offset)
|
||||
{
|
||||
get
|
||||
foreach (int i in module.FieldLayout.Filter(index + 1))
|
||||
{
|
||||
foreach (int i in module.FieldLayout.Filter(index + 1))
|
||||
{
|
||||
return module.FieldLayout.records[i].Offset;
|
||||
}
|
||||
throw new InvalidOperationException();
|
||||
offset = module.FieldLayout.records[i].Offset;
|
||||
return true;
|
||||
}
|
||||
offset = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool __TryGetFieldMarshal(out FieldMarshal fieldMarshal)
|
||||
|
@ -132,13 +131,11 @@ namespace IKVM.Reflection.Reader
|
|||
}
|
||||
if (attributeType == null || attributeType.IsAssignableFrom(module.universe.System_Runtime_InteropServices_FieldOffsetAttribute))
|
||||
{
|
||||
foreach (int i in module.FieldLayout.Filter(index + 1))
|
||||
int offset;
|
||||
if (__TryGetFieldOffset(out offset))
|
||||
{
|
||||
ConstructorInfo constructor = module.universe.System_Runtime_InteropServices_FieldOffsetAttribute.GetPseudoCustomAttributeConstructor(module.universe.System_Int32);
|
||||
list.Add(new CustomAttributeData(module, constructor,
|
||||
new object[] { module.FieldLayout.records[i].Offset },
|
||||
null));
|
||||
break;
|
||||
list.Add(new CustomAttributeData(module, constructor, new object[] { offset }, null));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
|
|
Загрузка…
Ссылка в новой задаче