Skip to content
This repository was archived by the owner on Nov 1, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/ILToNative/repro/project.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"dependencies": {
"System.Runtime": "4.0.0",
"System.Runtime": "4.0.20",
"System.Resources.ResourceManager": "4.0.0",
"System.Reflection.Primitives": "4.0.0",
"System.Diagnostics.Debug": "4.0.0",
Expand Down
63 changes: 36 additions & 27 deletions src/TypeSystem/src/Ecma/EcmaField.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ static class FieldFlags
public const int Static = 0x0002;
public const int InitOnly = 0x0004;
public const int Literal = 0x0008;
public const int HasRva = 0x0010;

public const int AttributeMetadataCache = 0x0100;
public const int ThreadStatic = 0x0200;
Expand All @@ -29,8 +30,10 @@ static class FieldFlags
EcmaType _type;
FieldDefinitionHandle _handle;

TypeDesc _fieldType;
// Cached values
volatile int _fieldFlags;
TypeDesc _fieldType;
string _name;

internal EcmaField(EcmaType type, FieldDefinitionHandle handle)
{
Expand Down Expand Up @@ -77,30 +80,23 @@ public FieldDefinitionHandle Handle
return _handle;
}
}

public FieldDefinition FieldDefinition
{
get
{
return this.MetadataReader.GetFieldDefinition(_handle);
}
}

void ComputeFieldType()
private TypeDesc InitializeFieldType()
{
var metadataReader = this.Module.MetadataReader;
var metadataReader = MetadataReader;
BlobReader signatureReader = metadataReader.GetBlobReader(metadataReader.GetFieldDefinition(_handle).Signature);

EcmaSignatureParser parser = new EcmaSignatureParser(this.Module, signatureReader);
_fieldType = parser.ParseFieldSignature();
EcmaSignatureParser parser = new EcmaSignatureParser(Module, signatureReader);
var fieldType = parser.ParseFieldSignature();
return (_fieldType = fieldType);
}

public override TypeDesc FieldType
{
get
{
if (_fieldType == null)
ComputeFieldType();
return InitializeFieldType();
return _fieldType;
}
}
Expand All @@ -112,9 +108,8 @@ private int InitializeFieldFlags(int mask)

if ((mask & FieldFlags.BasicMetadataCache) != 0)
{
var fieldDefinition = this.MetadataReader.GetFieldDefinition(_handle);
var fieldAttributes = Attributes;

var fieldAttributes = fieldDefinition.Attributes;
if ((fieldAttributes & FieldAttributes.Static) != 0)
flags |= FieldFlags.Static;

Expand All @@ -124,6 +119,9 @@ private int InitializeFieldFlags(int mask)
if ((fieldAttributes & FieldAttributes.Literal) != 0)
flags |= FieldFlags.Literal;

if ((fieldAttributes & FieldAttributes.HasFieldRVA) != 0)
flags |= FieldFlags.HasRva;

flags |= FieldFlags.BasicMetadataCache;
}

Expand Down Expand Up @@ -200,6 +198,14 @@ public override bool IsInitOnly
}
}

public override bool HasRva
{
get
{
return (GetFieldFlags(FieldFlags.BasicMetadataCache | FieldFlags.HasRva) & FieldFlags.HasRva) != 0;
}
}

public bool IsLiteral
{
get
Expand All @@ -212,32 +218,35 @@ public FieldAttributes Attributes
{
get
{
var fieldDefinition = this.MetadataReader.GetFieldDefinition(_handle);
return fieldDefinition.Attributes;
return MetadataReader.GetFieldDefinition(_handle).Attributes;
}
}

private string InitializeName()
{
var metadataReader = MetadataReader;
var name = metadataReader.GetString(metadataReader.GetFieldDefinition(_handle).Name);
return (_name = name);
}

public override string Name
{
get
{
var metadataReader = this.MetadataReader;
var fieldDefinition = metadataReader.GetFieldDefinition(_handle);
return metadataReader.GetString(fieldDefinition.Name);
if (_name == null)
return InitializeName();
return _name;
}
}

public override bool HasRva
public bool HasCustomAttribute(string customAttributeName)
{
get
{
return (FieldDefinition.Attributes & FieldAttributes.HasFieldRVA) != 0;
}
return Module.HasCustomAttribute(MetadataReader.GetFieldDefinition(_handle).GetCustomAttributes(), customAttributeName);
}

public override string ToString()
{
return _type.ToString() + "." + this.Name;
return _type.ToString() + "." + Name;
}
}
}
93 changes: 48 additions & 45 deletions src/TypeSystem/src/Ecma/EcmaMethod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,16 @@ enum MethodFlags
EcmaType _type;
MethodDefinitionHandle _handle;

MethodDefinition _methodDefinition;

// Cached values
MethodSignature _signature;
MethodFlags _methodFlags;
MethodSignature _signature;
string _name;
TypeDesc[] _genericParameters; // TODO: Optional field?

