You've already forked linux-packaging-mono
Imported Upstream version 4.2.0.179
Former-commit-id: 4610231f55806d2a05ed69e5ff3faa7336cc1479
This commit is contained in:
committed by
Jo Shields
parent
aa7da660d6
commit
c042cd0c52
@@ -20,18 +20,17 @@ namespace Mono.ILASM {
|
||||
public class CustomAttr {
|
||||
|
||||
private BaseMethodRef method_ref;
|
||||
private byte[] data;
|
||||
|
||||
public CustomAttr (BaseMethodRef method_ref, byte[] data)
|
||||
PEAPI.Constant constant;
|
||||
public CustomAttr (BaseMethodRef method_ref, PEAPI.Constant constant)
|
||||
{
|
||||
this.method_ref = method_ref;
|
||||
this.data = data;
|
||||
this.method_ref = method_ref;
|
||||
this.constant = constant;
|
||||
}
|
||||
|
||||
public void AddTo (CodeGen code_gen, PEAPI.MetaDataElement elem)
|
||||
{
|
||||
method_ref.Resolve (code_gen);
|
||||
code_gen.PEFile.AddCustomAttribute (method_ref.PeapiMethod, data, elem);
|
||||
code_gen.PEFile.AddCustomAttribute (method_ref.PeapiMethod, constant, elem);
|
||||
}
|
||||
|
||||
public bool IsSuppressUnmanaged (CodeGen codegen)
|
||||
|
@@ -707,13 +707,16 @@ namespace Mono.ILASM {
|
||||
if (IsVararg)
|
||||
signature = CreateVarargSignature (RetType, name, param_list);
|
||||
else
|
||||
signature = CreateSignature (RetType, name, param_list, GenParamCount);
|
||||
signature = CreateSignature (RetType, name, param_list, GenParamCount, Attributes);
|
||||
}
|
||||
|
||||
static string CreateSignature (BaseTypeRef RetType, string name, IList param_list, int gen_param_count)
|
||||
static string CreateSignature (BaseTypeRef RetType, string name, IList param_list, int gen_param_count, PEAPI.MethAttr attrs)
|
||||
{
|
||||
StringBuilder builder = new StringBuilder ();
|
||||
|
||||
if ((attrs & PEAPI.MethAttr.Static) == 0)
|
||||
builder.Append ("instance ");
|
||||
|
||||
builder.Append (RetType.FullName);
|
||||
builder.Append (" ");
|
||||
builder.Append (name);
|
||||
@@ -777,10 +780,10 @@ namespace Mono.ILASM {
|
||||
if ((call_conv & PEAPI.CallConv.Vararg) != 0)
|
||||
return CreateVarargSignature (RetType, name, param_list, include_optional);
|
||||
else
|
||||
return CreateSignature (RetType, name, param_list, gen_param_count, include_optional);
|
||||
return CreateSignature (RetType, name, param_list, gen_param_count, include_optional, call_conv);
|
||||
}
|
||||
|
||||
static string CreateVarargSignature (BaseTypeRef RetType, string name, BaseTypeRef [] param_list, bool include_optional)
|
||||
static string CreateVarargSignature (BaseTypeRef RetType, string name, BaseTypeRef [] param_list, bool include_optional)
|
||||
{
|
||||
StringBuilder builder = new StringBuilder ();
|
||||
BaseTypeRef last = null;
|
||||
@@ -815,10 +818,14 @@ namespace Mono.ILASM {
|
||||
return builder.ToString ();
|
||||
}
|
||||
|
||||
static string CreateSignature (BaseTypeRef RetType, string name, BaseTypeRef[] param_list, int gen_param_count, bool include_optional)
|
||||
static string CreateSignature (BaseTypeRef RetType, string name, BaseTypeRef[] param_list, int gen_param_count, bool include_optional, PEAPI.CallConv call_conv)
|
||||
{
|
||||
StringBuilder builder = new StringBuilder ();
|
||||
|
||||
if ((call_conv & PEAPI.CallConv.Instance) != 0)
|
||||
builder.Append ("instance ");
|
||||
|
||||
|
||||
builder.Append (RetType.FullName);
|
||||
builder.Append (" ");
|
||||
builder.Append (name);
|
||||
|
@@ -32,13 +32,6 @@ namespace Mono.ILASM {
|
||||
if (owner_def == null)
|
||||
Report.Error ("Reference to undefined class '" + owner.FullName + "'");
|
||||
|
||||
string write_name;
|
||||
|
||||
if (name == "<init>")
|
||||
write_name = ".ctor";
|
||||
else
|
||||
write_name = name;
|
||||
|
||||
if ((call_conv & PEAPI.CallConv.Vararg) == 0) {
|
||||
peapi_method = owner_def.ResolveMethod (ret_type, call_conv, name,
|
||||
param, gen_param_count, code_gen);
|
||||
|
@@ -104,7 +104,7 @@ namespace Mono.ILASM {
|
||||
}
|
||||
|
||||
public void MakeCustomModified (CodeGen code_gen, PEAPI.CustomModifier modifier,
|
||||
BaseClassRef klass)
|
||||
BaseTypeRef klass)
|
||||
{
|
||||
use_type_spec = true;
|
||||
conversion_list.Add (ConversionMethod.MakeCustomModified);
|
||||
@@ -143,7 +143,7 @@ namespace Mono.ILASM {
|
||||
break;
|
||||
case ConversionMethod.MakeCustomModified:
|
||||
peapi_type.MakeCustomModified (code_gen, (PEAPI.CustomModifier) conversion_list[++i],
|
||||
(BaseClassRef) conversion_list[++i]);
|
||||
(BaseTypeRef) conversion_list[++i]);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@@ -13,8 +13,8 @@ using System.Collections;
|
||||
|
||||
namespace Mono.ILASM {
|
||||
public class Pair {
|
||||
private PEAPI.Type type;
|
||||
private string sig;
|
||||
protected PEAPI.Type type;
|
||||
protected string sig;
|
||||
|
||||
public Pair (PEAPI.Type type, string sig)
|
||||
{
|
||||
@@ -38,6 +38,31 @@ namespace Mono.ILASM {
|
||||
}
|
||||
}
|
||||
|
||||
class Triplet : Pair
|
||||
{
|
||||
string typeMod;
|
||||
|
||||
public Triplet (PEAPI.Type type, string sig, string typeMod)
|
||||
: base (type, sig)
|
||||
{
|
||||
this.typeMod = typeMod;
|
||||
}
|
||||
|
||||
public override int GetHashCode ()
|
||||
{
|
||||
return base.GetHashCode () ^ typeMod.GetHashCode ();
|
||||
}
|
||||
|
||||
public override bool Equals (object o)
|
||||
{
|
||||
Triplet t = o as Triplet;
|
||||
if (t == null)
|
||||
return false;
|
||||
|
||||
return t.type == type && t.sig == sig && t.typeMod == typeMod;
|
||||
}
|
||||
}
|
||||
|
||||
public class PeapiTypeRef {
|
||||
|
||||
private PEAPI.Type peapi_type;
|
||||
@@ -196,23 +221,34 @@ namespace Mono.ILASM {
|
||||
}
|
||||
|
||||
public void MakeCustomModified (CodeGen code_gen, PEAPI.CustomModifier modifier,
|
||||
BaseClassRef klass)
|
||||
BaseTypeRef klass)
|
||||
{
|
||||
PEAPI.Type type;
|
||||
|
||||
use_type_spec = true;
|
||||
|
||||
Pair p = new Pair (peapi_type, modifier.ToString ());
|
||||
Pair p = new Triplet (peapi_type, modifier.ToString (), klass.FullName);
|
||||
type = type_table [p] as PEAPI.Type;
|
||||
if (type == null) {
|
||||
klass.Resolve (code_gen);
|
||||
type = new PEAPI.CustomModifiedType (peapi_type,
|
||||
modifier, klass.PeapiClass);
|
||||
type = GetType (code_gen, modifier, klass);
|
||||
type_table [p] = type;
|
||||
}
|
||||
peapi_type = type;
|
||||
}
|
||||
|
||||
PEAPI.Type GetType (CodeGen code_gen, PEAPI.CustomModifier modifier, BaseTypeRef klass)
|
||||
{
|
||||
klass.Resolve (code_gen);
|
||||
var bcr = klass as BaseClassRef;
|
||||
if (bcr != null)
|
||||
return new PEAPI.CustomModifiedType (peapi_type, modifier, bcr.PeapiClass);
|
||||
|
||||
var pt = klass as PrimitiveTypeRef;
|
||||
return new PEAPI.CustomModifiedType (peapi_type, modifier, code_gen.PEFile.AddPrimitiveType ((PEAPI.PrimitiveType) pt.PeapiType));
|
||||
|
||||
throw new NotSupportedException (klass.GetType ().ToString ());
|
||||
}
|
||||
|
||||
public void MakePinned ()
|
||||
{
|
||||
use_type_spec = true;
|
||||
|
@@ -354,7 +354,6 @@ namespace Mono.ILASM {
|
||||
if (!IsValueType (name_space, name) && !IsEnumType (name_space, name) &&
|
||||
is_value_class && (attr & PEAPI.TypeAttr.Sealed) == 0) {
|
||||
|
||||
Report.Warning (location, "Non-sealed value class, made sealed.");
|
||||
attr |= PEAPI.TypeAttr.Sealed;
|
||||
}
|
||||
|
||||
@@ -416,6 +415,10 @@ namespace Mono.ILASM {
|
||||
{
|
||||
ArrayList fielddef_list = new ArrayList ();
|
||||
foreach (FieldDef fielddef in field_list) {
|
||||
if (is_enum_class && fielddef.Name == "value__") {
|
||||
fielddef.Attributes |= PEAPI.FieldAttr.SpecialName | PEAPI.FieldAttr.RTSpecialName;
|
||||
}
|
||||
|
||||
fielddef.Define (code_gen, classdef);
|
||||
fielddef_list.Add (fielddef.PeapiFieldDef);
|
||||
}
|
||||
|
@@ -1 +1 @@
|
||||
2a6561756ff339d7201714af7cf18c9985fb6dee
|
||||
8f994051c9abc1c6e40e55aca9c53effc5bd5b71
|
27
mcs/ilasm/tests/custom-attrs-01.il
Normal file
27
mcs/ilasm/tests/custom-attrs-01.il
Normal file
@@ -0,0 +1,27 @@
|
||||
.assembly extern mscorlib
|
||||
{
|
||||
}
|
||||
|
||||
.assembly 'custom-attrs-01'
|
||||
{
|
||||
}
|
||||
|
||||
.class interface public abstract auto ansi I1
|
||||
{
|
||||
.custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string)
|
||||
= {bytearray(55 05)}
|
||||
.method public hidebysig newslot specialname abstract virtual
|
||||
instance int32 get_A(int32 x) cil managed
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
.class interface public abstract auto ansi I2
|
||||
{
|
||||
.custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string)
|
||||
= {string('B')}
|
||||
.method public hidebysig newslot specialname abstract virtual
|
||||
instance int32 get_B(int32 x) cil managed
|
||||
{
|
||||
}
|
||||
}
|
46
mcs/ilasm/tests/test-custom-mod-2.il
Normal file
46
mcs/ilasm/tests/test-custom-mod-2.il
Normal file
@@ -0,0 +1,46 @@
|
||||
.assembly extern mscorlib
|
||||
{
|
||||
}
|
||||
|
||||
.assembly 'test-custom-mod-2'
|
||||
{
|
||||
}
|
||||
|
||||
.class interface public abstract auto ansi I
|
||||
{
|
||||
.custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string)
|
||||
= {string('Item')}
|
||||
.method public hidebysig newslot specialname abstract virtual instance char
|
||||
get_P() cil managed
|
||||
{
|
||||
}
|
||||
|
||||
.method public hidebysig newslot specialname abstract virtual instance void
|
||||
set_P(char 'value') cil managed
|
||||
{
|
||||
}
|
||||
|
||||
.method public hidebysig newslot specialname abstract virtual instance int32
|
||||
get_Item(bool x) cil managed
|
||||
{
|
||||
}
|
||||
|
||||
.method public hidebysig newslot specialname abstract virtual instance void
|
||||
set_Item(bool x,
|
||||
int32 'value') cil managed
|
||||
{
|
||||
}
|
||||
|
||||
.property instance char modopt(int8) P()
|
||||
{
|
||||
.get instance char I::get_P()
|
||||
.set instance void I::set_P(char)
|
||||
}
|
||||
|
||||
.property instance int32 modopt(int8) Item(bool modopt(int16))
|
||||
{
|
||||
.get instance int32 I::get_Item(bool)
|
||||
.set instance void I::set_Item(bool,
|
||||
int32)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user