edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C1039865
File: RubyTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C1039865  (server)    8/3/2009 3:40 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;VirtualEvents
@@ -400,6 +400,7 @@
                 ClrOverride2,
                 ClrOverride3,
                 //TODO: Fix ClrOverride4,
+                ClrEventImpl1,
                 ClrDetachedVirtual1,
                 ClrConstructor1,
                 ClrConstructor2,
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/ClrTests.cs;C1039865
File: ClrTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/ClrTests.cs;C1039865  (server)    8/3/2009 3:40 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/ClrTests.cs;VirtualEvents
@@ -1467,6 +1467,53 @@
 ");
         }
 
+        public class ClassWithVirtualEvent1 {
+            public virtual event Func<int, int> OnEvent;
+
+            public int Fire(int arg) {
+                return OnEvent(arg);
+            }
+        }
+
+        public void ClrEventImpl1() {
+            // TODO: fix
+            if (_driver.PartialTrust) return;
+
+            var e = new ClassWithVirtualEvent1();
+            Context.ObjectClass.SetConstant("E", Context.GetClass(typeof(ClassWithVirtualEvent1)));
+
+            var f = Engine.Execute<ClassWithVirtualEvent1>(@"
+class F < E
+  def add_OnEvent handler
+    puts 'add ' + handler.inspect
+    super
+  end
+
+  def remove_OnEvent handler
+    puts 'remove ' + handler.inspect
+    super
+  end
+end
+
+F.new
+");
+            var handler = new Func<int, int>((i) => i + 1);
+
+            AssertOutput(() => f.OnEvent += handler, @"add System.Func`2[System.Int32,System.Int32]");
+            var r = f.Fire(10);
+            Assert(r == 11);
+            AssertOutput(() => f.OnEvent -= handler, @"remove System.Func`2[System.Int32,System.Int32]");
+
+            TestOutput(@"
+f = F.new
+f.on_event { |x| x * 2 }
+puts f.fire(10)
+", @"
+add System.Func`2[System.Int32,System.Int32]
+20
+");
+        }
+
         #endregion
 
         #region Virtual method overrides
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/ClsTypeEmitter.cs;C934537
File: ClsTypeEmitter.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/ClsTypeEmitter.cs;C934537  (server)    8/3/2009 2:40 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Compiler/Generation/ClsTypeEmitter.cs;VirtualEvents
@@ -301,16 +301,13 @@
                     }
                 }
             } else if (!TryOverrideProperty(mi, overridden)) {
-                string name;
                 EventInfo[] eis = mi.DeclaringType.GetEvents(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                 foreach (EventInfo ei in eis) {
                     if (ei.GetAddMethod() == mi) {
-                        if (!TryGetName(mi.DeclaringType, ei, mi, out name)) return;
-                        CreateVTableEventOverride(mi, mi.Name);
+                        CreateVTableMethodOverride(mi, mi.Name);
                         return;
                     } else if (ei.GetRemoveMethod() == mi) {
-                        if (!TryGetName(mi.DeclaringType, ei, mi, out name)) return;
-                        CreateVTableEventOverride(mi, mi.Name);
+                        CreateVTableMethodOverride(mi, mi.Name);
                         return;
                     }
                 }
@@ -511,27 +508,6 @@
             return impl;
         }
 
-        private void CreateVTableEventOverride(MethodInfo mi, string name) {
-#if TODO
-            // override the add/remove method  
-            MethodBuilder impl;
-            ILGen il = DefineMethodOverride(mi, out impl);
-
-            LocalBuilder callTarget = EmitBaseClassCallCheckForProperties(il, mi, name);
-
-            il.Emit(OpCodes.Ldloc, callTarget);
-            il.EmitLoadArg(0);
-            il.EmitLoadArg(0);
-            EmitClassObjectFromInstance(il);
-            il.EmitLoadArg(1);
-            il.EmitBoxing(mi.GetParameters()[0].ParameterType);
-            il.Emit(OpCodes.Ldstr, name);
-            il.EmitCall(EventHelper());
-            il.Emit(OpCodes.Ret);
-            _tb.DefineMethodOverride(impl, mi);
-#endif
-        }
-
         private MethodBuilder CreateVTableMethodOverride(MethodInfo mi, string name) {
             ParameterInfo[] parameters = mi.GetParameters();
             MethodBuilder impl;
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyUtils.cs;C1031592
File: RubyUtils.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyUtils.cs;C1031592  (server)    8/3/2009 5:49 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyUtils.cs;VirtualEvents
@@ -309,6 +309,8 @@
                             return null;
                         }
                     }
+                } else if (c == '_') {
+                    return null;
                 } else {
                     if (mangled != null) {
                         mangled.Append(c);
===================================================================
