Parcourir la source

Tue Mar 5 18:09:34 CET 2002 Paolo Molaro <[email protected]>

	* EventBuilder.cs: implemented.
	* TypeBuilder.cs: implemented DefineEvent() method and UnderlyingSystemType
	property.

svn path=/trunk/mcs/; revision=2909
Paolo Molaro il y a 24 ans
Parent
commit
ce2ebac87c

+ 6 - 0
mcs/class/corlib/System.Reflection.Emit/ChangeLog

@@ -1,4 +1,10 @@
 
+Tue Mar 5 18:09:34 CET 2002 Paolo Molaro <[email protected]>
+
+	* EventBuilder.cs: implemented.
+	* TypeBuilder.cs: implemented DefineEvent() method and UnderlyingSystemType
+	property.
+
 Mon Mar 4 20:34:52 CET 2002 Paolo Molaro <[email protected]>
 
 	* ILGenerator.cs: make enough room in the byte array for string

+ 47 - 2
mcs/class/corlib/System.Reflection.Emit/EventBuilder.cs

@@ -17,21 +17,66 @@ using System.Runtime.InteropServices;
 
 namespace System.Reflection.Emit {
 	public sealed class EventBuilder {
+		string name;
+		Type type;
+		TypeBuilder typeb;
+		CustomAttributeBuilder[] cattrs;
+		MethodBuilder add_method;
+		MethodBuilder remove_method;
+		MethodBuilder raise_method;
+		MethodBuilder[] other_methods;
+		EventAttributes attrs;
+		int table_idx;
+
+		internal EventBuilder (TypeBuilder tb, string eventName, EventAttributes eventAttrs, Type eventType) {
+			name = eventName;
+			attrs = eventAttrs;
+			type = eventType;
+			typeb = tb;
+			table_idx = get_next_table_index (0x14, true);
+		}
+
+		internal int get_next_table_index (int table, bool inc) {
+			return typeb.get_next_table_index (table, inc);
+		}
+
 		public void AddOtherMethod( MethodBuilder mdBuilder) {
+			if (other_methods != null) {
+				MethodBuilder[] newv = new MethodBuilder [other_methods.Length + 1];
+				other_methods.CopyTo (newv, 0);
+				other_methods = newv;
+			} else {
+				other_methods = new MethodBuilder [1];
+			}
+			other_methods [other_methods.Length - 1] = mdBuilder;
 		}
-		public EventToken GetEventToken() {
-			return new EventToken();
+		
+		public EventToken GetEventToken () {
+			return new EventToken (0x14000000 | table_idx);
 		}
 		public void SetAddOnMethod( MethodBuilder mdBuilder) {
+			add_method = mdBuilder;
 		}
 		public void SetRaiseMethod( MethodBuilder mdBuilder) {
+			raise_method = mdBuilder;
 		}
 		public void SetRemoveOnMethod( MethodBuilder mdBuilder) {
+			remove_method = mdBuilder;
 		}
 
 		public void SetCustomAttribute( CustomAttributeBuilder customBuilder) {
+			if (cattrs != null) {
+				CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1];
+				cattrs.CopyTo (new_array, 0);
+				new_array [cattrs.Length] = customBuilder;
+				cattrs = new_array;
+			} else {
+				cattrs = new CustomAttributeBuilder [1];
+				cattrs [0] = customBuilder;
+			}
 		}
 		public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute) {
+			SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));
 		}
 
 

+ 21 - 2
mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs

@@ -27,6 +27,7 @@ namespace System.Reflection.Emit {
 	private ConstructorBuilder[] ctors;
 	private PropertyBuilder[] properties;
 	private FieldBuilder[] fields;
+	private EventBuilder[] events;
 	private CustomAttributeBuilder[] cattrs;
 	internal TypeBuilder[] subtypes;
 	private TypeAttributes attrs;
@@ -78,7 +79,15 @@ namespace System.Reflection.Emit {
 		}
 		public override Type DeclaringType {get {return null;}}
 		public override Type UnderlyingSystemType {
-			get {return null;}
+			get {
+				if (fields != null) {
+					foreach (FieldBuilder f in fields) {
+						if ((f.Attributes & FieldAttributes.Static) == 0)
+							return f.FieldType;
+					}
+				}
+				throw new InvalidOperationException ();
+			}
 		}
 
 		public override string FullName {
@@ -547,7 +556,17 @@ namespace System.Reflection.Emit {
 		}
 
 		public EventBuilder DefineEvent( string name, EventAttributes attributes, Type eventtype) {
-			throw new NotImplementedException ();
+			EventBuilder res = new EventBuilder (this, name, attributes, eventtype);
+			if (events != null) {
+				EventBuilder[] new_events = new EventBuilder [events.Length+1];
+				System.Array.Copy (events, new_events, events.Length);
+				new_events [events.Length] = res;
+				events = new_events;
+			} else {
+				events = new EventBuilder [1];
+				events [0] = res;
+			}
+			return res;
 		}
 
 		static int InitializedDataCount = 0;