Skip to content

Commit

Permalink
Merge pull request #1 from Unity-Technologies/winrtprojections
Browse files Browse the repository at this point in the history
Winrtprojections
  • Loading branch information
TautvydasZilys committed Apr 7, 2016
2 parents be2c62d + 11e00d7 commit 8b5cd83
Show file tree
Hide file tree
Showing 13 changed files with 1,177 additions and 21 deletions.
2 changes: 2 additions & 0 deletions Mono.Cecil.csproj
Expand Up @@ -55,8 +55,10 @@
<Compile Include="Mono.Cecil\AssemblyWriter.cs" />
<Compile Include="Mono.Cecil\BaseAssemblyResolver.cs" />
<Compile Include="Mono.Cecil\CallSite.cs" />
<Compile Include="Mono.Cecil\Treatments.cs" />
<Compile Include="Mono.Cecil\TypeParser.cs" />
<Compile Include="Mono.Cecil\Import.cs" />
<Compile Include="Mono.Cecil\WindowsRuntimeProjections.cs" />
<Compile Include="Mono.Collections.Generic\Collection.cs" />
<Compile Include="Mono.Cecil\ExportedType.cs" />
<Compile Include="Mono.Cecil\SecurityDeclaration.cs" />
Expand Down
55 changes: 48 additions & 7 deletions Mono.Cecil/AssemblyReader.cs
Expand Up @@ -78,6 +78,8 @@ public static ModuleDefinition CreateModuleFrom (Image image, ReaderParameters p
#endif
#endif

GetMetadataKind(module, parameters);

reader.ReadModule ();

ReadSymbols (module, parameters);
Expand Down Expand Up @@ -105,6 +107,23 @@ static void ReadSymbols (ModuleDefinition module, ReaderParameters parameters)
}
}

static void GetMetadataKind (ModuleDefinition module, ReaderParameters parameters)
{
if (!parameters.ApplyWindowsRuntimeProjections) {
module.MetadataKind = MetadataKind.Ecma335;
return;
}

var runtime_version = module.RuntimeVersion;

if (!runtime_version.Contains ("WindowsRuntime"))
module.MetadataKind = MetadataKind.Ecma335;
else if (runtime_version.Contains ("CLR"))
module.MetadataKind = MetadataKind.ManagedWindowsMetadata;
else
module.MetadataKind = MetadataKind.WindowsMetadata;
}

static ModuleReader CreateModuleReader (Image image, ReadingMode mode)
{
switch (mode) {
Expand Down Expand Up @@ -535,7 +554,11 @@ public Collection<AssemblyNameReference> ReadAssemblyReferences ()
{
InitializeAssemblyReferences ();

return new Collection<AssemblyNameReference> (metadata.AssemblyReferences);
var references = new Collection<AssemblyNameReference> (metadata.AssemblyReferences);
if (module.MetadataKind != MetadataKind.Ecma335)
module.Projections.AddVirtualReferences (references);

return references;
}

public MethodDefinition ReadEntryPoint ()
Expand Down Expand Up @@ -875,6 +898,9 @@ TypeDefinition ReadType (uint rid)
if (IsNested (attributes))
type.DeclaringType = GetNestedTypeDeclaringType (type);

if (module.MetadataKind != MetadataKind.Ecma335)
WindowsRuntimeProjections.Project (type);

return type;
}

Expand Down Expand Up @@ -1058,6 +1084,9 @@ TypeReference ReadTypeReference (uint rid)

MetadataSystem.TryProcessPrimitiveTypeReference (type);

if (type.Module.MetadataKind != MetadataKind.Ecma335)
WindowsRuntimeProjections.Project (type);

return type;
}

Expand Down Expand Up @@ -1205,6 +1234,9 @@ void ReadField (uint field_rid, Collection<FieldDefinition> fields)
return;

fields.Add (field);

if (module.MetadataKind != MetadataKind.Ecma335)
WindowsRuntimeProjections.Project (field);
}

void InitializeFields ()
Expand Down Expand Up @@ -1720,12 +1752,14 @@ void ReadMethod (uint method_rid, Collection<MethodDefinition> methods)
ReadMethodSignature (signature, method);
metadata.AddMethodDefinition (method);

if (param_range.Length == 0)
return;
if (param_range.Length != 0) {
var position = base.position;
ReadParameters (method, param_range);
base.position = position;
}

var position = base.position;
ReadParameters (method, param_range);
base.position = position;
if (module.MetadataKind != MetadataKind.Ecma335)
WindowsRuntimeProjections.Project (method);
}

