equals.Block = equals_block;
equals.Define ();
- equals.PrepareEmit ();
Members.Add (equals);
//
hashcode_block.AddStatement (new Return (hash_variable, loc));
hashcode.Block = hashcode_top;
hashcode.Define ();
- hashcode.PrepareEmit ();
Members.Add (hashcode);
//
tostring_block.AddStatement (new Return (string_concat, loc));
tostring.Block = tostring_block;
tostring.Define ();
- tostring.PrepareEmit ();
Members.Add (tostring);
return true;
return;
foreach (var member in members) {
+ var pbm = member as PropertyBasedMember;
+ if (pbm != null)
+ pbm.PrepareEmit ();
+
var pm = member as IParametersMember;
if (pm != null) {
var mc = member as MethodOrOperator;
continue;
((ParametersCompiled) p).ResolveDefaultValues (member);
+ continue;
}
var c = member as Const;
type.Define ();
if ((ec.Report.Errors - errors) == 0) {
parent.Module.AddAnonymousType (type);
+ type.PrepareEmit ();
}
return type;
return false;
}
+ public void PrepareEmit ()
+ {
+ method_data.DefineMethodBuilder (Parent.PartialContainer, ParameterInfo);
+ }
+
public override void WriteDebugSymbol (MonoSymbolFile file)
{
if (method_data != null)
}
}
+ public abstract void PrepareEmit ();
+
protected override bool VerifyClsCompliance ()
{
if (!base.VerifyClsCompliance ())
{
}
- public override MethodBuilder Define (TypeContainer parent)
+ public override void Define (TypeContainer parent)
{
base.Define (parent);
method_data = new MethodData (method, ModFlags, flags, this);
- if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
- return null;
-
- method_data.DefineMethodBuilder (parent.PartialContainer, ParameterInfo);
-
- return method_data.MethodBuilder;
+ method_data.Define (parent.PartialContainer, method.GetFullName (MemberName));
}
public override TypeSpec ReturnType {
}
}
- public override MethodBuilder Define (TypeContainer parent)
+ public override void Define (TypeContainer parent)
{
parameters.Resolve (this);
method_data = new MethodData (method, ModFlags, flags, this);
- if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
- return null;
-
- method_data.DefineMethodBuilder (parent.PartialContainer, ParameterInfo);
-
- return method_data.MethodBuilder;
+ method_data.Define (parent.PartialContainer, method.GetFullName (MemberName));
}
public override TypeSpec ReturnType {
return method.IsClsComplianceRequired ();
}
- public virtual MethodBuilder Define (TypeContainer parent)
+ public virtual void Define (TypeContainer parent)
{
var container = parent.PartialContainer;
if (Compiler.Settings.WriteMetadataOnly)
block = null;
}
-
- return null;
}
public bool HasCustomAccessModifier {
if (Get != null) {
spec.Get = Get.Spec;
-
- var method = Get.Spec.GetMetaInfo () as MethodBuilder;
- if (method != null) {
- PropertyBuilder.SetGetMethod (method);
- Parent.MemberCache.AddMember (this, method.Name, Get.Spec);
- }
+ Parent.MemberCache.AddMember (this, Get.Spec.Name, Get.Spec);
} else {
CheckMissingAccessor (kind, parameters, true);
}
if (Set != null) {
spec.Set = Set.Spec;
-
- var method = Set.Spec.GetMetaInfo () as MethodBuilder;
- if (method != null) {
- PropertyBuilder.SetSetMethod (method);
- Parent.MemberCache.AddMember (this, method.Name, Set.Spec);
- }
+ Parent.MemberCache.AddMember (this, Set.Spec.Name, Set.Spec);
} else {
CheckMissingAccessor (kind, parameters, false);
}
}
}
+ public override void PrepareEmit ()
+ {
+ AccessorFirst.PrepareEmit ();
+ if (AccessorSecond != null)
+ AccessorSecond.PrepareEmit ();
+
+ if (get != null) {
+ var method = Get.Spec.GetMetaInfo () as MethodBuilder;
+ if (method != null)
+ PropertyBuilder.SetGetMethod (method);
+ }
+
+ if (set != null) {
+ var method = Set.Spec.GetMetaInfo () as MethodBuilder;
+ if (method != null)
+ PropertyBuilder.SetSetMethod (method);
+ }
+ }
+
protected override void SetMemberName (MemberName new_name)
{
base.SetMemberName (new_name);
{
}
- public override MethodBuilder Define (TypeContainer ds)
+ public override void Define (TypeContainer ds)
{
CheckAbstractAndExtern (block != null);
- return base.Define (ds);
+ base.Define (ds);
}
public override string GetSignatureForError ()
return method.IsClsComplianceRequired ();
}
- public virtual MethodBuilder Define (TypeContainer parent)
+ public virtual void Define (TypeContainer parent)
{
// Fill in already resolved event type to speed things up and
// avoid confusing duplicate errors
method.flags | MethodAttributes.HideBySig | MethodAttributes.SpecialName, this);
if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
- return null;
-
- method_data.DefineMethodBuilder (parent.PartialContainer, ParameterInfo);
+ return;
if (Compiler.Settings.WriteMetadataOnly)
block = null;
Spec = new MethodSpec (MemberKind.Method, parent.PartialContainer.Definition, this, ReturnType, ParameterInfo, method.ModFlags);
Spec.IsAccessor = true;
-
- return method_data.MethodBuilder;
}
public override TypeSpec ReturnType {
return method.GetAttributeObsolete ();
}
+ public MethodData MethodData {
+ get {
+ return method_data;
+ }
+ }
+
public override string[] ValidAttributeTargets {
get {
return attribute_targets;
//
// Now define the accessors
//
- var AddBuilder = Add.Define (Parent);
- if (AddBuilder == null)
- return false;
-
- var RemoveBuilder = remove.Define (Parent);
- if (RemoveBuilder == null)
- return false;
+ add.Define (Parent);
+ remove.Define (Parent);
EventBuilder = Parent.TypeBuilder.DefineEvent (GetFullName (MemberName), EventAttributes.None, MemberType.GetMetaInfo ());
- EventBuilder.SetAddOnMethod (AddBuilder);
- EventBuilder.SetRemoveOnMethod (RemoveBuilder);
spec = new EventSpec (Parent.Definition, this, MemberType, ModFlags, Add.Spec, remove.Spec);
Parent.MemberCache.AddMember (this, GetFullName (MemberName), spec);
- Parent.MemberCache.AddMember (this, AddBuilder.Name, Add.Spec);
- Parent.MemberCache.AddMember (this, RemoveBuilder.Name, remove.Spec);
+ Parent.MemberCache.AddMember (this, Add.Spec.Name, Add.Spec);
+ Parent.MemberCache.AddMember (this, Remove.Spec.Name, remove.Spec);
return true;
}
base.Emit ();
}
+ public override void PrepareEmit ()
+ {
+ add.PrepareEmit ();
+ remove.PrepareEmit ();
+
+ EventBuilder.SetAddOnMethod (add.MethodData.MethodBuilder);
+ EventBuilder.SetRemoveOnMethod (remove.MethodData.MethodBuilder);
+ }
+
public override void WriteDebugSymbol (MonoSymbolFile file)
{
add.WriteDebugSymbol (file);
this.parameters = parameters;
}
- public override MethodBuilder Define (TypeContainer parent)
+ public override void Define (TypeContainer parent)
{
// Disable reporting, parameters are resolved twice
Report.DisableReporting ();
Report.EnableReporting ();
}
- return base.Define (parent);
+ base.Define (parent);
}
public override ParametersCompiled ParameterInfo {
--- /dev/null
+using System;
+
+interface Iface
+{
+ int A { get; }
+
+ void B ();
+
+ event Action C;
+
+ void D (int a, string b);
+
+ string E { get; }
+}
+
+class X
+{
+ public static int Main ()
+ {
+ var res = typeof(Iface).GetMembers ();
+
+ // Ensure metadata order matches source code order
+
+ if (res [0].Name != "get_A")
+ return 1;
+
+ if (res [1].Name != "B")
+ return 2;
+
+ if (res [2].Name != "add_C")
+ return 3;
+
+ if (res [3].Name != "remove_C")
+ return 4;
+
+ if (res [4].Name != "D")
+ return 5;
+
+ if (res [5].Name != "get_E")
+ return 6;
+
+ return 0;
+ }
+}
\ No newline at end of file
</files>
<methods>
<method token="0x6000001">
- <sequencepoints>
- <entry il="0x0" row="10" col="7" file_ref="1" hidden="false" />
- <entry il="0x1" row="11" col="4" file_ref="1" hidden="false" />
- <entry il="0x8" row="12" col="3" file_ref="1" hidden="false" />
- </sequencepoints>
+ <sequencepoints />
<locals />
<scopes />
</method>
<method token="0x6000002">
<sequencepoints>
- <entry il="0x0" row="14" col="7" file_ref="1" hidden="false" />
- <entry il="0x1" row="15" col="3" file_ref="1" hidden="false" />
+ <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
+ <entry il="0x1" row="5" col="3" file_ref="1" hidden="false" />
+ <entry il="0x2" row="5" col="3" file_ref="1" hidden="false" />
+ <entry il="0x7" row="6" col="2" file_ref="1" hidden="false" />
</sequencepoints>
<locals />
<scopes />
</method>
<method token="0x6000003">
<sequencepoints>
- <entry il="0x0" row="20" col="3" file_ref="1" hidden="false" />
+ <entry il="0x0" row="10" col="7" file_ref="1" hidden="false" />
+ <entry il="0x1" row="11" col="4" file_ref="1" hidden="false" />
+ <entry il="0x8" row="12" col="3" file_ref="1" hidden="false" />
</sequencepoints>
<locals />
<scopes />
</method>
<method token="0x6000004">
<sequencepoints>
- <entry il="0x0" row="21" col="3" file_ref="1" hidden="false" />
+ <entry il="0x0" row="14" col="7" file_ref="1" hidden="false" />
+ <entry il="0x1" row="15" col="3" file_ref="1" hidden="false" />
</sequencepoints>
<locals />
<scopes />
</method>
<method token="0x6000005">
- <sequencepoints />
+ <sequencepoints>
+ <entry il="0x0" row="20" col="3" file_ref="1" hidden="false" />
+ </sequencepoints>
<locals />
<scopes />
</method>
<method token="0x6000006">
<sequencepoints>
- <entry il="0x0" row="4" col="2" file_ref="1" hidden="false" />
- <entry il="0x1" row="5" col="3" file_ref="1" hidden="false" />
- <entry il="0x2" row="5" col="3" file_ref="1" hidden="false" />
- <entry il="0x7" row="6" col="2" file_ref="1" hidden="false" />
+ <entry il="0x0" row="21" col="3" file_ref="1" hidden="false" />
</sequencepoints>
<locals />
<scopes />
<scopes />
</method>
<method token="0x6000006">
- <sequencepoints />
+ <sequencepoints>
+ <entry il="0x21" row="12" col="2" file_ref="1" hidden="false" />
+ <entry il="0x22" row="13" col="3" file_ref="1" hidden="false" />
+ <entry il="0x3d" row="14" col="2" file_ref="1" hidden="false" />
+ </sequencepoints>
<locals />
<scopes />
</method>
<scopes />
</method>
<method token="0x6000008">
- <sequencepoints>
- <entry il="0x21" row="12" col="2" file_ref="1" hidden="false" />
- <entry il="0x22" row="13" col="3" file_ref="1" hidden="false" />
- <entry il="0x3d" row="14" col="2" file_ref="1" hidden="false" />
- </sequencepoints>
+ <sequencepoints />
<locals />
<scopes />
</method>
<scopes />
</method>
<method token="0x600000e">
- <sequencepoints />
+ <sequencepoints>
+ <entry il="0x12" row="17" col="2" file_ref="1" hidden="false" />
+ <entry il="0x13" row="18" col="3" file_ref="1" hidden="false" />
+ </sequencepoints>
<locals />
<scopes />
</method>
<scopes />
</method>
<method token="0x6000010">
- <sequencepoints>
- <entry il="0x12" row="17" col="2" file_ref="1" hidden="false" />
- <entry il="0x13" row="18" col="3" file_ref="1" hidden="false" />
- </sequencepoints>
+ <sequencepoints />
<locals />
<scopes />
</method>
<scopes />
</method>
<method token="0x6000005">
- <sequencepoints />
- <locals />
- <scopes />
- </method>
- <method token="0x6000006">
- <sequencepoints />
- <locals />
- <scopes />
- </method>
- <method token="0x6000007">
<sequencepoints>
<entry il="0x27" row="7" col="2" file_ref="1" hidden="false" />
<entry il="0x28" row="8" col="3" file_ref="1" hidden="false" />
<entry index="0" start="0x42" end="0x5f" />
</scopes>
</method>
+ <method token="0x6000006">
+ <sequencepoints />
+ <locals />
+ <scopes />
+ </method>
+ <method token="0x6000007">
+ <sequencepoints />
+ <locals />
+ <scopes />
+ </method>
<method token="0x6000008">
<sequencepoints />
<locals />
<scopes />
</method>
<method token="0x6000009">
- <sequencepoints />
+ <sequencepoints>
+ <entry il="0x21" row="15" col="2" file_ref="1" hidden="false" />
+ <entry il="0x22" row="16" col="3" file_ref="1" hidden="false" />
+ <entry il="0x29" row="16" col="21" file_ref="1" hidden="false" />
+ <entry il="0x47" row="17" col="2" file_ref="1" hidden="false" />
+ </sequencepoints>
<locals />
<scopes />
</method>
<scopes />
</method>
<method token="0x600000b">
- <sequencepoints>
- <entry il="0x21" row="15" col="2" file_ref="1" hidden="false" />
- <entry il="0x22" row="16" col="3" file_ref="1" hidden="false" />
- <entry il="0x29" row="16" col="21" file_ref="1" hidden="false" />
- <entry il="0x47" row="17" col="2" file_ref="1" hidden="false" />
- </sequencepoints>
+ <sequencepoints />
<locals />
<scopes />
</method>
</files>
<methods>
<method token="0x6000001">
- <sequencepoints>
- <entry il="0x0" row="39" col="7" file_ref="1" hidden="false" />
- <entry il="0x1" row="40" col="4" file_ref="1" hidden="false" />
- <entry il="0x8" row="41" col="3" file_ref="1" hidden="false" />
- </sequencepoints>
- <locals />
- <scopes />
- </method>
- <method token="0x6000002">
<sequencepoints />
<locals />
<scopes />
</method>
- <method token="0x6000003">
+ <method token="0x6000002">
<sequencepoints>
<entry il="0x0" row="8" col="2" file_ref="1" hidden="false" />
<entry il="0x1" row="9" col="3" file_ref="1" hidden="false" />
<locals />
<scopes />
</method>
- <method token="0x6000004">
+ <method token="0x6000003">
<sequencepoints>
<entry il="0x0" row="13" col="2" file_ref="1" hidden="false" />
<entry il="0x1" row="14" col="3" file_ref="1" hidden="false" />
<locals />
<scopes />
</method>
- <method token="0x6000005">
+ <method token="0x6000004">
<sequencepoints>
<entry il="0x0" row="18" col="2" file_ref="1" hidden="false" />
<entry il="0x1" row="19" col="3" file_ref="1" hidden="false" />
<locals />
<scopes />
</method>
- <method token="0x6000006">
+ <method token="0x6000005">
<sequencepoints>
<entry il="0x0" row="23" col="2" file_ref="1" hidden="false" />
<entry il="0x1" row="24" col="3" file_ref="1" hidden="false" />
</locals>
<scopes />
</method>
- <method token="0x6000007">
+ <method token="0x6000006">
<sequencepoints>
<entry il="0x0" row="29" col="2" file_ref="1" hidden="false" />
<entry il="0x1" row="30" col="3" file_ref="1" hidden="false" />
<locals />
<scopes />
</method>
- <method token="0x6000008">
+ <method token="0x6000007">
<sequencepoints>
<entry il="0x0" row="34" col="2" file_ref="1" hidden="false" />
<entry il="0x1" row="35" col="3" file_ref="1" hidden="false" />
<locals />
<scopes />
</method>
+ <method token="0x6000008">
+ <sequencepoints>
+ <entry il="0x0" row="39" col="7" file_ref="1" hidden="false" />
+ <entry il="0x1" row="40" col="4" file_ref="1" hidden="false" />
+ <entry il="0x8" row="41" col="3" file_ref="1" hidden="false" />
+ </sequencepoints>
+ <locals />
+ <scopes />
+ </method>
<method token="0x6000009">
<sequencepoints>
<entry il="0x0" row="45" col="2" file_ref="1" hidden="false" />
</method>\r
</type>\r
</test>\r
+ <test name="test-890.cs">\r
+ <type name="X">\r
+ <method name="Int32 Main()" attrs="150">\r
+ <size>206</size>\r
+ </method>\r
+ <method name="Void .ctor()" attrs="6278">\r
+ <size>7</size>\r
+ </method>\r
+ </type>\r
+ </test>\r
<test name="test-9.cs">\r
<type name="X">\r
<method name="Int32 Main(System.String[])" attrs="150">\r