Tue Mar 5 18:09:34 CET 2002 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Tue, 5 Mar 2002 13:27:51 +0000 (13:27 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Tue, 5 Mar 2002 13:27:51 +0000 (13:27 -0000)
* EventBuilder.cs: implemented.
* TypeBuilder.cs: implemented DefineEvent() method and UnderlyingSystemType
property.

svn path=/trunk/mcs/; revision=2909

mcs/class/corlib/System.Reflection.Emit/ChangeLog
mcs/class/corlib/System.Reflection.Emit/EventBuilder.cs
mcs/class/corlib/System.Reflection.Emit/TypeBuilder.cs

index 9d1141de5db3d4f2ae8fbaf7d70b75a02c86fbfb..8803a0a6a52c256b3d77623aacaba04cc3bfefe1 100644 (file)
@@ -1,4 +1,10 @@
 
+Tue Mar 5 18:09:34 CET 2002 Paolo Molaro <lupus@ximian.com>
+
+       * EventBuilder.cs: implemented.
+       * TypeBuilder.cs: implemented DefineEvent() method and UnderlyingSystemType
+       property.
+
 Mon Mar 4 20:34:52 CET 2002 Paolo Molaro <lupus@ximian.com>
 
        * ILGenerator.cs: make enough room in the byte array for string
index 02844a3318701d34744d62f184f72624deada1d6..8298dcdc79b2307d4fbb25a7391de4e6862181fd 100755 (executable)
@@ -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));
                }
 
 
index de6862e0825f0423b423bdc27616a535a4b2ce56..ba30dd24a2143a47609078fd6e162a6741bac707 100644 (file)
@@ -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;