edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C1204880
File: RubyTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;C1204880  (server)    10/11/2009 6:46 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/RubyTests.cs;InitDefMethod
@@ -295,6 +295,7 @@
                 Scenario_RubyInitializers4B,
                 Scenario_RubyInitializers4C,
                 Scenario_RubyInitializers5,
+                Scenario_RubyInitializers6,
                 RubyInitializersCaching1,
                 RubyInitializersCaching2,
                 RubyInitializersCaching3,
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/InitializerTests.cs;C966724
File: InitializerTests.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/InitializerTests.cs;C966724  (server)    10/11/2009 6:46 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/InitializerTests.cs;InitDefMethod
@@ -13,6 +13,7 @@
  *
  * ***************************************************************************/
 
+using IronRuby.Runtime;
 namespace IronRuby.Tests {
     public partial class Tests {
 
@@ -176,6 +177,24 @@
 ");
         }
 
+        public void Scenario_RubyInitializers6() {
+            TestOutput(@"
+class C
+  undef :initialize rescue p $!
+
+  define_method(:initialize) { |*args| p args }
+  new(1,2,3)
+
+  def initialize; puts 'init'; end
+  new
+end
+", @"
+#<TypeError: Cannot undefine `initialize' method>
+[1, 2, 3]
+init
+");
+        }
+
         public void RubyInitializersCaching1() {
             AssertOutput(delegate() {
                 CompilerTest(@"
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyClass.cs;C1200585
File: RubyClass.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyClass.cs;C1200585  (server)    10/11/2009 6:46 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyClass.cs;InitDefMethod
@@ -1216,15 +1216,16 @@
 
                 initializer = ResolveMethodForSiteNoLock(Symbols.Initialize, VisibilityContext.AllVisible).Info;
 
-                // Initializer resolves to Object#initializer unless overridden in a derived class.
-                // We ensure that this method cannot be removed.
+                // Initializer resolves to Object#initialize unless overridden in a derived class.
+                // We ensure that initializer cannot be removed/undefined so that we don't ever fall back to method_missing.
                 Debug.Assert(initializer != null);
             }
 
-            bool hasRubyInitializer = initializer is RubyMethodInfo;
-            bool hasLibraryInitializer = !hasRubyInitializer && !initializer.DeclaringModule.IsObjectClass && initializer is RubyLibraryMethodInfo;
+            bool isLibraryMethod = initializer is RubyLibraryMethodInfo;
+            bool isRubyInitializer = initializer.IsRubyMember && !isLibraryMethod;
+            bool isLibraryInitializer = isLibraryMethod && !initializer.DeclaringModule.IsObjectClass;
 
-            if (hasRubyInitializer || hasLibraryInitializer && _isRubyClass) {
+            if (isRubyInitializer || isLibraryInitializer && _isRubyClass) {
                 // allocate and initialize:
                 bool allocatorFound = BuildAllocatorCall(metaBuilder, args, () => AstUtils.Constant(Name));
                 if (metaBuilder.Error) {
@@ -1299,11 +1300,11 @@
             var instanceVariable = metaBuilder.GetTemporary(instanceExpr.Type, "#instance");
 
             // We know an exact type of the new instance and that there is no singleton for that instance.
-            // We also have the exact method we need to call ("initialize" is a RubyMethodInfo).
+            // We also have the exact method we need to call ("initialize" is a RubyMethodInfo/RubyLambdaMethodInfo).
             // => no tests are necessary:
             args.SetTarget(instanceVariable, null);
 
-            if (initializer is RubyMethodInfo) {
+            if (initializer is RubyMethodInfo || initializer is RubyLambdaMethodInfo) {
                 initializer.BuildCallNoFlow(metaBuilder, args, Symbols.Initialize);
             } else {
                 // TODO: we need more refactoring of RubyMethodGroupInfo.BuildCall to be able to inline this:
===================================================================
edit: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyModule.cs;C1158858
File: RubyModule.cs
===================================================================
--- $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyModule.cs;C1158858  (server)    10/11/2009 6:49 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01_s/Merlin/Main/Languages/Ruby/Ruby/Builtins/RubyModule.cs;InitDefMethod
@@ -1249,6 +1249,10 @@
                     IsClass ? "class" : "module", _name, _context.RuntimeId));
             }
 
+            if (method.IsUndefined && name == Symbols.Initialize) {
+                throw RubyExceptions.CreateTypeError("Cannot undefine `initialize' method");
+            }
+
             PrepareMethodUpdate(name, method);
 
             InitializeMethodsNoLock();
===================================================================