internal EcmaMethod(EcmaType type, MethodDefinitionHandle handle)
{
_type = type;
_handle = handle;

_methodDefinition = type.MetadataReader.GetMethodDefinition(handle);
}

public override TypeSystemContext Context
Expand All @@ -55,20 +53,22 @@ public override TypeDesc OwningType
}
}

void ComputeSignature()
private MethodSignature InitializeSignature()
{
BlobReader signatureReader = this.MetadataReader.GetBlobReader(_methodDefinition.Signature);
var metadataReader = MetadataReader;
BlobReader signatureReader = metadataReader.GetBlobReader(metadataReader.GetMethodDefinition(_handle).Signature);

EcmaSignatureParser parser = new EcmaSignatureParser(this.Module, signatureReader);
_signature = parser.ParseMethodSignature();
EcmaSignatureParser parser = new EcmaSignatureParser(Module, signatureReader);
var signature = parser.ParseMethodSignature();
return (_signature = signature);
}

public override MethodSignature Signature
{
get
{
if (_signature == null)
ComputeSignature();
return InitializeSignature();
return _signature;
}
}
Expand Down Expand Up @@ -97,22 +97,15 @@ public MethodDefinitionHandle Handle
}
}

public MethodDefinition MethodDefinition
{
get
{
return _methodDefinition;
}
}

[MethodImpl(MethodImplOptions.NoInlining)]
private MethodFlags InitializeMethodFlags(MethodFlags mask)
{
MethodFlags flags = 0;

if ((mask & MethodFlags.BasicMetadataCache) != 0)
{
var methodAttributes = _methodDefinition.Attributes;
var methodAttributes = Attributes;

if ((methodAttributes & MethodAttributes.Virtual) != 0)
flags |= MethodFlags.Virtual;

Expand Down Expand Up @@ -157,64 +150,73 @@ public MethodAttributes Attributes
{
get
{
return _methodDefinition.Attributes;
return MetadataReader.GetMethodDefinition(_handle).Attributes;
}
}

public MethodImplAttributes ImplAttributes
{
get
{
return _methodDefinition.ImplAttributes;
return MetadataReader.GetMethodDefinition(_handle).ImplAttributes;
}
}

private string InitializeName()
{
var metadataReader = MetadataReader;
var name = metadataReader.GetString(metadataReader.GetMethodDefinition(_handle).Name);
return (_name = name);
}

public override string Name
{
get
{
return this.MetadataReader.GetString(_methodDefinition.Name);
if (_name == null)
return InitializeName();
return _name;
}
}

TypeDesc[] _genericParameters;
void ComputeGenericParameters()
{
var genericParameterHandles = MetadataReader.GetMethodDefinition(_handle).GetGenericParameters();
int count = genericParameterHandles.Count;
if (count > 0)
{
TypeDesc[] genericParameters = new TypeDesc[count];
int i = 0;
foreach (var genericParameterHandle in genericParameterHandles)
{
genericParameters[i++] = new EcmaGenericParameter(Module, genericParameterHandle);
}
Interlocked.CompareExchange(ref _genericParameters, genericParameters, null);
}
else
{
_genericParameters = TypeDesc.EmptyTypes;
}
}

public override Instantiation Instantiation
{
get
{
if (_genericParameters == null)
{
var genericParameterHandles = _methodDefinition.GetGenericParameters();
int count = genericParameterHandles.Count;
if (count > 0)
{
TypeDesc[] genericParameters = new TypeDesc[count];
int i = 0;
foreach (var genericParameterHandle in genericParameterHandles)
{
genericParameters[i++] = new EcmaGenericParameter(this.Module, genericParameterHandle);
}
Interlocked.CompareExchange(ref _genericParameters, genericParameters, null);
}
else
{
_genericParameters = TypeDesc.EmptyTypes;
}
}

ComputeGenericParameters();
return new Instantiation(_genericParameters);
}
}

public bool HasCustomAttribute(string customAttributeName)
{
return this.Module.HasCustomAttribute(_methodDefinition.GetCustomAttributes(), customAttributeName);
return Module.HasCustomAttribute(MetadataReader.GetMethodDefinition(_handle).GetCustomAttributes(), customAttributeName);
}

public override string ToString()
{
return "[" + Module.GetName().Name + "]" + _type.ToString() + "." + this.Name;
return _type.ToString() + "." + Name;
}

public bool IsPInvoke()
Expand All @@ -227,7 +229,8 @@ public string GetPInvokeImportName()
if (((int)Attributes & (int)MethodAttributes.PinvokeImpl) == 0)
return null;

return this.MetadataReader.GetString(_methodDefinition.GetImport().Name);
var metadataReader = MetadataReader;
return metadataReader.GetString(metadataReader.GetMethodDefinition(_handle).GetImport().Name);
}
}

Expand Down
Loading