Skip to content

Commit dc55175

Browse files
authored
Merge pull request #929 from Unity-Technologies/unity-master-mcs-fix-to-match-csc-behavior
[mcs] Mimic csc behaviour when attribute value is a typedef and add a…
2 parents a49f45c + 90f73a5 commit dc55175

File tree

5 files changed

+47
-12
lines changed

5 files changed

+47
-12
lines changed

mcs/mcs/assembly.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,8 @@ public virtual void Emit ()
554554
if (prop != null) {
555555
AttributeEncoder encoder = new AttributeEncoder ();
556556
encoder.EncodeNamedPropertyArgument (prop, new BoolLiteral (Compiler.BuiltinTypes, true, Location.Null));
557-
SetCustomAttribute (pa.Constructor, encoder.ToArray ());
557+
SetCustomAttribute (pa.Constructor, encoder.ToArray (out var references));
558+
module.AddAssemblyReferences (references);
558559
}
559560
}
560561
}

mcs/mcs/attribute.cs

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,8 +1053,10 @@ public void Emit (Dictionary<Attribute, List<Attribute>> allEmitted)
10531053
}
10541054

10551055
byte[] cdata;
1056+
List<Assembly> references;
10561057
if (pos_args == null && named_values == null) {
10571058
cdata = AttributeEncoder.Empty;
1059+
references = null;
10581060
} else {
10591061
AttributeEncoder encoder = new AttributeEncoder ();
10601062

@@ -1127,7 +1129,7 @@ public void Emit (Dictionary<Attribute, List<Attribute>> allEmitted)
11271129
encoder.EncodeEmptyNamedArguments ();
11281130
}
11291131

1130-
cdata = encoder.ToArray ();
1132+
cdata = encoder.ToArray (out references);
11311133
}
11321134

11331135
if (!IsConditionallyExcluded (ctor.DeclaringType)) {
@@ -1146,6 +1148,8 @@ public void Emit (Dictionary<Attribute, List<Attribute>> allEmitted)
11461148
Error_AttributeEmitError (e.Message);
11471149
return;
11481150
}
1151+
1152+
context.Module.AddAssemblyReferences (references);
11491153
}
11501154

11511155
if (!usage_attr.AllowMultiple && allEmitted != null) {
@@ -1404,6 +1408,7 @@ public enum EncodedTypeProperties
14041408
byte[] buffer;
14051409
int pos;
14061410
const ushort Version = 1;
1411+
List<Assembly> imports;
14071412

14081413
static AttributeEncoder ()
14091414
{
@@ -1583,7 +1588,15 @@ public EncodedTypeProperties Encode (TypeSpec type)
15831588
public void EncodeTypeName (TypeSpec type)
15841589
{
15851590
var old_type = type.GetMetaInfo ();
1586-
Encode (type.MemberDefinition.IsImported ? old_type.AssemblyQualifiedName : old_type.FullName);
1591+
if (type.MemberDefinition.IsImported) {
1592+
if (imports == null)
1593+
imports = new List<Assembly> ();
1594+
1595+
imports.Add (old_type.Assembly);
1596+
Encode (old_type.AssemblyQualifiedName);
1597+
} else {
1598+
Encode (old_type.FullName);
1599+
}
15871600
}
15881601

15891602
public void EncodeTypeName (TypeContainer type)
@@ -1664,8 +1677,10 @@ void WriteCompressedValue (int value)
16641677
Encode (value);
16651678
}
16661679

1667-
public byte[] ToArray ()
1680+
public byte[] ToArray (out List<Assembly> assemblyReferences)
16681681
{
1682+
assemblyReferences = imports;
1683+
16691684
byte[] buf = new byte[pos];
16701685
Array.Copy (buffer, buf, pos);
16711686
return buf;
@@ -1977,7 +1992,8 @@ public void EmitAttribute (FieldBuilder builder, System.Diagnostics.DebuggerBrow
19771992
encoder.Encode ((int) state);
19781993
encoder.EncodeEmptyNamedArguments ();
19791994

1980-
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ());
1995+
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray (out var references));
1996+
module.AddAssemblyReferences (references);
19811997
}
19821998
}
19831999

@@ -2011,7 +2027,8 @@ public void EmitAttribute (AssemblyBuilder builder, System.Diagnostics.Debuggabl
20112027
encoder.Encode ((int) modes);
20122028
encoder.EncodeEmptyNamedArguments ();
20132029

2014-
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ());
2030+
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray (out var references));
2031+
module.AddAssemblyReferences (references);
20152032
}
20162033
}
20172034

@@ -2037,7 +2054,8 @@ public void EmitAttribute (ParameterBuilder builder, decimal value, Location loc
20372054
encoder.Encode ((uint) bits[0]);
20382055
encoder.EncodeEmptyNamedArguments ();
20392056

2040-
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ());
2057+
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray (out var references));
2058+
module.AddAssemblyReferences (references);
20412059
}
20422060

20432061
public void EmitAttribute (FieldBuilder builder, decimal value, Location loc)
@@ -2055,7 +2073,8 @@ public void EmitAttribute (FieldBuilder builder, decimal value, Location loc)
20552073
encoder.Encode ((uint) bits[0]);
20562074
encoder.EncodeEmptyNamedArguments ();
20572075

2058-
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ());
2076+
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray (out var references));
2077+
module.AddAssemblyReferences (references);
20592078
}
20602079
}
20612080

@@ -2079,7 +2098,8 @@ public void EmitAttribute (MethodBuilder builder, StateMachine type)
20792098
encoder.EncodeTypeName (type);
20802099
encoder.EncodeEmptyNamedArguments ();
20812100

2082-
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ());
2101+
builder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray (out var references));
2102+
module.AddAssemblyReferences (references);
20832103
}
20842104
}
20852105

mcs/mcs/class.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2105,7 +2105,8 @@ void EmitIndexerName ()
21052105
encoder.Encode (GetAttributeDefaultMember ());
21062106
encoder.EncodeEmptyNamedArguments ();
21072107

2108-
TypeBuilder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ());
2108+
TypeBuilder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray (out var references));
2109+
Module.AddAssemblyReferences (references);
21092110
}
21102111

21112112
public override void VerifyMembers ()

mcs/mcs/field.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ void EmitFieldSize (int buffer_size)
542542
}
543543
);
544544

545-
fixed_buffer_type.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ());
545+
fixed_buffer_type.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray (out _));
546546
#endif
547547
//
548548
// Don't emit FixedBufferAttribute attribute for private types
@@ -559,7 +559,8 @@ void EmitFieldSize (int buffer_size)
559559
encoder.Encode (buffer_size);
560560
encoder.EncodeEmptyNamedArguments ();
561561

562-
FieldBuilder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray ());
562+
FieldBuilder.SetCustomAttribute ((ConstructorInfo) ctor.GetMetaInfo (), encoder.ToArray (out var references));
563+
Module.AddAssemblyReferences (references);
563564
}
564565
}
565566

mcs/mcs/module.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,18 @@ public void AddAttribute (Attribute attr, IMemberContext context)
472472
attributes.AddAttribute (attr);
473473
}
474474

475+
public void AddAssemblyReferences (List<Assembly> names)
476+
{
477+
if (names == null)
478+
return;
479+
480+
#if STATIC
481+
foreach (var name in names) {
482+
Builder.__GetAssemblyToken (name);
483+
}
484+
#endif
485+
}
486+
475487
public override void AddTypeContainer (TypeContainer tc)
476488
{
477489
AddTypeContainerMember (tc);

0 commit comments

Comments
 (0)