void ReadParameters (MethodDefinition method, Range param_range)
Expand Down Expand Up @@ -2237,6 +2271,9 @@ MemberReference ReadMemberReference (uint rid)

member.token = new MetadataToken (TokenType.MemberRef, rid);

if (module.MetadataKind != MetadataKind.Ecma335)
WindowsRuntimeProjections.Project (member);

return member;
}

Expand Down Expand Up @@ -2407,6 +2444,10 @@ public Collection<CustomAttribute> ReadCustomAttributes (ICustomAttributeProvide

metadata.RemoveCustomAttributeRange (owner);

if (module.MetadataKind != MetadataKind.Ecma335)
foreach (var custom_attribute in custom_attributes)
WindowsRuntimeProjections.Project (owner, custom_attribute);

return custom_attributes;
}

Expand All @@ -2415,7 +2456,7 @@ void ReadCustomAttributeRange (Range range, Collection<CustomAttribute> custom_a
if (!MoveTo (Table.CustomAttribute, range.Start))
return;

for (int i = 0; i < range.Length; i++) {
for (var i = 0; i < range.Length; i++) {
ReadMetadataToken (CodedIndex.HasCustomAttribute);

var constructor = (MethodReference) LookupToken (
Expand Down
49 changes: 40 additions & 9 deletions Mono.Cecil/AssemblyWriter.cs
Expand Up @@ -918,6 +918,9 @@ void AddAssemblyReferences ()
var references = module.AssemblyReferences;
var table = GetTable<AssemblyRefTable> (Table.AssemblyRef);

if (module.MetadataKind != MetadataKind.Ecma335)
module.Projections.RemoveVirtualReferences (references);

for (int i = 0; i < references.Count; i++) {
var reference = references [i];

Expand All @@ -940,6 +943,9 @@ void AddAssemblyReferences ()

reference.token = new MetadataToken (TokenType.AssemblyRef, rid);
}

if (module.MetadataKind != MetadataKind.Ecma335)
module.Projections.AddVirtualReferences (references);
}

void AddModuleReferences ()
Expand Down Expand Up @@ -1158,13 +1164,17 @@ MetadataToken AddTypeSpecification (TypeReference type, uint row)

MetadataToken GetTypeRefToken (TypeReference type)
{
var projection = WindowsRuntimeProjections.RemoveProjection (type);

var row = CreateTypeRefRow (type);

MetadataToken token;
if (type_ref_map.TryGetValue (row, out token))
return token;
if (!type_ref_map.TryGetValue (row, out token))
token = AddTypeReference (type, row);

WindowsRuntimeProjections.ApplyProjection (type, projection);

return AddTypeReference (type, row);
return token;
}

TypeRefRow CreateTypeRefRow (TypeReference type)
Expand Down Expand Up @@ -1219,6 +1229,8 @@ void AddTypeDefs ()

void AddType (TypeDefinition type)
{
var treatment = WindowsRuntimeProjections.RemoveProjection (type);

type_def_table.AddRow (new TypeDefRow (
type.Attributes,
GetStringIndex (type.Name),
Expand Down Expand Up @@ -1256,6 +1268,8 @@ void AddType (TypeDefinition type)

if (type.HasNestedTypes)
AddNestedTypes (type);

WindowsRuntimeProjections.ApplyProjection (type, treatment);
}

void AddGenericParameters (IGenericParameterProvider owner)
Expand Down Expand Up @@ -1365,6 +1379,8 @@ void AddFields (TypeDefinition type)

void AddField (FieldDefinition field)
{
var projection = WindowsRuntimeProjections.RemoveProjection (field);

field_table.AddRow (new FieldRow (
field.Attributes,
GetStringIndex (field.Name),
Expand All @@ -1384,6 +1400,8 @@ void AddField (FieldDefinition field)

if (field.HasMarshalInfo)
AddMarshalInfo (field);

WindowsRuntimeProjections.ApplyProjection (field, projection);
}

void AddFieldRVA (FieldDefinition field)
Expand All @@ -1410,6 +1428,8 @@ void AddMethods (TypeDefinition type)

void AddMethod (MethodDefinition method)
{
var projection = WindowsRuntimeProjections.RemoveProjection (method);

method_table.AddRow (new MethodRow (
method.HasBody ? code.WriteMethodBody (method) : 0,
method.ImplAttributes,
Expand All @@ -1434,6 +1454,8 @@ void AddMethod (MethodDefinition method)

if (method.HasOverrides)
AddOverrides (method);

WindowsRuntimeProjections.ApplyProjection (method, projection);
}

void AddParameters (MethodDefinition method)
Expand Down Expand Up @@ -1716,10 +1738,14 @@ void AddCustomAttributes (ICustomAttributeProvider owner)
for (int i = 0; i < custom_attributes.Count; i++) {
var attribute = custom_attributes [i];

var projection = WindowsRuntimeProjections.RemoveProjection (attribute);

custom_attribute_table.AddRow (new CustomAttributeRow (
MakeCodedRID (owner, CodedIndex.HasCustomAttribute),
MakeCodedRID (LookupToken (attribute.Constructor), CodedIndex.CustomAttributeType),
GetBlobIndex (GetCustomAttributeSignature (attribute))));

WindowsRuntimeProjections.ApplyProjection (attribute, projection);
}
}

Expand All @@ -1739,15 +1765,17 @@ void AddSecurityDeclarations (ISecurityDeclarationProvider owner)

MetadataToken GetMemberRefToken (MemberReference member)
{
var projection = WindowsRuntimeProjections.RemoveProjection (member);

var row = CreateMemberRefRow (member);

MetadataToken token;
if (member_ref_map.TryGetValue (row, out token))
return token;
if (!member_ref_map.TryGetValue (row, out token))
token = AddMemberReference (member, row);

AddMemberReference (member, row);
WindowsRuntimeProjections.ApplyProjection (member, projection);

return member.token;
return token;
}

MemberRefRow CreateMemberRefRow (MemberReference member)
Expand All @@ -1758,10 +1786,13 @@ MemberRefRow CreateMemberRefRow (MemberReference member)
GetBlobIndex (GetMemberRefSignature (member)));
}

void AddMemberReference (MemberReference member, MemberRefRow row)
MetadataToken AddMemberReference (MemberReference member, MemberRefRow row)
{
member.token = new MetadataToken (TokenType.MemberRef, member_ref_table.AddRow (row));
member_ref_map.Add (row, member.token);

var token = member.token;
member_ref_map.Add (row, token);
return token;
}

MetadataToken GetMethodSpecToken (MethodSpecification method_spec)
Expand Down
1 change: 1 addition & 0 deletions Mono.Cecil/CustomAttribute.cs
Expand Up @@ -68,6 +68,7 @@ public interface ICustomAttribute {

public sealed class CustomAttribute : ICustomAttribute {

internal CustomAttributeValueProjection projection;
readonly internal uint signature;
internal bool resolved;
MethodReference constructor;
Expand Down
12 changes: 11 additions & 1 deletion Mono.Cecil/FieldDefinition.cs
Expand Up @@ -8,6 +8,7 @@
// Licensed under the MIT/X11 license.
//

using System;
using Mono.Collections.Generic;

namespace Mono.Cecil {
Expand Down Expand Up @@ -62,6 +63,11 @@ void ResolveLayout ()
set { offset = value; }
}

internal new FieldDefinitionProjection WindowsRuntimeProjection {
get { return (FieldDefinitionProjection) projection; }
set { projection = value; }
}

void ResolveRVA ()
{
if (rva != Mixin.NotResolvedMarker)
Expand Down Expand Up @@ -104,7 +110,11 @@ void ResolveRVA ()

public FieldAttributes Attributes {
get { return (FieldAttributes) attributes; }
set { attributes = (ushort) value; }
set {
if (IsWindowsRuntimeProjection && (ushort) value != attributes)
throw new InvalidOperationException ("Projected field definition attributes can't be changed.");
attributes = (ushort) value;
}
}

public bool HasConstant {
Expand Down
18 changes: 17 additions & 1 deletion Mono.Cecil/MemberReference.cs
Expand Up @@ -8,6 +8,8 @@
// Licensed under the MIT/X11 license.
//

using System;

namespace Mono.Cecil {

public abstract class MemberReference : IMetadataTokenProvider {
Expand All @@ -16,10 +18,15 @@ public abstract class MemberReference : IMetadataTokenProvider {
TypeReference declaring_type;

internal MetadataToken token;
internal object projection;

public virtual string Name {
get { return name; }
set { name = value; }
set {
if (IsWindowsRuntimeProjection && value != name)
throw new InvalidOperationException ("Projected member reference name can't be changed.");
name = value;
}
}

public abstract string FullName {
Expand All @@ -36,6 +43,15 @@ public abstract class MemberReference : IMetadataTokenProvider {
set { token = value; }
}

public bool IsWindowsRuntimeProjection {
get { return projection != null; }
}

internal MemberReferenceProjection WindowsRuntimeProjection {
get { return (MemberReferenceProjection) projection; }
set { projection = value; }
}

internal bool HasImage {
get {
var module = Module;
Expand Down

0 comments on commit 8b5cd83

Please sign in to comment.