- 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:
jfrijters 2012-07-13 07:37:54 +00:00
Родитель 0bdb0b74dd
Коммит 04ccbd540e
5 изменённых файлов: 65 добавлений и 24 удалений

Просмотреть файл

@ -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;