<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -23,9 +23,11 @@ Project(&quot;{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&quot;) = &quot;Microsoft.Scripting.Extensi
 EndProject
 Project(&quot;{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&quot;) = &quot;Microsoft.Dynamic&quot;, &quot;..\..\..\..\ndp\fx\src\Dynamic\System\Dynamic\Microsoft.Dynamic.csproj&quot;, &quot;{D4AE44AD-07B9-41DC-BB3B-1FDCDE3C987D}&quot;
 EndProject
+Project(&quot;{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}&quot;) = &quot;Microsoft.Scripting.Debugging&quot;, &quot;..\..\Debugging\Microsoft.Scripting.Debugging\Microsoft.Scripting.Debugging.csproj&quot;, &quot;{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}&quot;
+EndProject
 Global
 	GlobalSection(TeamFoundationVersionControl) = preSolution
-		SccNumberOfProjects = 11
+		SccNumberOfProjects = 12
 		SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
 		SccTeamFoundationServer = http://vstfdevdiv:8080/
 		SccProjectUniqueName0 = IronPython\\IronPython.csproj
@@ -78,11 +80,16 @@ Global
 		SccAuxPath9 = http://vstfdevdiv:8080
 		SccLocalPath9 = ..\\..\\..\\..\\ndp\\fx\\src\\Core\\Microsoft\\Scripting
 		SccProvider9 = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
-		SccProjectUniqueName10 = ..\\..\\..\\..\\ndp\\fx\\src\\Dynamic\\System.Dynamic.csproj
-		SccProjectName10 = ../../../../ndp/fx/src/DynamicCom
+		SccProjectUniqueName10 = ..\\..\\..\\..\\ndp\\fx\\src\\Dynamic\\System\\Dynamic\\Microsoft.Dynamic.csproj
+		SccProjectName10 = ../../../../ndp/fx/src/Dynamic/System/Dynamic
 		SccAuxPath10 = http://vstfdevdiv:8080
-		SccLocalPath10 = ..\\..\\..\\..\\ndp\\fx\\src\\DynamicCom
+		SccLocalPath10 = ..\\..\\..\\..\\ndp\\fx\\src\\Dynamic\\System\\Dynamic
 		SccProvider10 = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
+		SccProjectUniqueName11 = ..\\..\\Debugging\\Microsoft.Scripting.Debugging\\Microsoft.Scripting.Debugging.csproj
+		SccProjectName11 = ../../Debugging/Microsoft.Scripting.Debugging
+		SccAuxPath11 = http://vstfdevdiv:8080
+		SccLocalPath11 = ..\\..\\Debugging\\Microsoft.Scripting.Debugging
+		SccProvider11 = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
 	EndGlobalSection
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Build Debug|Any CPU = Build Debug|Any CPU
@@ -242,6 +249,24 @@ Global
 		{D4AE44AD-07B9-41DC-BB3B-1FDCDE3C987D}.Signed Release|Any CPU.ActiveCfg = Release|Any CPU
 		{D4AE44AD-07B9-41DC-BB3B-1FDCDE3C987D}.Silverlight Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{D4AE44AD-07B9-41DC-BB3B-1FDCDE3C987D}.Silverlight Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Build Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Build Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Build Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Build Release|Any CPU.Build.0 = Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.FxCop|Any CPU.ActiveCfg = Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.FxCop|Any CPU.Build.0 = Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Release|Any CPU.Build.0 = Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Signed Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Signed Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Signed Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Signed Release|Any CPU.Build.0 = Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Silverlight Debug|Any CPU.ActiveCfg = Silverlight Debug|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Silverlight Debug|Any CPU.Build.0 = Silverlight Debug|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Silverlight Release|Any CPU.ActiveCfg = Silverlight Release|Any CPU
+		{ED82A346-1CD9-4CB0-9C00-4CDD4CF577CF}.Silverlight Release|Any CPU.Build.0 = Silverlight Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE</diff>
      <filename>Merlin/Main/Languages/IronPython/IronPython.sln</filename>
    </modified>
    <modified>
      <diff>@@ -461,7 +461,7 @@
     &lt;/ProjectReference&gt;
     &lt;ProjectReference Include=&quot;..\..\..\..\..\ndp\fx\src\Dynamic\System\Dynamic\Microsoft.Dynamic.csproj&quot; Condition=&quot; '$(SilverlightBuild)' != 'true' &quot;&gt;
       &lt;Project&gt;{D4AE44AD-07B9-41DC-BB3B-1FDCDE3C987D}&lt;/Project&gt;
-      &lt;Name&gt;System.Dynamic&lt;/Name&gt;
+      &lt;Name&gt;Microsoft.Dynamic&lt;/Name&gt;
     &lt;/ProjectReference&gt;
     &lt;ProjectReference Include=&quot;..\..\..\Runtime\Microsoft.Scripting\Microsoft.Scripting.csproj&quot;&gt;
       &lt;Project&gt;{EB66B766-6354-4208-A3D4-AACBDCB5C3B3}&lt;/Project&gt;
@@ -533,4 +533,4 @@
   &lt;Target Name=&quot;AfterBuild&quot;&gt;
   &lt;/Target&gt;
   --&gt;
-&lt;/Project&gt;
+&lt;/Project&gt;
\ No newline at end of file</diff>
      <filename>Merlin/Main/Languages/IronPython/IronPython/IronPython.csproj</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>Merlin/Main/Languages/Ruby/IronRuby.Tests/IronRuby.Tests.Build.csproj</filename>
    </modified>
    <modified>
      <diff>@@ -151,6 +151,7 @@ Backtrace3.rb:0
         }
 
         public void Backtrace4() {
+#if TODO
             // TODO: need to fix interpreter
             if (_driver.Interpret) return;
 
@@ -186,6 +187,7 @@ Backtrace4.rb:11:in `foo'
 Backtrace4.rb:10:in `foo'
 Backtrace4.rb:0
 &quot;, OutputFlags.Match);
+#endif
         }
     }
 }
\ No newline at end of file</diff>
      <filename>Merlin/Main/Languages/Ruby/IronRuby.Tests/Runtime/BacktraceTests.cs</filename>
    </modified>
    <modified>
      <diff>@@ -14,16 +14,19 @@
  * ***************************************************************************/
 
 using System;
+using System.Collections.ObjectModel;
+using System.Linq.Expressions;
 using System.Runtime.CompilerServices;
 using IronRuby.Builtins;
 
 namespace IronRuby.Runtime.Calls {
     public abstract partial class MethodDispatcher {
-        internal const int /*$$*/PrecompiledParameterCount = 5;
+        internal const int /*$$*/MaxPrecompiledArity = 5;
+        internal const int /*$$*/MaxInterpretedArity = 15;
 
         private static readonly Type[] RubyObjectMethodDispatchers = new[] {
 #if GENERATOR
-            def generate; add_generic_types($PrecompiledParameterCount); end
+            def generate; add_generic_types($MaxPrecompiledArity); end
 #else
             typeof(RubyObjectMethodDispatcher&lt;&gt;),
 #endif
@@ -37,7 +40,7 @@ namespace IronRuby.Runtime.Calls {
 
         private static readonly Type[] RubyObjectMethodDispatchersWithBlock = new[] {
 #if GENERATOR
-            def generate; add_generic_types($PrecompiledParameterCount); end
+            def generate; add_generic_types($MaxPrecompiledArity); end
 #else
             typeof(RubyObjectMethodDispatcherWithBlock&lt;&gt;),
 #endif
@@ -51,7 +54,7 @@ namespace IronRuby.Runtime.Calls {
 
         private static readonly Type[] RubyObjectMethodDispatchersWithScope = new[] {
 #if GENERATOR
-            def generate; add_generic_types($PrecompiledParameterCount); end
+            def generate; add_generic_types($MaxPrecompiledArity); end
 #else
             typeof(RubyObjectMethodDispatcherWithScope&lt;&gt;),
 #endif
@@ -65,7 +68,7 @@ namespace IronRuby.Runtime.Calls {
 
         private static readonly Type[] RubyObjectMethodDispatchersWithScopeAndBlock = new[] {
 #if GENERATOR
-            def generate; add_generic_types($PrecompiledParameterCount); end
+            def generate; add_generic_types($MaxPrecompiledArity); end
 #else
             typeof(RubyObjectMethodDispatcherWithScopeAndBlock&lt;&gt;),
 #endif
@@ -76,36 +79,66 @@ namespace IronRuby.Runtime.Calls {
             typeof(RubyObjectMethodDispatcherWithScopeAndBlock&lt;,,,,&gt;),
 #endregion
         };
-    }
 
+        private static readonly Type[] InterpretedFuncDispatchers = new[] {
 #if GENERATOR
-    def generate
-      $PrecompiledParameterCount.times { |n| @n = n + 1; super }
-    end
-
-    def GenericDecl
-      &quot;&lt;&quot; + Array.new(@n) { |i| &quot;T#{i}&quot; }.join(&quot;, &quot;) + &quot;&gt;&quot;
-    end
-
-    def GenericParams
-      Array.new(@n) { |i| &quot;T#{i},&quot; }.join(&quot; &quot;)
-    end
-
-    def Objects *args
-      &quot;, object&quot; * @n
-    end
+            def generate; add_generic_types($MaxInterpretedArity + 1); end
+#else
+            typeof(InterpretedFuncDispatcher&lt;&gt;),
+#endif
+#region Generated by MethodDispatcher.Generator.rb
+            typeof(InterpretedFuncDispatcher&lt;,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,,,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,,,,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,,,,,,,,,&gt;),
+            typeof(InterpretedFuncDispatcher&lt;,,,,,,,,,,,,,,,&gt;),
+#endregion
+        };
 
-    def Parameters
-      &quot;,&quot; + Array.new(@n) { |i| &quot;T#{i} arg#{i}&quot; }.join(&quot;, &quot;) 
-    end
+        private static readonly Type[] InterpretedActionDispatchers = new[] {
+            typeof(InterpretedActionDispatcher),
+#if GENERATOR
+            def generate; add_generic_types($MaxInterpretedArity); end
+#else
+            typeof(InterpretedActionDispatcher&lt;&gt;),
+#endif
+#region Generated by MethodDispatcher.Generator.rb
+            typeof(InterpretedActionDispatcher&lt;,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,,,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,,,,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,,,,,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,,,,,,,,,&gt;),
+            typeof(InterpretedActionDispatcher&lt;,,,,,,,,,,,,,,&gt;),
+#endregion
+        };
+    }
 
-    def Arguments
-      &quot;,&quot; + Array.new(@n) { |i| &quot;arg#{i}&quot; }.join(&quot;, &quot;) 
+#if GENERATOR
+    def generate
+      $MaxPrecompiledArity.times { |n| @n = n + 1; super }
     end
 #else
     public class RubyObjectMethodDispatcher/*$GenericDecl*/ : MethodDispatcher&lt;Func&lt;object, Proc, object/*$Objects*/&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, /*$GenericParams*/ object&gt;(Invoke);
+            return new Func&lt;CallSite, object /*$GenericParams*/, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self /*$Parameters*/) {
@@ -113,7 +146,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null /*$Arguments*/);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, /*$GenericParams*/ object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object /*$GenericParams*/, object&gt;&gt;)callSite).
                     Update(callSite, self /*$Arguments*/);
             }
         }
@@ -121,7 +154,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScope/*$GenericDecl*/ : MethodDispatcher&lt;Func&lt;object, Proc, object/*$Objects*/&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, /*$GenericParams*/ object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object /*$GenericParams*/, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self /*$Parameters*/) {
@@ -129,7 +162,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null /*$Arguments*/);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, /*$GenericParams*/ object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object /*$GenericParams*/, object&gt;&gt;)callSite).
                     Update(callSite, scope, self /*$Arguments*/);
             }
         }
@@ -137,7 +170,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithBlock/*$GenericDecl*/ : MethodDispatcher&lt;Func&lt;object, Proc, object/*$Objects*/&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, Proc, /*$GenericParams*/ object&gt;(Invoke);
+            return new Func&lt;CallSite, object, Proc /*$GenericParams*/, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self, Proc proc /*$Parameters*/) {
@@ -157,7 +190,7 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, Proc, /*$GenericParams*/ object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object, Proc /*$GenericParams*/, object&gt;&gt;)callSite).
                     Update(callSite, self, proc /*$Arguments*/);
             }
         }
@@ -165,7 +198,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScopeAndBlock/*$GenericDecl*/ : MethodDispatcher&lt;Func&lt;object, Proc, object/*$Objects*/&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, Proc, /*$GenericParams*/ object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object, Proc /*$GenericParams*/, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self, Proc proc /*$Parameters*/) {
@@ -185,7 +218,7 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc, /*$GenericParams*/ object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc /*$GenericParams*/, object&gt;&gt;)callSite).
                     Update(callSite, scope, self, proc /*$Arguments*/);
             }
         }
@@ -194,7 +227,7 @@ namespace IronRuby.Runtime.Calls {
 #region Generated by MethodDispatcher.Generator.rb
     public class RubyObjectMethodDispatcher&lt;T0&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, T0, object&gt;(Invoke);
+            return new Func&lt;CallSite, object , T0, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self ,T0 arg0) {
@@ -202,7 +235,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, T0, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object , T0, object&gt;&gt;)callSite).
                     Update(callSite, self ,arg0);
             }
         }
@@ -210,7 +243,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScope&lt;T0&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, T0, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object , T0, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self ,T0 arg0) {
@@ -218,7 +251,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, T0, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object , T0, object&gt;&gt;)callSite).
                     Update(callSite, scope, self ,arg0);
             }
         }
@@ -226,7 +259,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithBlock&lt;T0&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, Proc, T0, object&gt;(Invoke);
+            return new Func&lt;CallSite, object, Proc , T0, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self, Proc proc ,T0 arg0) {
@@ -246,7 +279,7 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, Proc, T0, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object, Proc , T0, object&gt;&gt;)callSite).
                     Update(callSite, self, proc ,arg0);
             }
         }
@@ -254,7 +287,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScopeAndBlock&lt;T0&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, Proc, T0, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object, Proc , T0, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self, Proc proc ,T0 arg0) {
@@ -274,14 +307,14 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc, T0, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc , T0, object&gt;&gt;)callSite).
                     Update(callSite, scope, self, proc ,arg0);
             }
         }
     }
     public class RubyObjectMethodDispatcher&lt;T0, T1&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, T0, T1, object&gt;(Invoke);
+            return new Func&lt;CallSite, object , T0 , T1, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self ,T0 arg0, T1 arg1) {
@@ -289,7 +322,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0, arg1);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, T0, T1, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object , T0 , T1, object&gt;&gt;)callSite).
                     Update(callSite, self ,arg0, arg1);
             }
         }
@@ -297,7 +330,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScope&lt;T0, T1&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, T0, T1, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object , T0 , T1, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self ,T0 arg0, T1 arg1) {
@@ -305,7 +338,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0, arg1);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, T0, T1, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object , T0 , T1, object&gt;&gt;)callSite).
                     Update(callSite, scope, self ,arg0, arg1);
             }
         }
@@ -313,7 +346,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithBlock&lt;T0, T1&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, Proc, T0, T1, object&gt;(Invoke);
+            return new Func&lt;CallSite, object, Proc , T0 , T1, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self, Proc proc ,T0 arg0, T1 arg1) {
@@ -333,7 +366,7 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, Proc, T0, T1, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object, Proc , T0 , T1, object&gt;&gt;)callSite).
                     Update(callSite, self, proc ,arg0, arg1);
             }
         }
@@ -341,7 +374,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScopeAndBlock&lt;T0, T1&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, Proc, T0, T1, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object, Proc , T0 , T1, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self, Proc proc ,T0 arg0, T1 arg1) {
@@ -361,14 +394,14 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc, T0, T1, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc , T0 , T1, object&gt;&gt;)callSite).
                     Update(callSite, scope, self, proc ,arg0, arg1);
             }
         }
     }
     public class RubyObjectMethodDispatcher&lt;T0, T1, T2&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, T0, T1, T2, object&gt;(Invoke);
+            return new Func&lt;CallSite, object , T0 , T1 , T2, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self ,T0 arg0, T1 arg1, T2 arg2) {
@@ -376,7 +409,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0, arg1, arg2);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, T0, T1, T2, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object , T0 , T1 , T2, object&gt;&gt;)callSite).
                     Update(callSite, self ,arg0, arg1, arg2);
             }
         }
@@ -384,7 +417,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScope&lt;T0, T1, T2&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, T0, T1, T2, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object , T0 , T1 , T2, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self ,T0 arg0, T1 arg1, T2 arg2) {
@@ -392,7 +425,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0, arg1, arg2);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, T0, T1, T2, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object , T0 , T1 , T2, object&gt;&gt;)callSite).
                     Update(callSite, scope, self ,arg0, arg1, arg2);
             }
         }
@@ -400,7 +433,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithBlock&lt;T0, T1, T2&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, Proc, T0, T1, T2, object&gt;(Invoke);
+            return new Func&lt;CallSite, object, Proc , T0 , T1 , T2, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self, Proc proc ,T0 arg0, T1 arg1, T2 arg2) {
@@ -420,7 +453,7 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, Proc, T0, T1, T2, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object, Proc , T0 , T1 , T2, object&gt;&gt;)callSite).
                     Update(callSite, self, proc ,arg0, arg1, arg2);
             }
         }
@@ -428,7 +461,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScopeAndBlock&lt;T0, T1, T2&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, Proc, T0, T1, T2, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object, Proc , T0 , T1 , T2, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self, Proc proc ,T0 arg0, T1 arg1, T2 arg2) {
@@ -448,14 +481,14 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc, T0, T1, T2, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc , T0 , T1 , T2, object&gt;&gt;)callSite).
                     Update(callSite, scope, self, proc ,arg0, arg1, arg2);
             }
         }
     }
     public class RubyObjectMethodDispatcher&lt;T0, T1, T2, T3&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, T0, T1, T2, T3, object&gt;(Invoke);
+            return new Func&lt;CallSite, object , T0 , T1 , T2 , T3, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self ,T0 arg0, T1 arg1, T2 arg2, T3 arg3) {
@@ -463,7 +496,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0, arg1, arg2, arg3);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, T0, T1, T2, T3, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object , T0 , T1 , T2 , T3, object&gt;&gt;)callSite).
                     Update(callSite, self ,arg0, arg1, arg2, arg3);
             }
         }
@@ -471,7 +504,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScope&lt;T0, T1, T2, T3&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, T0, T1, T2, T3, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object , T0 , T1 , T2 , T3, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self ,T0 arg0, T1 arg1, T2 arg2, T3 arg3) {
@@ -479,7 +512,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0, arg1, arg2, arg3);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, T0, T1, T2, T3, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object , T0 , T1 , T2 , T3, object&gt;&gt;)callSite).
                     Update(callSite, scope, self ,arg0, arg1, arg2, arg3);
             }
         }
@@ -487,7 +520,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithBlock&lt;T0, T1, T2, T3&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, Proc, T0, T1, T2, T3, object&gt;(Invoke);
+            return new Func&lt;CallSite, object, Proc , T0 , T1 , T2 , T3, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self, Proc proc ,T0 arg0, T1 arg1, T2 arg2, T3 arg3) {
@@ -507,7 +540,7 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, Proc, T0, T1, T2, T3, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object, Proc , T0 , T1 , T2 , T3, object&gt;&gt;)callSite).
                     Update(callSite, self, proc ,arg0, arg1, arg2, arg3);
             }
         }
@@ -515,7 +548,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScopeAndBlock&lt;T0, T1, T2, T3&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, Proc, T0, T1, T2, T3, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object, Proc , T0 , T1 , T2 , T3, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self, Proc proc ,T0 arg0, T1 arg1, T2 arg2, T3 arg3) {
@@ -535,14 +568,14 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc, T0, T1, T2, T3, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc , T0 , T1 , T2 , T3, object&gt;&gt;)callSite).
                     Update(callSite, scope, self, proc ,arg0, arg1, arg2, arg3);
             }
         }
     }
     public class RubyObjectMethodDispatcher&lt;T0, T1, T2, T3, T4&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, T0, T1, T2, T3, T4, object&gt;(Invoke);
+            return new Func&lt;CallSite, object , T0 , T1 , T2 , T3 , T4, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self ,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
@@ -550,7 +583,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0, arg1, arg2, arg3, arg4);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, T0, T1, T2, T3, T4, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object , T0 , T1 , T2 , T3 , T4, object&gt;&gt;)callSite).
                     Update(callSite, self ,arg0, arg1, arg2, arg3, arg4);
             }
         }
@@ -558,7 +591,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScope&lt;T0, T1, T2, T3, T4&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, T0, T1, T2, T3, T4, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object , T0 , T1 , T2 , T3 , T4, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self ,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
@@ -566,7 +599,7 @@ namespace IronRuby.Runtime.Calls {
             if (obj != null &amp;&amp; obj.ImmediateClass.Version.Value == Version) {
                 return Method(self, null ,arg0, arg1, arg2, arg3, arg4);
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, T0, T1, T2, T3, T4, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object , T0 , T1 , T2 , T3 , T4, object&gt;&gt;)callSite).
                     Update(callSite, scope, self ,arg0, arg1, arg2, arg3, arg4);
             }
         }
@@ -574,7 +607,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithBlock&lt;T0, T1, T2, T3, T4&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, object, Proc, T0, T1, T2, T3, T4, object&gt;(Invoke);
+            return new Func&lt;CallSite, object, Proc , T0 , T1 , T2 , T3 , T4, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, object self, Proc proc ,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
@@ -594,7 +627,7 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, object, Proc, T0, T1, T2, T3, T4, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, object, Proc , T0 , T1 , T2 , T3 , T4, object&gt;&gt;)callSite).
                     Update(callSite, self, proc ,arg0, arg1, arg2, arg3, arg4);
             }
         }
@@ -602,7 +635,7 @@ namespace IronRuby.Runtime.Calls {
 
     public class RubyObjectMethodDispatcherWithScopeAndBlock&lt;T0, T1, T2, T3, T4&gt; : MethodDispatcher&lt;Func&lt;object, Proc, object, object, object, object, object, object&gt;&gt; {
         public override object/*!*/ CreateDelegate() {
-            return new Func&lt;CallSite, RubyScope, object, Proc, T0, T1, T2, T3, T4, object&gt;(Invoke);
+            return new Func&lt;CallSite, RubyScope, object, Proc , T0 , T1 , T2 , T3 , T4, object&gt;(Invoke);
         }
 
         public object Invoke(CallSite/*!*/ callSite, RubyScope/*!*/ scope, object self, Proc proc ,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
@@ -622,11 +655,740 @@ namespace IronRuby.Runtime.Calls {
                     RubyOps.LeaveMethodFrame(rfc);
                 }
             } else {
-                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc, T0, T1, T2, T3, T4, object&gt;&gt;)callSite).
+                return ((CallSite&lt;Func&lt;CallSite, RubyScope, object, Proc , T0 , T1 , T2 , T3 , T4, object&gt;&gt;)callSite).
                     Update(callSite, scope, self, proc ,arg0, arg1, arg2, arg3, arg4);
             }
         }
     }
 #endregion
 
+#if GENERATOR
+    def generate
+      $MaxInterpretedArity.times { |n| @n = n + 1; super }
+    end
+#else
+    public class InterpretedFuncDispatcher/*$GenericDeclWithReturn{*/&lt;TReturn&gt;/*}*/ : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                /*$ParameterExpressions*/                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite /*$GenericParams*/, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite/*$Parameters*/) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite /*$GenericParams*/, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite /*$GenericParams*/, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite /*$GenericParams*/, TReturn&gt;)_rule)(callSite /*$Arguments*/);
+        }
+    }
+
+    public class InterpretedActionDispatcher/*$GenericDecl*/ : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                /*$ParameterExpressions*/                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite/*$GenericParams*/&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite/*$Parameters*/) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite/*$GenericParams*/&gt;&gt;)callSite).Target = (Action&lt;CallSite/*$GenericParams*/&gt;)_compiled;
+            }
+            ((Action&lt;CallSite/*$GenericParams*/&gt;)_rule)(callSite /*$Arguments*/);
+        }
+    }
+#endif
+#region Generated by MethodDispatcher.Generator.rb
+    public class InterpretedFuncDispatcher&lt;T0, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0, TReturn&gt;)_rule)(callSite ,arg0);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0&gt;)_rule)(callSite ,arg0);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1, TReturn&gt;)_rule)(callSite ,arg0, arg1);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1&gt;)_rule)(callSite ,arg0, arg1);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2&gt;)_rule)(callSite ,arg0, arg1, arg2);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5, T6&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;), Expression.Parameter(typeof(T11), &quot;$arg11&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;), Expression.Parameter(typeof(T11), &quot;$arg11&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;), Expression.Parameter(typeof(T11), &quot;$arg11&quot;), Expression.Parameter(typeof(T12), &quot;$arg12&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;), Expression.Parameter(typeof(T11), &quot;$arg11&quot;), Expression.Parameter(typeof(T12), &quot;$arg12&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;), Expression.Parameter(typeof(T11), &quot;$arg11&quot;), Expression.Parameter(typeof(T12), &quot;$arg12&quot;), Expression.Parameter(typeof(T13), &quot;$arg13&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;), Expression.Parameter(typeof(T11), &quot;$arg11&quot;), Expression.Parameter(typeof(T12), &quot;$arg12&quot;), Expression.Parameter(typeof(T13), &quot;$arg13&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13);
+        }
+    }
+    public class InterpretedFuncDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TReturn&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;), Expression.Parameter(typeof(T11), &quot;$arg11&quot;), Expression.Parameter(typeof(T12), &quot;$arg12&quot;), Expression.Parameter(typeof(T13), &quot;$arg13&quot;), Expression.Parameter(typeof(T14), &quot;$arg14&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(TReturn));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14, TReturn&gt;(Invoke);
+        }
+
+        public TReturn Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14) {
+            if (_compiled != null) {
+                ((CallSite&lt;Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14, TReturn&gt;&gt;)callSite).Target = (Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14, TReturn&gt;)_compiled;
+            }
+            return ((Func&lt;CallSite , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14, TReturn&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14);
+        }
+    }
+
+    public class InterpretedActionDispatcher&lt;T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14&gt; : InterpretedDispatcher {
+        internal static readonly ReadOnlyCollection&lt;ParameterExpression&gt; _Parameters =
+            new ReadOnlyCollection&lt;ParameterExpression&gt;(new ParameterExpression[] {
+                Expression.Parameter(typeof(T0), &quot;$arg0&quot;), Expression.Parameter(typeof(T1), &quot;$arg1&quot;), Expression.Parameter(typeof(T2), &quot;$arg2&quot;), Expression.Parameter(typeof(T3), &quot;$arg3&quot;), Expression.Parameter(typeof(T4), &quot;$arg4&quot;), Expression.Parameter(typeof(T5), &quot;$arg5&quot;), Expression.Parameter(typeof(T6), &quot;$arg6&quot;), Expression.Parameter(typeof(T7), &quot;$arg7&quot;), Expression.Parameter(typeof(T8), &quot;$arg8&quot;), Expression.Parameter(typeof(T9), &quot;$arg9&quot;), Expression.Parameter(typeof(T10), &quot;$arg10&quot;), Expression.Parameter(typeof(T11), &quot;$arg11&quot;), Expression.Parameter(typeof(T12), &quot;$arg12&quot;), Expression.Parameter(typeof(T13), &quot;$arg13&quot;), Expression.Parameter(typeof(T14), &quot;$arg14&quot;)                
+            });
+
+        internal static readonly LabelTarget _ReturnLabel = Expression.Label(typeof(void));
+
+        internal override ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get { return _Parameters; } }
+        internal override LabelTarget ReturnLabel { get { return _ReturnLabel; } }
+
+        internal override object/*!*/ GetInterpretingDelegate() {
+            return new Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14&gt;(Invoke);
+        }
+
+        public void Invoke(CallSite/*!*/ callSite,T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14) {
+            if (_compiled != null) {
+                ((CallSite&lt;Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14&gt;&gt;)callSite).Target = (Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14&gt;)_compiled;
+            }
+            ((Action&lt;CallSite, T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14&gt;)_rule)(callSite ,arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14);
+        }
+    }
+#endregion
 }
+</diff>
      <filename>Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/MethodDispatcher.Generated.cs</filename>
    </modified>
    <modified>
      <diff>@@ -4,6 +4,34 @@ class Generator
   def add_generic_types(n)
     (n - 1).times { |i| @generated &lt;&lt; @template.sub('&lt;&gt;', '&lt;,' + (',' * i) + '&gt;') } 
   end
+  
+  def GenericDecl
+    &quot;&lt;&quot; + Array.new(@n) { |i| &quot;T#{i}&quot; }.join(&quot;, &quot;) + &quot;&gt;&quot;
+  end
+  
+  def GenericDeclWithReturn(*args)
+    &quot;&lt;&quot; + Array.new(@n) { |i| &quot;T#{i}&quot; }.join(&quot;, &quot;) + &quot;, TReturn&gt;&quot;
+  end
+
+  def GenericParams
+    Array.new(@n) { |i| &quot;, T#{i}&quot; }.join(&quot; &quot;)
+  end
+
+  def Objects *args
+    &quot;, object&quot; * @n
+  end
+
+  def Parameters
+    &quot;,&quot; + Array.new(@n) { |i| &quot;T#{i} arg#{i}&quot; }.join(&quot;, &quot;) 
+  end
+
+  def Arguments
+    &quot;,&quot; + Array.new(@n) { |i| &quot;arg#{i}&quot; }.join(&quot;, &quot;) 
+  end
+
+  def ParameterExpressions
+    Array.new(@n) { |i| %{Expression.Parameter(typeof(T#{i}), &quot;$arg#{i}&quot;)} }.join(&quot;, &quot;)
+  end
 end
 
 expand_templates(__FILE__)
\ No newline at end of file</diff>
      <filename>Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/MethodDispatcher.Generator.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,6 +20,11 @@ using IronRuby.Builtins;
 using System.Runtime.CompilerServices;
 using System.Diagnostics;
 using Microsoft.Scripting.Utils;
+using System.Linq.Expressions;
+using Microsoft.Scripting.Generation;
+using System.Collections.ObjectModel;
+using Microsoft.Scripting.Interpreter;
+using Microsoft.Scripting;
 
 namespace IronRuby.Runtime.Calls {
     
@@ -59,7 +64,7 @@ namespace IronRuby.Runtime.Calls {
                 return null;
             }
 
-            if (parameterCount &gt; PrecompiledParameterCount) {
+            if (parameterCount &gt; MaxPrecompiledArity) {
                 return null;
             }
 
@@ -79,16 +84,35 @@ namespace IronRuby.Runtime.Calls {
             }
         }
 
-        public abstract object/*!*/ CreateDelegate();
-        internal abstract void Initialize(Delegate/*!*/ method, int version);
+        internal static InterpretedDispatcher CreateInterpreted(Type/*!*/ delegateType, int parameterCount) {
+            if (parameterCount &gt; MaxInterpretedArity) {
+                return null;
+            }
+
+            // Func&lt;CallSite, T1, ... TN, TReturn&gt;
+            // Action&lt;CallSite, T1, ... TN&gt;
+            var types = delegateType.GetGenericArguments();
+            types = types.GetSlice(1, types.Length - 1);
+
+            Type dispatcherType;
+            if (parameterCount != types.Length) {
+                // Func
+                Debug.Assert(parameterCount + 1 == types.Length);
+                dispatcherType = InterpretedFuncDispatchers[parameterCount];
+            } else {
+                // Action
+                dispatcherType = InterpretedActionDispatchers[parameterCount];
+            }
 
-        internal virtual void InitializeSingleton(object singleton, VersionHandle/*!*/ versionHandle) {
-            throw Assert.Unreachable;
+            return (InterpretedDispatcher)Activator.CreateInstance(dispatcherType.MakeGenericType(types));
         }
+
+        public abstract object/*!*/ CreateDelegate();
+        internal abstract void Initialize(Delegate/*!*/ method, int version);
     }
 
     public abstract class MethodDispatcher&lt;TRubyFunc&gt; : MethodDispatcher {
-        internal TRubyFunc/*!*/ Method;
+        internal TRubyFunc Method;
 
         internal override void Initialize(Delegate/*!*/ method, int version) {
             Assert.NotNull(method);
@@ -96,4 +120,65 @@ namespace IronRuby.Runtime.Calls {
             Version = version;
         }
     }
+
+    public abstract class InterpretedDispatcher {
+        internal object _rule;
+        internal Delegate _compiled;
+
+        internal T/*!*/ CreateDelegate&lt;T&gt;(Expression/*!*/ binding) where T : class {
+            Delegate d = CompilerHelpers.LightCompile(Stitch&lt;T&gt;(binding));
+            T result = (T)(object)d;
+
+            LightLambda lambda = d.Target as LightLambda;
+            if (lambda != null) {
+                _rule = result;
+                lambda.Compile += (_, e) =&gt; _compiled = e.Compiled;
+                return (T)GetInterpretingDelegate();
+            } else {
+                PerfTrack.NoteEvent(PerfTrack.Categories.Rules, &quot;Rule not interpreted&quot;);
+                return result;
+            }
+        }
+
+        // TODO: This is a copy of CallSiteBinder.Stitch.
+        private LambdaExpression/*!*/ Stitch&lt;T&gt;(Expression/*!*/ binding) where T : class {
+            Expression updLabel = Expression.Label(CallSiteBinder.UpdateLabel);
+
+            var site = Expression.Parameter(typeof(CallSite), &quot;$site&quot;);
+            var @params = ArrayUtils.Insert(site, Parameters);
+
+            var body = Expression.Block(
+                binding,
+                updLabel,
+                Expression.Label(
+                    ReturnLabel,
+                    Expression.Condition(
+                        Expression.Call(
+                            typeof(CallSiteOps).GetMethod(&quot;SetNotMatched&quot;),
+                            @params[0]
+                        ),
+                        Expression.Default(ReturnLabel.Type),
+                        Expression.Invoke(
+                            Expression.Property(
+                                Expression.Convert(site, typeof(CallSite&lt;T&gt;)),
+                                typeof(CallSite&lt;T&gt;).GetProperty(&quot;Update&quot;)
+                            ),
+                            @params
+                        )
+                    )
+                )
+            );
+
+            return Expression.Lambda&lt;T&gt;(
+                body,
+                &quot;CallSite.Target&quot;,
+                true, // always compile the rules with tail call optimization
+                @params
+            );
+        }
+
+        internal abstract ReadOnlyCollection&lt;ParameterExpression&gt; Parameters { get; }
+        internal abstract LabelTarget ReturnLabel { get; }
+        internal abstract object/*!*/ GetInterpretingDelegate();
+    }
 }</diff>
      <filename>Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/MethodDispatcher.cs</filename>
    </modified>
    <modified>
      <diff>@@ -53,11 +53,6 @@ namespace IronRuby.Runtime.Calls {
             return GetType().Name + (Context != null ? &quot; @&quot; + Context.RuntimeId.ToString() : null);
         }
 
-        public override T BindDelegate&lt;T&gt;(System.Runtime.CompilerServices.CallSite&lt;T&gt; site, object[] args) {
-            PerfTrack.NoteEvent(PerfTrack.Categories.Binding, &quot;Ruby: &quot; + GetType().Name + &quot;: BindDelegate&quot;);
-            return base.BindDelegate&lt;T&gt;(site, args);
-        }
-
         public static RubyConversionAction TryGetDefaultConversionAction(RubyContext context, Type/*!*/ parameterType) {
             var factory = TryGetDefaultConversionAction(parameterType);
             return factory != null ? factory(context != null ? context.MetaBinderFactory : RubyMetaBinderFactory.Shared) : null;</diff>
      <filename>Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/ProtocolConversionAction.cs</filename>
    </modified>
    <modified>
      <diff>@@ -92,8 +92,6 @@ namespace IronRuby.Runtime.Calls {
         #region Precompiled Rules
 
         public override T BindDelegate&lt;T&gt;(CallSite&lt;T&gt;/*!*/ site, object[]/*!*/ args) {
-            PerfTrack.NoteEvent(PerfTrack.Categories.Binding, &quot;Ruby: RubyCallAction&quot; + Signature.ToString() + &quot;: BindDelegate&quot;);
-
             if (Context == null || (Signature.Flags &amp; ~(RubyCallFlags.HasImplicitSelf | RubyCallFlags.HasScope | RubyCallFlags.HasBlock)) != 0) {
                 return base.BindDelegate&lt;T&gt;(site, args);
             }</diff>
      <filename>Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyCallAction.cs</filename>
    </modified>
    <modified>
      <diff>@@ -24,6 +24,7 @@ using System.Reflection;
 using Microsoft.Scripting;
 using Microsoft.Scripting.Runtime;
 using System.Linq.Expressions;
+using System.Runtime.CompilerServices;
 
 namespace IronRuby.Runtime.Calls {
     public abstract class RubyMetaBinder : DynamicMetaObjectBinder, IExpressionSerializable {
@@ -49,11 +50,24 @@ namespace IronRuby.Runtime.Calls {
         protected abstract bool Build(MetaObjectBuilder/*!*/ metaBuilder, CallArguments/*!*/ args, bool defaultFallback);
         public abstract Expression CreateExpression();
 
-        protected virtual DynamicMetaObjectBinder GetInteropBinder(RubyContext/*!*/ context, IList&lt;DynamicMetaObject/*!*/&gt;/*!*/ args, 
-            out MethodInfo postProcessor) {
+        public override T BindDelegate&lt;T&gt;(System.Runtime.CompilerServices.CallSite&lt;T&gt; site, object[] args) {
+            InterpretedDispatcher dispatcher = MethodDispatcher.CreateInterpreted(typeof(T), args.Length);
 
-            postProcessor = null;
-            return null;
+            if (dispatcher == null) {
+                // call site has too many arguments:
+                PerfTrack.NoteEvent(PerfTrack.Categories.Binding, &quot;Ruby: ! No dispatcher for &quot; + Signature.ToString());
+                return base.BindDelegate&lt;T&gt;(site, args);
+            } else {
+                Expression binding = Bind(args, dispatcher.Parameters, dispatcher.ReturnLabel);
+
+                if (binding == null) {
+                    throw new InvalidImplementationException(&quot;DynamicMetaObjectBinder.Bind must return non-null meta-object&quot;);
+                }
+
+                T result = dispatcher.CreateDelegate&lt;T&gt;(binding);
+                CacheTarget(result);
+                return result;
+            }
         }
 
         public override DynamicMetaObject/*!*/ Bind(DynamicMetaObject/*!*/ scopeOrContextOrTarget, DynamicMetaObject/*!*/[]/*!*/ args) {
@@ -64,12 +78,18 @@ namespace IronRuby.Runtime.Calls {
 
             if (IsForeignMetaObject(callArgs.MetaTarget)) {
                 return InteropBind(metaBuilder, callArgs);
-            } 
+            }
 
             Build(metaBuilder, callArgs, true);
             return metaBuilder.CreateMetaObject(this);
         }
 
+        protected virtual DynamicMetaObjectBinder GetInteropBinder(RubyContext/*!*/ context, IList&lt;DynamicMetaObject/*!*/&gt;/*!*/ args,
+            out MethodInfo postProcessor) {
+
+            postProcessor = null;
+            return null;
+        }
 
         private DynamicMetaObject/*!*/ InteropBind(MetaObjectBuilder/*!*/ metaBuilder, CallArguments/*!*/ args) {
             // TODO: argument count limit depends on the binder!</diff>
      <filename>Merlin/Main/Languages/Ruby/Ruby/Runtime/Calls/RubyMetaBinder.cs</filename>
    </modified>
    <modified>
      <diff>@@ -1269,7 +1269,7 @@ namespace IronRuby.Runtime {
             return result;
         }
 
-        internal bool TryGetClrTypeInstanceData(object obj, out RubyInstanceData result) {
+        internal bool TryGetClrTypeInstanceData(object/*!*/ obj, out RubyInstanceData result) {
             lock (ReferenceTypeInstanceDataLock) {
                 return _referenceTypeInstanceData.TryGetValue(obj, out result);
             }</diff>
      <filename>Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyContext.cs</filename>
    </modified>
    <modified>
      <diff>@@ -123,28 +123,32 @@ tutorial &quot;IronRuby tutorial&quot; do
                   :code =&gt; '2 + 2'
 
             task(:body =&gt; &quot;Now let's do some printing. This is done with the puts function.&quot;,
-                 :code =&gt; &quot;puts 'Hello world'&quot;) { |i| i.output =~ /Hello/i }
+                 :code =&gt; &quot;puts 'Hello world'&quot;
+                 ) { |i| i.output =~ /Hello/i }
 
             task(:body =&gt; &quot;Let's use a local variable.&quot;,
-                 :code =&gt; &quot;x = 1&quot;) { |i| i.bind.x == 1 }
+                 :code =&gt; &quot;x = 1&quot;
+                 ) { |i| i.bind.x == 1 }
 
             task(:body =&gt; &quot;And then print the local variable.&quot;,
-                 :code =&gt; &quot;puts x&quot;) { |i| i.output.chomp == &quot;1&quot; }
+                 :code =&gt; &quot;puts x&quot;
+                 ) { |i| i.output.chomp == &quot;1&quot; }
         end
         
         chapter &quot;Multi-line statements&quot; do
             introduction &quot;This chapter explains how multi-line statements can be used in the tutorial&quot;
             task(
               :body =&gt; %{
-                Entering multiple lines in an interactive console is a bit tricky as it can be ambigous when
-                you are done entering a statement. When you press the +Enter+ key, you may either be expecting
-                to execute the code you have typed already, or you may want to enter more code. Also,
-                sometimes you might want to go back and edit a line above.
+                Entering multiple lines in an interactive console can be a bit tricky as it is not an editor.
+                You cannot go back and change a prior line. If you realized you mis-typed something, you
+                need to enter all the lines again.
                 
-                The tutorial currently only handles single line input. Use &lt;tt&gt;;&lt;/tt&gt; to separate statements
+                After you enter the first line, the prompt characters shown at the start of the input textbox 
+                change from &quot;&gt;&gt;&gt;&quot; to &quot;...&quot; to indicate to the user that more lines are expected before the 
+                input will be evaluated.
               },
-              :code =&gt; &quot;if 2 &lt; 3 then puts 'this'; puts 'that' end&quot;
-              ) { |interaction| interaction.output =~ /this\nthat/ }
+              :code =&gt; &quot;if 2 &lt; 3\n  puts 1\nelse\n  puts 2\nend&quot;
+              ) { |interaction| interaction.output.chomp == '1' }
         end
         
         chapter &quot;Built-in modules and interactive exploration&quot; do
@@ -181,7 +185,8 @@ tutorial &quot;IronRuby tutorial&quot; do
                      function. Let's load the +thread+ module.
                  },
                  :setup =&gt; Proc.new { $LOADED_FEATURES.delete &quot;thread.rb&quot; },
-                 :code =&gt; &quot;require 'thread'&quot;) { $LOADED_FEATURES.include? 'thread.rb' }
+                 :code =&gt; &quot;require 'thread'&quot;
+                 ) { $LOADED_FEATURES.include? 'thread.rb' }
                  
             task :body =&gt; %{
                      Now let's see which new classes were loaded. Can you spot the new classes using
@@ -209,7 +214,8 @@ tutorial &quot;IronRuby tutorial&quot; do
                  },
                  :source_files =&gt; IronRubyTutorial.primes_path,
                  :setup =&gt; Proc.new { $LOADED_FEATURES.delete &quot;primes.rb&quot; },
-                 :code =&gt; &quot;require 'primes.rb'&quot;) { $LOADED_FEATURES.include? 'primes.rb' }
+                 :code =&gt; &quot;require 'primes.rb'&quot;
+                 ) { $LOADED_FEATURES.include? 'primes.rb' }
 
             task :body =&gt; %{
                     We know that the file defines a module called +Primes+. Let's explore the methods defined
@@ -281,7 +287,10 @@ tutorial &quot;IronRuby tutorial&quot; do
             task(:body =&gt; %{
                     Insert a few elements into the hash table
                 },
-                :code =&gt; [&quot;h[:a] = 'IronRuby'&quot;, &quot;h[:b] = 'Tutorial'&quot;]) { |i| i.bind.h.count == 2 }
+                :code =&gt; [
+                    &quot;h[:a] = 'IronRuby'&quot;, 
+                    &quot;h[:b] = 'Tutorial'&quot;]
+                ) { |i| i.bind.h.count == 2 }
 
             task :body =&gt; %{
                     IronRuby supports the C# - style syntax for accessing the hash table elements. The same 
@@ -294,13 +303,17 @@ tutorial &quot;IronRuby tutorial&quot; do
                     are instances of the +DictionaryEntry+ class. Print the +Key+ and +Value+ properties of
                     each entry.
                 },
-                :code =&gt; 'h.each { |e| puts &quot;#{e.Key}=&gt;#{e.Value}&quot; }') { |i| /a=&gt;IronRuby/ =~ i.output }
+                :code =&gt; 'h.each { |e| puts &quot;#{e.Key}=&gt;#{e.Value}&quot; }'
+                ) { |i| /a=&gt;IronRuby/ =~ i.output }
 
             task(:body =&gt; %{
                     You can initialize the collection classes by passing in the Ruby built-in list as
                     arguments.
                 },
-                :code =&gt; ['l = ArrayList.new([1,2,3])', 'l.each { |i| puts i }']) { |i| /1\n2\n3/ =~ i.output }
+                :code =&gt; [
+                    'l = ArrayList.new([1,2,3])', 
+                    'l.each { |i| puts i }']
+                ) { |i| /1\n2\n3/ =~ i.output }
         end
 
         chapter &quot;Generics&quot; do
@@ -317,22 +330,28 @@ tutorial &quot;IronRuby tutorial&quot; do
                    
                    Create an instance of a generic dictionary mapping Strings to Fixnums
                 },
-                :code =&gt; 'd = Dictionary[String, Fixnum].new') { |i| i.bind.d.class == Dictionary[String, Fixnum] }
+                :code =&gt; 'd = Dictionary[String, Fixnum].new'
+                ) { |i| i.bind.d.class == Dictionary[String, Fixnum] }
 
             task(:body =&gt; %{
                     Add string values into the list. Since we created a list of string, adding strings is possible.
                 },
-                :code =&gt; [&quot;d['Hello'] = 1&quot;, &quot;d['Hi'] = 2&quot;]) { |i| i.bind.d.count == 2 }
+                :code =&gt; [
+                    &quot;d['Hello'] = 1&quot;, 
+                    &quot;d['Hi'] = 2&quot;]
+                ) { |i| i.bind.d.count == 2 }
 
             task(:body =&gt; %{
                     Try adding objects of types other than string. It will fail with a TypeError
                 },
-                :code =&gt; 'd[3] = 3') { |i| i.error.kind_of? TypeError }
+                :code =&gt; 'd[3] = 3'
+                ) { |i| i.error.kind_of? TypeError }
 
             task(:body =&gt; %{
                     Enumerate the generic collection
                 },
-                :code =&gt; 'd.each { |kvp| puts kvp }') { |i| /Hello/ =~ i.output }
+                :code =&gt; 'd.each { |kvp| puts kvp }'
+                ) { |i| /Hello/ =~ i.output }
         end
     end
 
@@ -378,7 +397,8 @@ tutorial &quot;IronRuby tutorial&quot; do
                 },
                 :code =&gt; [
                     &quot;n = d.select_nodes '//Puzzle/SavedGames/Game/@caption'&quot;, 
-                    'n.each { |e| puts e.value }']) { |i| /Seattle/ =~ i.output }
+                    'n.each { |e| puts e.value }']
+                ) { |i| /Seattle/ =~ i.output }
         end
 
         chapter &quot;Loading .NET libraries from a given path&quot; do
@@ -412,7 +432,8 @@ tutorial &quot;IronRuby tutorial&quot; do
                 },
                 :code =&gt; [
                     'include System::IO', 
-                    'w = FileSystemWatcher.new']) { |i| i.bind.w.class == System::IO::FileSystemWatcher }
+                    'w = FileSystemWatcher.new']
+                ) { |i| i.bind.w.class == System::IO::FileSystemWatcher }
 
             task(:body =&gt; %{
                     Inspect the methods available on the instance, and then set the +path+ property to watch
@@ -420,7 +441,8 @@ tutorial &quot;IronRuby tutorial&quot; do
                 },
                 :code =&gt; [
                     'w.class.instance_methods false', 
-                    &quot;w.path = '.'&quot;]) { |i| i.bind.w.path == '.' }
+                    &quot;w.path = '.'&quot;]
+                ) { |i| i.bind.w.path == '.' }
 
             task(:body =&gt; %{
                     Register a block as an event handler for the +changed+, +created+, and +deleted+ events. 
@@ -431,12 +453,14 @@ tutorial &quot;IronRuby tutorial&quot; do
                 :code =&gt; [
                     'w.changed { |*a| puts a.inspect }', 
                     'w.created { |*a| puts a.inspect }', 
-                    'w.deleted { |*a| puts a.inspect }']) { IronRubyTutorial.deleted_flag }
+                    'w.deleted { |*a| puts a.inspect }']
+                ) { IronRubyTutorial.deleted_flag }
 
             task(:body =&gt; %{
                     Enable the watcher to raise events.
                 },
-                :code =&gt; 'w.enable_raising_events = true') { |i| i.bind.w.enable_raising_events }
+                :code =&gt; 'w.enable_raising_events = true'
+                ) { |i| i.bind.w.enable_raising_events }
 
             task(:body =&gt; %{
                     Now open the Tutorial folder and create a file. An 
@@ -454,7 +478,8 @@ tutorial &quot;IronRuby tutorial&quot; do
                     
                     Finally disable the watcher.
                 },
-                :code =&gt; 'w.enable_raising_events = false') { |i| not i.bind.w.enable_raising_events }
+                :code =&gt; 'w.enable_raising_events = false'
+                ) { |i| not i.bind.w.enable_raising_events }
         end
 
         chapter &quot;Improving the event handler&quot; do
@@ -486,30 +511,51 @@ tutorial &quot;IronRuby tutorial&quot; do
                 :code =&gt; [
                     'w.changed { |w1,a| puts a.change_type, a.full_path }',
                     'w.created { |w1,a| puts a.change_type, a.full_path }',
-                    'w.deleted { |w1,a| puts a.change_type, a.full_path }']) { IronRubyTutorial.deleted_flag }
+                    'w.deleted { |w1,a| puts a.change_type, a.full_path }']
+                ) { IronRubyTutorial.deleted_flag }
 
             task(:body =&gt; %{
                     Make sure the raising of the events is enabled:
                 },
-                :code =&gt; 'w.enable_raising_events = true') { |i| i.bind.w.enable_raising_events }
+                :code =&gt; 'w.enable_raising_events = true'
+                ) { |i| i.bind.w.enable_raising_events }
 
             task(:body =&gt; %{
                     Finally disable the watcher.
                 },
-                :code =&gt; 'w.enable_raising_events = false') { |i| not i.bind.w.enable_raising_events }
+                :code =&gt; 'w.enable_raising_events = false'
+                ) { |i| not i.bind.w.enable_raising_events }
         end
 
     end
 
     section &quot;Advanced IronRuby - Windows Forms&quot; do
-        
+
+        introduction %{
+            Note that if you develop Windows applications interactively using the &lt;tt&gt;ir.exe&lt;/tt&gt; from the
+            &lt;b&gt;Command Prompt&lt;/b&gt;, IronRuby must be initialized specially for that purpose. &lt;tt&gt;ir.exe&lt;/tt&gt;
+            blocks the main thread so that it can read user input. While this thread awaits text input, the 
+            Windows application being dynamically created from the console needs to run on a separate thread
+            so that it can process Windows messages. Also, all interactive commands that interact with UI 
+            need to be executed on the message pump thread. &lt;tt&gt;wpf.rb&lt;/tt&gt; includes a helper method to deal 
+            with this. If you are using a console interactive session, do the following:
+            
+                require &quot;wpf.rb&quot;
+                Wpf.interact
+        }
+                
         chapter &quot;Creating a simple Form&quot; do
             introduction %{
                 In this exercise, you will create simple Windows Forms applications dynamically.
             }
 
             task :body =&gt; %{
-                    First, we need to load &lt;tt&gt;System.Windows.Forms.dll&lt;/tt&gt;
+                    First, we need to load &lt;tt&gt;System.Windows.Forms.dll&lt;/tt&gt;. Note that it is recommended to
+                    use the full assembly name in larger programs as such:
+                    
+                        load_assembly(&quot;System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;)                    
+                    
+                    However, for interactive use, we will use the short form.
                 },
                 :code =&gt; &quot;load_assembly('System.Windows.Forms')&quot;
 
@@ -522,7 +568,8 @@ tutorial &quot;IronRuby tutorial&quot; do
             task(:body =&gt; %{
                     Create an instance of the Form class and display it.
                 },
-                :code =&gt; ['f = Form.new', 'f.show']) { |i| i.bind.f.visible }
+                :code =&gt; ['f = Form.new', 'f.show']
+                ) { |i| i.bind.f.visible }
 
             task(:body =&gt; %{
                     You may need to alt-tab or look for the running application since it may not have popped
@@ -533,7 +580,8 @@ tutorial &quot;IronRuby tutorial&quot; do
                 :setup =&gt; Proc.new {
                     # TODO - Position the form so that it is not hidden behind the current window
                 },
-                :code =&gt; &quot;f.text = 'Hello'&quot;) { |i| /hello/i =~ i.bind.f.text }
+                :code =&gt; &quot;f.text = 'Hello'&quot;
+                ) { |i| /hello/i =~ i.bind.f.text }
         end
         
         chapter &quot;Adding event handlers to the Form&quot; do
@@ -551,7 +599,8 @@ tutorial &quot;IronRuby tutorial&quot; do
 
                     IronRubyTutorial.snoop_add_handler &quot;click&quot;, bind.f
                 },
-                :code =&gt; 'f.click { |*args| puts args }') { IronRubyTutorial.click_flag }
+                :code =&gt; 'f.click { |*args| puts args }'
+                ) { IronRubyTutorial.click_flag }
 
             task :body =&gt; %{
                     Now click the form. You should see output printed in the REPL window, looking something
@@ -573,21 +622,22 @@ tutorial &quot;IronRuby tutorial&quot; do
                         l = Label.new
                         l.text = 'Hello'
                         l.location = a.location
-                        f.controls.add(l)
-                    end
-                    }) do |i|
-                        f = Tutorial.stub
-                        a = Tutorial.stub
-                        # &quot;l.location = a.location&quot; is expected to fail because &quot;a.location&quot; currently just returns a Stub
-                        i.bind.on_click(f, a) rescue TypeError
-                        a.called? :location
-                    end
+                        f.controls.add l
+                    end}.strip_margin
+                ) do |i|
+                    f = Tutorial.stub
+                    a = Tutorial.stub
+                    # &quot;l.location = a.location&quot; is expected to fail because &quot;a.location&quot; currently just returns a Stub
+                    i.bind.on_click(f, a) rescue TypeError
+                    a.called? :location
+                end
 
             task(:body =&gt; %{
                     Now add the method as a +click+ handler
                 },
                 :setup =&gt; Proc.new { |bind| IronRubyTutorial.snoop_add_handler &quot;click&quot;, bind.f },
-                :code =&gt; 'f.click { |f, a| on_click(f, a) }') { IronRubyTutorial.click_flag }
+                :code =&gt; 'f.click { |f, a| on_click(f, a) }'
+                ) { IronRubyTutorial.click_flag }
 
             task :body =&gt; %{
                     Now clicking on the form with the mouse will add 'Hello' labels. We can also access the 
@@ -599,18 +649,12 @@ tutorial &quot;IronRuby tutorial&quot; do
                     After a few moments of clicking, the form will get quite crowded, so we can clear it out.
                     Also, don't forget to close the form.
                 },
-                :code =&gt; ['f.controls.clear', 'f.close']) { |i| not i.bind.f.visible }
+                :code =&gt; [
+                    'f.controls.clear', 
+                    'f.close']
+                ) { |i| not i.bind.f.visible }
         end
-        
-        summary %{
-            Note that if you develop Windows applications interactively using the &lt;tt&gt;ir.exe&lt;/tt&gt; from the
-            &lt;b&gt;Command Prompt&lt;/b&gt;, IronRuby must be initialized specially for that purpose. By default,
-            &lt;tt&gt;ir.exe&lt;/tt&gt;executes on one thread only. While this thread awaits text input, the Windows
-            application being dynamically created from the console is not able to process Windows messages.
-            Therefore, the application does not repaint itself or handle input to the UI.
-            
-            TODO - Explain what the solution to this problem is
-        }
+
     end
 
     section &quot;Advanced IronRuby - Windows Presentation Foundation&quot; do
@@ -628,6 +672,11 @@ tutorial &quot;IronRuby tutorial&quot; do
             task :body =&gt; %{
                     It is useful to have common initialization code while using Windows Presentation Foundation
                     in interactive development. This is available in the +Wpf+ module in the &lt;tt&gt;wpf.rb&lt;/tt&gt; file.
+                },
+                :source_files =&gt; IronRubyTutorial.wpf_path,
+                :code =&gt; &quot;require 'wpf.rb'&quot;
+
+            task(:body =&gt; %{
                     To make all the WPF class names directly available, you could do:
                     
                         include Wpf
@@ -636,14 +685,13 @@ tutorial &quot;IronRuby tutorial&quot; do
                     For example, &lt;tt&gt;System::Collections::Generic::List&lt;/tt&gt; and
                     &lt;tt&gt;System::Windows::Documents::List&lt;/tt&gt;. For this reason, it is preferable to
                     use scope access like &lt;tt&gt;Wpf::List&lt;/tt&gt; instead of doing &lt;tt&gt;include Wpf&lt;/tt&gt;.
+                    
+                    Now let's create a window.
                 },
-                :source_files =&gt; IronRubyTutorial.wpf_path,
-                :code =&gt; &quot;require 'wpf.rb'&quot;
-
-            task(:body =&gt; %{
-                    Coming_soon
-                },
-                :code =&gt; ['w = Wpf::Window.new', 'w.show']) { |i| i.bind.w.visibility == System::Windows::Visibility.visible }
+                :code =&gt; [
+                    'w = Wpf::Window.new', 
+                    'w.show']
+                ) { |i| i.bind.w.visibility == System::Windows::Visibility.visible }
 
             task(:body =&gt; %{
                     You may need to alt-tab or look for the running application since it may not have popped 
@@ -654,7 +702,8 @@ tutorial &quot;IronRuby tutorial&quot; do
                 },
                 :code =&gt; [
                     'w.size_to_content = Wpf::SizeToContent.width_and_height', 
-                    &quot;w.title = 'Hello'&quot;]) { |i| String.new(i.bind.w.title) =~ /Hello/i } # TODO - String.new should not be needed here
+                    &quot;w.title = 'Hello'&quot;]
+                ) { |i| String.new(i.bind.w.title) =~ /Hello/i } # TODO - String.new should not be needed here
 
             task(:body =&gt; %{
                     Let's add the content now
@@ -662,12 +711,19 @@ tutorial &quot;IronRuby tutorial&quot; do
                 :code =&gt; [
                     'w.content = Wpf::TextBlock.new',
                     'w.content.text = &quot;Hello IronRuby!&quot;',
-                    'w.content.font_size = 50']) { |i| i.bind.w.content.font_size == 50 }
+                    'w.content.font_size = 50']
+                ) { |i| i.bind.w.content.font_size == 50 }
 
             task(:body =&gt; %{
-                    Remove the window content
+                    You can close the window like this&quot;
+                    
+                        w.close
+                    
+                    However, we will just clear out the content so that we can use the same window in the
+                    next chapter.
                 },
-                :code =&gt; 'w.content = nil') { |i| not i.bind.w.content }
+                :code =&gt; 'w.content = nil'
+                ) { |i| not i.bind.w.content }
         end
 
         chapter &quot;WPF calculator&quot; do
@@ -680,17 +736,20 @@ tutorial &quot;IronRuby tutorial&quot; do
                     eval %{
                         w = Wpf::Window.new unless defined? w and w.class == Wpf::Window
                         w.size_to_content = Wpf::SizeToContent.width_and_height
+                        w.content = nil
                         w.show
                     }, bind
                 },
                 :source_files =&gt; IronRubyTutorial.calc_xaml_path,
-                :code =&gt; &quot;w.content = Wpf.load_xaml_file '#{IronRubyTutorial.calc_xaml_relative_path}'&quot;) { |i| i.bind.w.content }
+                :code =&gt; &quot;w.content = Wpf.load_xaml_file '#{IronRubyTutorial.calc_xaml_relative_path}'&quot;
+                ) { |i| i.bind.w.content }
 
             task(:body =&gt; %{
                     Let's walk the calculator's object model using the +walk+ method defined in the &quot;wpf.rb&quot; 
                     file.
                 },
-                :code =&gt; 'Wpf.walk(w) { |c| puts c }') { |i| i.output =~ /Button: \+/ }
+                :code =&gt; 'Wpf.walk(w) { |c| puts c }'
+                ) { |i| i.output =~ /Button: \+/ }
 
             task :body =&gt; %{
                     Let's filter the results to button only
@@ -726,21 +785,23 @@ tutorial &quot;IronRuby tutorial&quot; do
                         else 
                             c.Result.text = c.Result.text + text
                         end
-                    end
-                }) { |i| i.bind.on_click(Tutorial.stub, '=') == '' }
+                    end}.strip_margin
+                ) { |i| i.bind.on_click(Tutorial.stub, '=') == '' }
 
             task(:body =&gt; %{
                     Let's hook up the event handler
                 },
                 :setup =&gt; Proc.new { |bind| IronRubyTutorial.snoop_add_handler &quot;click&quot;, bind.buttons.first },
-                :code =&gt; 'buttons.each { |b| b.click { on_click w.content, b.content } }') { |i| IronRubyTutorial.click_flag }
+                :code =&gt; 'buttons.each { |b| b.click { on_click w.content, b.content } }'
+                ) { |i| IronRubyTutorial.click_flag }
 
             task(:body =&gt; %{
                     Now you should be able to use the calculator!
                     
                     When you are done, close the calculator window.
                 },
-                :code =&gt; 'w.close') { |i| not i.bind.w.is_visible }
+                :code =&gt; 'w.close'
+                ) { |i| not i.bind.w.is_visible }
         end
     end
 </diff>
      <filename>Merlin/Main/Languages/Ruby/Samples/Tutorial/Tutorials/ironruby_tutorial.rb</filename>
    </modified>
    <modified>
      <diff>@@ -13,8 +13,8 @@
 #
 # ****************************************************************************
 
-require &quot;tutorial&quot;
 require &quot;stringio&quot;
+require File.dirname(__FILE__) + &quot;/tutorial&quot;
 
 class ConsoleTutorial
     attr :tutorial
@@ -30,23 +30,28 @@ class ConsoleTutorial
         @out.puts &quot;---------------------&quot;
         @out.puts &quot;Starting #{chapter.name}&quot;
         @out.print chapter.introduction
+        prompt = &quot;&gt; &quot;
         chapter.tasks.each do |task|
             @out.puts task.description
             task.setup.call(@context.bind) if task.setup
             @out.puts &quot;Enter the following code:&quot;
             @out.puts task.code_string
             begin
-                @out.print &quot;&gt; &quot;
+                @out.print prompt
                 if @in.eof? then raise &quot;No more input... (Task description: #{task.description}\nTask code: #{task.code_string})&quot; end
                 input = @in.gets
                 
                 result = @context.interact input
                 @out.puts result.output if not result.output.empty?
-                if result.error
+                if result.partial_input?
+                  prompt = &quot;* &quot;
+                  next
+                elsif result.error
                   @out.puts result.error.to_s
                 else
                   @out.puts &quot;=&gt; #{result.result.inspect}&quot;
-                end      
+                end
+                prompt = &quot;&gt; &quot;
             end until task.success?(result)
         end
         @out.puts &quot;Chapter completed successfully!&quot;</diff>
      <filename>Merlin/Main/Languages/Ruby/Samples/Tutorial/console_tutorial.rb</filename>
    </modified>
    <modified>
      <diff>@@ -13,12 +13,12 @@
 #
 # ****************************************************************************
 
-require &quot;tutorial&quot;
 require &quot;stringio&quot;
 require &quot;pathname&quot;
 require &quot;erb&quot;
 require &quot;rdoc/markup/simple_markup&quot;
 require &quot;rdoc/markup/simple_markup/to_html&quot;
+require File.dirname(__FILE__) + &quot;/tutorial&quot;
 
 # Utility class to convert from RDoc SimpleMarkup text to WPF FlowDocument.
 # It adds hyperlinking functinality to SM::ToHtml similar to Generators::HyperlinkHtml,</diff>
      <filename>Merlin/Main/Languages/Ruby/Samples/Tutorial/html_tutorial.rb</filename>
    </modified>
    <modified>
      <diff>@@ -13,18 +13,56 @@
 #
 # ****************************************************************************
 
+orig_dir = Dir.pwd
+if $0 == __FILE__
+  filename = File.expand_path __FILE__, orig_dir
+else
+  filename = __FILE__
+end
+dirname = File.dirname filename
+
 require 'rubygems'
 require 'test/spec'
 require 'stringio'
-require 'tutorial'
-require 'console_tutorial'
-require 'html_tutorial'
+require 'fileutils'
+require dirname + '/../tutorial.rb'
+require dirname + '/../console_tutorial'
+require dirname + '/../html_tutorial'
+
+FileUtils.cd(File.expand_path('/')) # This ensures that the tutorial can be launched from any folder
+
+describe &quot;ReplContext&quot; do
+  before(:each) do
+    @context = Tutorial::ReplContext.new
+  end
+  
+  it &quot;works with single-line input&quot; do
+    @context.interact(&quot;2+2&quot;).result.should == 4
+  end
+
+  it &quot;works with multi-line code&quot; do
+    code = [&quot;if true&quot;, &quot;101&quot;, &quot;else&quot;, &quot;102&quot;, &quot;end&quot;].join(&quot;\n&quot;)
+    @context.interact(code).result.should == 101
+  end
+
+  it &quot;works with multi-line input&quot; do
+    result = nil
+    [&quot;if true&quot;, &quot;101&quot;, &quot;else&quot;, &quot;102&quot;, &quot;end&quot;].each {|i| result = @context.interact i }
+    result.result.should == 101
+  end
+
+  it &quot;can be reset&quot; do
+    [&quot;if true&quot;, &quot;101&quot;, &quot;else&quot;].each {|i| @context.interact i }
+    @context.reset_input
+    @context.interact(&quot;2+2&quot;).result.should == 4
+  end
+end
 
 describe &quot;ConsoleTutorial&quot; do 
   before(:each) do
     @in = StringIO.new
     @out = StringIO.new
-    tutorial = Tutorial.get_tutorial(File.dirname(__FILE__) + '/../Tutorials/tryruby_tutorial.rb')
+    tutorial = Tutorial.get_tutorial(dirname + '/../Tutorials/tryruby_tutorial.rb')
     @app = ConsoleTutorial.new tutorial, @in, @out
   end
   
@@ -90,16 +128,17 @@ module TutorialTests
 end
 
 describe &quot;IronRubyTutorial&quot; do
-  TutorialTests.create_tests self, File.dirname(__FILE__) + '/../Tutorials/ironruby_tutorial.rb'
+  TutorialTests.create_tests self, dirname + '/../Tutorials/ironruby_tutorial.rb'
 end
 
 describe &quot;TryRubyTutorial&quot; do
-  TutorialTests.create_tests self, File.dirname(__FILE__) + '/../Tutorials/tryruby_tutorial.rb'
+  TutorialTests.create_tests self, dirname + '/../Tutorials/tryruby_tutorial.rb'
 end
 
 describe &quot;HtmlGeneratorTests&quot; do
   it &quot;basically works&quot; do
-    html_tutorial = HtmlTutorial.new
+    tutorial = Tutorial.get_tutorial(dirname + '/../Tutorials/tryruby_tutorial.rb')
+    html_tutorial = HtmlTutorial.new tutorial
     html = html_tutorial.generate_html
     assert_match %r{&lt;h2&gt;Table of Contents&lt;/h2&gt;}, html
   end</diff>
      <filename>Merlin/Main/Languages/Ruby/Samples/Tutorial/test/test_console.rb</filename>
    </modified>
    <modified>
      <diff>@@ -46,8 +46,6 @@ module Tutorial
             @title = title
             @description = description
             @setup = setup
-            # Since we do not support multi-line commands yet, convert multi-line commands into a single ;-separated line
-            code = code.gsub(/\n\s*/, ' ; ') unless code.respond_to? :to_ary
             @code = code
             @source_files = source_files
             @success_evaluator = success_evaluator
@@ -170,6 +168,7 @@ module Tutorial
         attr :bind
         
         def initialize
+            @partial_input = &quot;&quot;
             @scope = Object.new
 
             class &lt;&lt; @scope            
@@ -209,7 +208,7 @@ module Tutorial
             Thread.current[:evaluating_tutorial_input] = true
             
             begin
-                result = eval(input.to_s, @bind) # TODO - to_s should not be needed here
+                result = eval(@partial_input + input.to_s, @bind) # TODO - to_s should not be needed here
             rescue Exception =&gt; error
                 raise error if error.kind_of? SystemExit
             ensure
@@ -218,7 +217,18 @@ module Tutorial
                 $VERBOSE = old_verbose
             end
 
-            InteractionResult.new(@bind, output.string, result, error)
+            if error.kind_of? SyntaxError and error.message =~ /unexpected (\$end|END_OF_FILE)/
+                @partial_input += input
+                @partial_input += &quot;\n&quot; unless input[input.size-1] == &quot;\n&quot; # TODO - input[-1] seems to cause IndexError
+                InteractionResult.new(@bind, &quot;&quot;, nil, nil, true)
+            else
+                @partial_input = &quot;&quot;
+                InteractionResult.new(@bind, output.string, result, error)
+            end
+        end
+        
+        def reset_input
+          @partial_input = &quot;&quot;
         end
     end
     
@@ -228,11 +238,12 @@ module Tutorial
         attr :result
         attr :error
         
-        def initialize(bind, output, result, error = nil)
+        def initialize(bind, output, result, error = nil, partial_input = false)
             @bind = bind
             @output = output
             @result = result
             @error = error
+            @partial_input = partial_input
             
             raise &quot;result should be nil if an exception was raised&quot; if result and error
         end
@@ -242,13 +253,22 @@ module Tutorial
         end
         
         def result
-            raise &quot;Interaction resulted in an exception&quot; if error
+            raise &quot;Interaction resulted in an exception&quot; if error or @partial_input
             @result
         end
+        
+        def error
+            raise &quot;Partial input received&quot; if @partial_input
+            @error
+        end
+        
+        def partial_input?
+          @partial_input
+        end
     end
     
-    # We define a simple Stub class here instead of using one of the existing gems to avoid dependencies.
-    # Ideally, we could provide a simpler implementation of some existing mocking API to make this easy for folks to use
+    # Simple stub class for mocking.
+    # TODO - move to a real mocking framework
     class Stub
         def initialize() @calls = [] end
         
@@ -388,3 +408,11 @@ class Object
         raise NotImplementedError
     end
 end
+
+class String
+  def strip_margin
+    /( *)\w/ =~ self
+    match = $1
+    gsub(/^#{match}/, &quot;&quot;)
+  end
+end
\ No newline at end of file</diff>
      <filename>Merlin/Main/Languages/Ruby/Samples/Tutorial/tutorial.rb</filename>
    </modified>
    <modified>
      <diff>@@ -46,7 +46,7 @@ end
 
 class System::Windows::Markup::XamlReader
   class &lt;&lt; self
-    alias raw_load load
+    alias raw_load load unless method_defined? :raw_load
   end
   
   def self.load(xaml)
@@ -87,11 +87,11 @@ class Module
 end
 
 class System::Windows::Threading::DispatcherObject
-    def invoke &amp;block
-        require &quot;system.core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;
-        dispatch_callback = System::Action[].new block
-        self.dispatcher.invoke(System::Windows::Threading::DispatcherPriority.Normal, dispatch_callback)
-    end
+  def invoke &amp;block
+    require &quot;system.core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;
+    dispatch_callback = System::Action[].new block
+    self.dispatcher.invoke(System::Windows::Threading::DispatcherPriority.Normal, dispatch_callback)
+  end
 end
 
 class System::Windows::Documents::FlowDocument
@@ -100,7 +100,8 @@ class System::Windows::Documents::FlowDocument
     paragraph.inlines.add(System::Windows::Documents::Run.new(text))
     self.blocks.add paragraph
   end
-    
+  
+  # Converts text in RDoc simple markup format to a WPF FlowDocument object
   def self.from_simple_markup text
     require 'rdoc/markup/simple_markup'
     require 'rdoc/markup/simple_markup/inline'
@@ -140,9 +141,9 @@ module Wpf
   def self.load_xaml_file(filename)
     f = System::IO::FileStream.new filename, System::IO::FileMode.open, System::IO::FileAccess.read
     begin
-        element = XamlReader.load f
+      element = XamlReader.load f
     ensure
-        f.close
+      f.close
     end
     element
   end
@@ -151,19 +152,19 @@ module Wpf
   # Note that it also includes content (which could be just strings).
   def self.walk(tree, &amp;b)
     if not block_given?
-        result = []
-        walk(tree) { |child| result &lt;&lt; child }
-        return result
+      result = []
+      walk(tree) { |child| result &lt;&lt; child }
+      return result
     end
 
     yield tree
 
     if tree.respond_to? :Children
-        tree.Children.each { |child| walk child, &amp;b }
+      tree.Children.each { |child| walk child, &amp;b }
     elsif tree.respond_to? :Child
-        walk tree.Child, &amp;b
+      walk tree.Child, &amp;b
     elsif tree.respond_to? :Content
-        walk tree.Content, &amp;b
+      walk tree.Content, &amp;b
     end
   end
 
@@ -199,6 +200,57 @@ module Wpf
     false
   end
 
+  def self.create_sta_thread &amp;block
+    ts = System::Threading::ThreadStart.new &amp;block
+
+    # Workaround for http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=1306
+    param_types = System::Array[System::Type].new(1) { |i| System::Threading::ThreadStart.to_clr_type }
+    ctor = System::Threading::Thread.to_clr_type.get_constructor param_types    
+    t = ctor.Invoke(System::Array[Object].new(1) { ts })
+    t.ApartmentState = System::Threading::ApartmentState.STA
+    t.Start
+  end
+
+  # Some setup is needed to use WPF from an interactive session console (like iirb). This is because
+  # WPF needs to do message pumping on a thread, iirb also requires a thread to read user input,
+  # and all commands that interact with UI need to be executed on the message pump thread.
+  def self.interact
+    raise NotImplementedError
+    def CallBack(function, priority = DispatcherPriority.Normal)
+      Application.Current.Dispatcher.BeginInvoke(priority, System::Action[].new(function))
+    end
+    
+    def CallBack1(function, arg0, priority = DispatcherPriority.Normal)
+       Application.Current.Dispatcher.BeginInvoke(priority, System::Action[arg0.class].new(function), arg0)
+    end
+    
+    dispatcher = nil    
+    message_pump_started = System::Threading::AutoResetEvent.new false
+
+    create_sta_thread do
+      app = Application.new
+      app.startup do
+        dispatcher = Dispatcher.FromThread System::Threading::Thread.current_thread
+        message_pump_started.set
+      end
+      begin
+        app.run
+      ensure
+        IronRuby::Ruby.SetCommandDispatcher(None) # This is a non-existent method that will need to be implemented
+      end
+    end
+    
+    message_pump_started.wait_one
+    
+    def dispatch_console_command(console_command)
+      if console_command
+        dispatcher.invoke DispatcherPriority.Normal, console_command
+      end
+    end
+    
+    IronRuby::Ruby.SetCommandDispatcher dispatch_console_command # This is a non-existent method that will need to be implemented
+  end
+
   class ToFlowDocument
     include System::Windows
     include System::Windows::Documents</diff>
      <filename>Merlin/Main/Languages/Ruby/Samples/Tutorial/wpf.rb</filename>
    </modified>
    <modified>
      <diff>@@ -55,17 +55,6 @@ module WpfTutorial
         end
       end
 
-      def create_sta_thread &amp;block
-        ts = System::Threading::ThreadStart.new &amp;block
-
-        # Workaround for http://ironruby.codeplex.com/WorkItem/View.aspx?WorkItemId=1306
-        param_types = System::Array[System::Type].new(1) { |i| System::Threading::ThreadStart.to_clr_type }
-        ctor = System::Threading::Thread.to_clr_type.get_constructor param_types    
-        t = ctor.Invoke(System::Array[Object].new(1) { ts })
-        t.ApartmentState = System::Threading::ApartmentState.STA
-        t.Start
-      end
-
       def run_interactive(proc_obj)
         if Application.Current
           app_callback = System::Threading::ThreadStart.new { proc_obj.call rescue puts $! }
@@ -73,7 +62,7 @@ module WpfTutorial
         else
           warn &quot;Setting explicit shutdown. Exit the process by calling 'unload'&quot;
           # Run the app on another thread so that the interactive REPL can stay on the main thread
-          create_sta_thread { proc_obj.call rescue puts $! }
+          Wpf.create_sta_thread { proc_obj.call rescue puts $! }
         end
       end
     end
@@ -377,6 +366,8 @@ module WpfTutorial
 
       @window.repl_input.show!
       @window.repl_input.focus
+      Window.repl.set_prompt
+      Window.repl.context.reset_input
       # TODO - Should use TextChanged here
       @window.repl_input.key_up do |target, event_args|
         if event_args.key == Key.enter
@@ -432,7 +423,7 @@ module WpfTutorial
     def initialize
       @context = ::Tutorial::ReplContext.new
       @prev_newline = nil
-            
+      
       # Hook-up &quot;puts&quot; so that we can redirect asynchronous &quot;puts&quot; (typically called from event-handlers) - atleast
       # the ones that are entered into the REPL
       class &lt;&lt; @context.scope
@@ -456,17 +447,25 @@ module WpfTutorial
       history.scroll_to_line(history.line_count - 1)
     end
 
+    def set_prompt p = &quot;&gt;&gt;&gt;&quot;
+      @prompt = p
+      Window.current.repl_input_arrow.content = p
+    end
+    
     def on_repl_input
       print '' if @prev_newline
       history.show!
 
       input = self.input.text
-      print &quot;&gt;&gt;&gt; #{input}&quot;
+      print &quot;#{@prompt} #{input}&quot;
+      set_prompt
       self.input.text = ''
 
       result = @context.interact input
       print result.output, false unless result.output.empty?
-      if result.error
+      if result.partial_input?
+        set_prompt &quot;...&quot;
+      elsif result.error
         print result.error.to_s
       else
         print &quot;=&gt; #{result.result.inspect}&quot;</diff>
      <filename>Merlin/Main/Languages/Ruby/Samples/Tutorial/wpf_tutorial.rb</filename>
    </modified>
    <modified>
      <diff>@@ -92,7 +92,7 @@ def using(file)
   content = read_file_content(file)
   
   snippet_count = 0
-  content.match(/^\s*#if RUBY\s*(.*?)#endif/m) do
+  content.gsub(/^\s*#if RUBY\s*(.*?)#endif/m) do
     snippet_count += 1
     
     snippet = $1
@@ -103,7 +103,7 @@ def using(file)
 end
 
 def eval_metavariables(content)
-  content.match(/\/\*\$\$\*\/([^;]*)/) do
+  content.gsub(/\/\*\$\$\*\/([^;]*)/) do
     eval('$' + $1)
     puts $1
   end</diff>
      <filename>Merlin/Main/Languages/Ruby/Scripts/CodeGenerator.rb</filename>
    </modified>
    <modified>
      <diff>@@ -58,7 +58,7 @@ class IRTest
 
     if File.exists?(file = &quot;#{@root}\\Scripts\\Python\\GenerateSystemCoreCsproj.py&quot;)
       cmd = &quot;#{@root}\\Bin\\Debug\\ipy.exe #{file}&quot;
-      run_cmd cmd { @results &lt;&lt; &quot;Dev10 Build failed!!!&quot; }
+      run_cmd(cmd) { @results &lt;&lt; &quot;Dev10 Build failed!!!&quot; }
     end
   end
 </diff>
      <filename>Merlin/Main/Languages/Ruby/Scripts/irtests.rb</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>Merlin/Main/Languages/Ruby/Tests/Interop/net/A/a.generated.dll</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>Merlin/Main/Languages/Ruby/Tests/Interop/net/B/b.generated.dll</filename>
    </modified>
    <modified>
      <diff>@@ -330,7 +330,7 @@ public interface IEmptyInterfaceGroup { }
 
     public interface IInterfaceGroup1&lt;T&gt; {void m1();}
     public interface IInterfaceGroup1&lt;T,V&gt; {void m1();}
-#line 224 &quot;./method/invocation/generic_spec.rb&quot;
+#line 226 &quot;./method/invocation/generic_spec.rb&quot;
 public partial class ClassWithMethods {
         #region private methods
   private string Private1Generic0Arg&lt;T&gt;() {
@@ -459,7 +459,7 @@ public partial class ClassWithMethods {
     }
 
     public partial class SubKlass : Klass {}
-#line 262 &quot;./method/invocation/generic_spec.rb&quot;
+#line 264 &quot;./method/invocation/generic_spec.rb&quot;
 #pragma warning disable 693
     public partial class GenericClassWithMethods&lt;K&gt; {
       #region private methods
@@ -584,7 +584,7 @@ public partial class ClassWithMethods {
 
     }
     #pragma warning restore 693
-#line 289 &quot;./method/invocation/generic_spec.rb&quot;
+#line 291 &quot;./method/invocation/generic_spec.rb&quot;
 #pragma warning disable 693
     public partial class GenericClass2Params&lt;K, J&gt; {
       #region private methods</diff>
      <filename>Merlin/Main/Languages/Ruby/Tests/Interop/net/fixtures.generated.cs</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>Merlin/Main/Languages/Ruby/Tests/Interop/net/fixtures.generated.dll</filename>
    </modified>
    <modified>
      <diff>@@ -11,6 +11,26 @@ describe &quot;Reflecting on regular .NET methods&quot; do
   before(:each) do
     @obj = ClassWithMethods.new
   end
+  
+  it &quot;IronRuby::Clr::Name implements equality comparison so that include? works on dual names&quot; do
+    System::AppDomain.singleton_methods.include?(:unload).should be_true
+    System::AppDomain.singleton_methods.include?(&quot;unload&quot;).should be_true
+    System::AppDomain.singleton_methods.include?(&quot;Unload&quot;).should be_false
+  end
+  
+  ruby_version_is &quot;&quot;..&quot;1.8.6&quot; do
+    it &quot;simple names are represented by strings&quot; do
+      System::AppDomain.singleton_methods.include?(:Equals).should be_false
+      System::AppDomain.singleton_methods.include?(&quot;Equals&quot;).should be_true
+    end
+  end
+
+  ruby_version_is &quot;1.9&quot; do
+    it &quot;simple names are represented by symbols&quot; do
+      System::AppDomain.singleton_methods.include?(:Equals).should be_true
+      System::AppDomain.singleton_methods.include?(&quot;Equals&quot;).should be_false
+    end
+  end
 
   it &quot;are included in an objects method list&quot; do
     #.instance_methods(true)</diff>
      <filename>Merlin/Main/Languages/Ruby/Tests/Interop/net/method/reflection_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1182,7 +1182,7 @@ namespace Microsoft.Scripting.Generation {
         //CONFORMING
         [System.Diagnostics.CodeAnalysis.SuppressMessage(&quot;Microsoft.Maintainability&quot;, &quot;CA1502:AvoidExcessiveComplexity&quot;)]
         private void EmitNumericConversion(Type typeFrom, Type typeTo, bool isChecked) {
-            bool isFromUnsigned = TypeUtils.IsUnsigned(typeFrom);
+            bool isFromUnsigned = TypeUtils.IsUnsignedInt(typeFrom);
             bool isFromFloatingPoint = TypeUtils.IsFloatingPoint(typeFrom);
             if (typeTo == typeof(Single)) {
                 if (isFromUnsigned)</diff>
      <filename>Merlin/Main/Runtime/Microsoft.Scripting/Generation/ILGen.cs</filename>
    </modified>
    <modified>
      <diff>@@ -870,24 +870,31 @@ namespace Microsoft.Scripting.Interpreter {
         }
     }
 
-    public class NewInstruction : Instruction {
-        private ConstructorInfo _constructor;
-        private int _argCount;
+    public sealed class NewInstruction : Instruction {
+        private readonly ConstructorInfo _constructor;
+        private readonly int _argCount;
 
         public NewInstruction(ConstructorInfo constructor) {
-            this._constructor = constructor;
-            this._argCount = constructor.GetParameters().Length;
+            _constructor = constructor;
+            _argCount = constructor.GetParameters().Length;
 
         }
         public override int ConsumedStack { get { return _argCount; } }
         public override int ProducedStack { get { return 1; } }
+
         public override int Run(InterpretedFrame frame) {
             object[] args = new object[_argCount];
             for (int i = _argCount - 1; i &gt;= 0; i--) {
                 args[i] = frame.Pop();
             }
 
-            object ret = _constructor.Invoke(args);
+            object ret;
+            try {
+                ret = _constructor.Invoke(args);
+            } catch (TargetInvocationException e) {
+                ExceptionHelpers.UpdateForRethrow(e.InnerException);
+                throw e.InnerException;
+            }
             frame.Push(ret);
             return +1;
         }
@@ -916,12 +923,13 @@ namespace Microsoft.Scripting.Interpreter {
         private readonly FieldInfo _field;
 
         public FieldAccessInstruction(FieldInfo field) {
-            Debug.Assert(!field.IsStatic);
+            Assert.NotNull(field);
             _field = field;
         }
 
         public override int ConsumedStack { get { return 1; } }
         public override int ProducedStack { get { return 1; } }
+
         public override int Run(InterpretedFrame frame) {
             frame.Push(_field.GetValue(frame.Pop()));
             return +1;
@@ -932,12 +940,13 @@ namespace Microsoft.Scripting.Interpreter {
         private readonly FieldInfo _field;
 
         public FieldAssignInstruction(FieldInfo field) {
-            Debug.Assert(!field.IsStatic);
+            Assert.NotNull(field);
             _field = field;
         }
 
         public override int ConsumedStack { get { return 2; } }
         public override int ProducedStack { get { return 0; } }
+
         public override int Run(InterpretedFrame frame) {
             object value = frame.Pop();
             object self = frame.Pop();
@@ -986,6 +995,234 @@ namespace Microsoft.Scripting.Interpreter {
         }
     }
 
+    public abstract class NumericConvertInstruction : Instruction {
+        internal readonly TypeCode _from, _to;
+
+        public NumericConvertInstruction(TypeCode from, TypeCode to) {
+            _from = from;
+            _to = to;
+        }
+
+        public override int ConsumedStack { get { return 1; } }
+        public override int ProducedStack { get { return 1; } }
+
+        public override string ToString() {
+            return InstructionName + &quot;(&quot; + _from + &quot;-&gt;&quot; + _to + &quot;)&quot;;
+        }
+        
+        public sealed class Unchecked : NumericConvertInstruction {
+            public override string InstructionName { get { return &quot;UncheckedConvert&quot;; } }
+
+            public Unchecked(TypeCode from, TypeCode to) 
+                : base(from, to) { 
+            }
+
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(Convert(frame.Pop()));
+                return +1;
+            }
+
+            private object Convert(object obj) {
+                switch (_from) {
+                    case TypeCode.Byte: return ConvertInt32((Byte)obj);
+                    case TypeCode.SByte: return ConvertInt32((SByte)obj);
+                    case TypeCode.Int16: return ConvertInt32((Int16)obj);
+                    case TypeCode.Char: return ConvertInt32((Char)obj);
+                    case TypeCode.Int32: return ConvertInt32((Int32)obj);
+                    case TypeCode.Int64: return ConvertInt64((Int64)obj);
+                    case TypeCode.UInt16: return ConvertInt32((UInt16)obj);
+                    case TypeCode.UInt32: return ConvertInt64((UInt32)obj);
+                    case TypeCode.UInt64: return ConvertUInt64((UInt64)obj);
+                    case TypeCode.Single: return ConvertDouble((Single)obj);
+                    case TypeCode.Double: return ConvertDouble((Double)obj);
+                    default: throw Assert.Unreachable;
+                }
+            }
+
+            private object ConvertInt32(int obj) {
+                unchecked {
+                    switch (_to) {
+                        case TypeCode.Byte: return (Byte)obj;
+                        case TypeCode.SByte: return (SByte)obj;
+                        case TypeCode.Int16: return (Int16)obj;
+                        case TypeCode.Char: return (Char)obj;
+                        case TypeCode.Int32: return (Int32)obj;
+                        case TypeCode.Int64: return (Int64)obj;
+                        case TypeCode.UInt16: return (UInt16)obj;
+                        case TypeCode.UInt32: return (UInt32)obj;
+                        case TypeCode.UInt64: return (UInt64)obj;
+                        case TypeCode.Single: return (Single)obj;
+                        case TypeCode.Double: return (Double)obj;
+                        default: throw Assert.Unreachable;
+                    }
+                }
+            }
+
+            private object ConvertInt64(Int64 obj) {
+                unchecked {
+                    switch (_to) {
+                        case TypeCode.Byte: return (Byte)obj;
+                        case TypeCode.SByte: return (SByte)obj;
+                        case TypeCode.Int16: return (Int16)obj;
+                        case TypeCode.Char: return (Char)obj;
+                        case TypeCode.Int32: return (Int32)obj;
+                        case TypeCode.Int64: return (Int64)obj;
+                        case TypeCode.UInt16: return (UInt16)obj;
+                        case TypeCode.UInt32: return (UInt32)obj;
+                        case TypeCode.UInt64: return (UInt64)obj;
+                        case TypeCode.Single: return (Single)obj;
+                        case TypeCode.Double: return (Double)obj;
+                        default: throw Assert.Unreachable;
+                    }
+                }
+            }
+                                
+            private object ConvertUInt64(UInt64 obj) {
+                unchecked {
+                    switch (_to) {
+                        case TypeCode.Byte: return (Byte)obj;
+                        case TypeCode.SByte: return (SByte)obj;
+                        case TypeCode.Int16: return (Int16)obj;
+                        case TypeCode.Char: return (Char)obj;
+                        case TypeCode.Int32: return (Int32)obj;
+                        case TypeCode.Int64: return (Int64)obj;
+                        case TypeCode.UInt16: return (UInt16)obj;
+                        case TypeCode.UInt32: return (UInt32)obj;
+                        case TypeCode.UInt64: return (UInt64)obj;
+                        case TypeCode.Single: return (Single)obj;
+                        case TypeCode.Double: return (Double)obj;
+                        default: throw Assert.Unreachable;
+                    }
+                }
+            }
+
+            private object ConvertDouble(Double obj) {
+                unchecked {
+                    switch (_to) {
+                        case TypeCode.Byte: return (Byte)obj;
+                        case TypeCode.SByte: return (SByte)obj;
+                        case TypeCode.Int16: return (Int16)obj;
+                        case TypeCode.Char: return (Char)obj;
+                        case TypeCode.Int32: return (Int32)obj;
+                        case TypeCode.Int64: return (Int64)obj;
+                        case TypeCode.UInt16: return (UInt16)obj;
+                        case TypeCode.UInt32: return (UInt32)obj;
+                        case TypeCode.UInt64: return (UInt64)obj;
+                        case TypeCode.Single: return (Single)obj;
+                        case TypeCode.Double: return (Double)obj;
+                        default: throw Assert.Unreachable;
+                    }
+                }
+            }
+        }
+
+        public sealed class Checked : NumericConvertInstruction {
+            public override string InstructionName { get { return &quot;CheckedConvert&quot;; } }
+
+            public Checked(TypeCode from, TypeCode to) 
+                : base(from, to) { 
+            }
+
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(Convert(frame.Pop()));
+                return +1;
+            }
+
+            private object Convert(object obj) {
+                switch (_from) {
+                    case TypeCode.Byte: return ConvertInt32((Byte)obj);
+                    case TypeCode.SByte: return ConvertInt32((SByte)obj);
+                    case TypeCode.Int16: return ConvertInt32((Int16)obj);
+                    case TypeCode.Char: return ConvertInt32((Char)obj);
+                    case TypeCode.Int32: return ConvertInt32((Int32)obj);
+                    case TypeCode.Int64: return ConvertInt64((Int64)obj);
+                    case TypeCode.UInt16: return ConvertInt32((UInt16)obj);
+                    case TypeCode.UInt32: return ConvertInt64((UInt32)obj);
+                    case TypeCode.UInt64: return ConvertUInt64((UInt64)obj);
+                    case TypeCode.Single: return ConvertDouble((Single)obj);
+                    case TypeCode.Double: return ConvertDouble((Double)obj);
+                    default: throw Assert.Unreachable;
+                }
+            }
+
+            private object ConvertInt32(int obj) {
+                checked {
+                    switch (_to) {
+                        case TypeCode.Byte: return (Byte)obj;
+                        case TypeCode.SByte: return (SByte)obj;
+                        case TypeCode.Int16: return (Int16)obj;
+                        case TypeCode.Char: return (Char)obj;
+                        case TypeCode.Int32: return (Int32)obj;
+                        case TypeCode.Int64: return (Int64)obj;
+                        case TypeCode.UInt16: return (UInt16)obj;
+                        case TypeCode.UInt32: return (UInt32)obj;
+                        case TypeCode.UInt64: return (UInt64)obj;
+                        case TypeCode.Single: return (Single)obj;
+                        case TypeCode.Double: return (Double)obj;
+                        default: throw Assert.Unreachable;
+                    }
+                }
+            }
+
+            private object ConvertInt64(Int64 obj) {
+                checked {
+                    switch (_to) {
+                        case TypeCode.Byte: return (Byte)obj;
+                        case TypeCode.SByte: return (SByte)obj;
+                        case TypeCode.Int16: return (Int16)obj;
+                        case TypeCode.Char: return (Char)obj;
+                        case TypeCode.Int32: return (Int32)obj;
+                        case TypeCode.Int64: return (Int64)obj;
+                        case TypeCode.UInt16: return (UInt16)obj;
+                        case TypeCode.UInt32: return (UInt32)obj;
+                        case TypeCode.UInt64: return (UInt64)obj;
+                        case TypeCode.Single: return (Single)obj;
+                        case TypeCode.Double: return (Double)obj;
+                        default: throw Assert.Unreachable;
+                    }
+                }
+            }
+                                
+            private object ConvertUInt64(UInt64 obj) {
+                checked {
+                    switch (_to) {
+                        case TypeCode.Byte: return (Byte)obj;
+                        case TypeCode.SByte: return (SByte)obj;
+                        case TypeCode.Int16: return (Int16)obj;
+                        case TypeCode.Char: return (Char)obj;
+                        case TypeCode.Int32: return (Int32)obj;
+                        case TypeCode.Int64: return (Int64)obj;
+                        case TypeCode.UInt16: return (UInt16)obj;
+                        case TypeCode.UInt32: return (UInt32)obj;
+                        case TypeCode.UInt64: return (UInt64)obj;
+                        case TypeCode.Single: return (Single)obj;
+                        case TypeCode.Double: return (Double)obj;
+                        default: throw Assert.Unreachable;
+                    }
+                }
+            }
+
+            private object ConvertDouble(Double obj) {
+                checked {
+                    switch (_to) {
+                        case TypeCode.Byte: return (Byte)obj;
+                        case TypeCode.SByte: return (SByte)obj;
+                        case TypeCode.Int16: return (Int16)obj;
+                        case TypeCode.Char: return (Char)obj;
+                        case TypeCode.Int32: return (Int32)obj;
+                        case TypeCode.Int64: return (Int64)obj;
+                        case TypeCode.UInt16: return (UInt16)obj;
+                        case TypeCode.UInt32: return (UInt32)obj;
+                        case TypeCode.UInt64: return (UInt64)obj;
+                        case TypeCode.Single: return (Single)obj;
+                        case TypeCode.Double: return (Double)obj;
+                        default: throw Assert.Unreachable;
+                    }
+                }
+            }
+        }
+    }
+
     public class NotInstruction : Instruction {
         public static readonly Instruction Instance = new NotInstruction();
 
@@ -1014,20 +1251,7 @@ namespace Microsoft.Scripting.Interpreter {
 
     public abstract class EqualInstruction : Instruction {
         // Perf: EqualityComparer&lt;T&gt; but is 3/2 to 2 times slower.
-
-        public static readonly Instruction Reference = new EqualReference();
-        public static readonly Instruction Boolean = new EqualBoolean();
-        public static readonly Instruction SByte = new EqualSByte();
-        public static readonly Instruction Int16 = new EqualInt16();
-        public static readonly Instruction Char = new EqualChar();
-        public static readonly Instruction Int32 = new EqualInt32();
-        public static readonly Instruction Int64 = new EqualInt64();
-        public static readonly Instruction Byte = new EqualByte();
-        public static readonly Instruction UInt16 = new EqualUInt16();
-        public static readonly Instruction UInt32 = new EqualUInt32();
-        public static readonly Instruction UInt64 = new EqualUInt64();
-        public static readonly Instruction Single = new EqualSingle();
-        public static readonly Instruction Double = new EqualDouble();
+        private static Instruction _Reference, _Boolean, _SByte, _Int16, _Char, _Int32, _Int64, _Byte, _UInt16, _UInt32, _UInt64, _Single, _Double;
 
         public override int ConsumedStack { get { return 2; } }
         public override int ProducedStack { get { return 1; } }
@@ -1129,24 +1353,24 @@ namespace Microsoft.Scripting.Interpreter {
         public static Instruction Create(Type type) {
             // Boxed enums can be unboxed as their underlying types:
             switch (Type.GetTypeCode(type.IsEnum ? Enum.GetUnderlyingType(type) : type)) {
-                case TypeCode.Boolean: return Boolean;
-                case TypeCode.SByte: return SByte;
-                case TypeCode.Byte: return Byte;
-                case TypeCode.Char: return Char;
-                case TypeCode.Int16: return Int16;
-                case TypeCode.Int32: return Int32;
-                case TypeCode.Int64: return Int64;
+                case TypeCode.Boolean: return _Boolean ?? (_Boolean = new EqualBoolean());
+                case TypeCode.SByte: return _SByte ?? (_SByte = new EqualSByte());
+                case TypeCode.Byte: return _Byte ?? (_Byte = new EqualByte());
+                case TypeCode.Char: return _Char ?? (_Char = new EqualChar());
+                case TypeCode.Int16: return _Int16 ?? (_Int16 = new EqualInt16());
+                case TypeCode.Int32: return _Int32 ?? (_Int32 = new EqualInt32());
+                case TypeCode.Int64: return _Int64 ?? (_Int64 = new EqualInt64());
 
-                case TypeCode.UInt16: return UInt16;
-                case TypeCode.UInt32: return UInt32;
-                case TypeCode.UInt64: return UInt64;
+                case TypeCode.UInt16: return _UInt16 ?? (_UInt16 = new EqualInt16());
+                case TypeCode.UInt32: return _UInt32 ?? (_UInt32 = new EqualInt32());
+                case TypeCode.UInt64: return _UInt64 ?? (_UInt64 = new EqualInt64());
 
-                case TypeCode.Single: return Single;
-                case TypeCode.Double: return Double;
+                case TypeCode.Single: return _Single ?? (_Single = new EqualSingle());
+                case TypeCode.Double: return _Double ?? (_Double = new EqualDouble());
 
                 case TypeCode.Object:
                     if (!type.IsValueType) {
-                        return Reference;
+                        return _Reference ?? (_Reference = new EqualReference());
                     }
                     // TODO: Nullable&lt;T&gt;
                     throw new NotImplementedException();
@@ -1163,21 +1387,8 @@ namespace Microsoft.Scripting.Interpreter {
 
     public abstract class NotEqualInstruction : Instruction {
         // Perf: EqualityComparer&lt;T&gt; but is 3/2 to 2 times slower.
-
-        public static readonly Instruction Reference = new NotEqualReference();
-        public static readonly Instruction Boolean = new NotEqualBoolean();
-        public static readonly Instruction SByte = new NotEqualSByte();
-        public static readonly Instruction Int16 = new NotEqualInt16();
-        public static readonly Instruction Char = new NotEqualChar();
-        public static readonly Instruction Int32 = new NotEqualInt32();
-        public static readonly Instruction Int64 = new NotEqualInt64();
-        public static readonly Instruction Byte = new NotEqualByte();
-        public static readonly Instruction UInt16 = new NotEqualUInt16();
-        public static readonly Instruction UInt32 = new NotEqualUInt32();
-        public static readonly Instruction UInt64= new NotEqualUInt64();
-        public static readonly Instruction Single = new NotEqualSingle();
-        public static readonly Instruction Double = new NotEqualDouble();
-
+        private static Instruction _Reference, _Boolean, _SByte, _Int16, _Char, _Int32, _Int64, _Byte, _UInt16, _UInt32, _UInt64, _Single, _Double;
+            
         public override int ConsumedStack { get { return 2; } }
         public override int ProducedStack { get { return 1; } }
 
@@ -1278,24 +1489,24 @@ namespace Microsoft.Scripting.Interpreter {
         public static Instruction Instance(Type type) {
             // Boxed enums can be unboxed as their underlying types:
             switch (Type.GetTypeCode(type.IsEnum ? Enum.GetUnderlyingType(type) : type)) {
-                case TypeCode.Boolean: return Boolean;
-                case TypeCode.SByte: return SByte;
-                case TypeCode.Byte: return Byte;
-                case TypeCode.Char: return Char;
-                case TypeCode.Int16: return Int16;
-                case TypeCode.Int32: return Int32;
-                case TypeCode.Int64: return Int64;
+                case TypeCode.Boolean: return _Boolean ?? (_Boolean = new NotEqualBoolean());
+                case TypeCode.SByte: return _SByte ?? (_SByte = new NotEqualSByte());
+                case TypeCode.Byte: return _Byte ?? (_Byte = new NotEqualByte());
+                case TypeCode.Char: return _Char ?? (_Char = new NotEqualChar());
+                case TypeCode.Int16: return _Int16 ?? (_Int16 = new NotEqualInt16());
+                case TypeCode.Int32: return _Int32 ?? (_Int32 = new NotEqualInt32());
+                case TypeCode.Int64: return _Int64 ?? (_Int64 = new NotEqualInt64());
 
-                case TypeCode.UInt16: return UInt16;
-                case TypeCode.UInt32: return UInt32;
-                case TypeCode.UInt64: return UInt64;
+                case TypeCode.UInt16: return _UInt16 ?? (_UInt16 = new NotEqualInt16());
+                case TypeCode.UInt32: return _UInt32 ?? (_UInt32 = new NotEqualInt32());
+                case TypeCode.UInt64: return _UInt64 ?? (_UInt64 = new NotEqualInt64());
 
-                case TypeCode.Single: return Single;
-                case TypeCode.Double: return Double;
+                case TypeCode.Single: return _Single ?? (_Single = new NotEqualSingle());
+                case TypeCode.Double: return _Double ?? (_Double = new NotEqualDouble());
 
                 case TypeCode.Object:
                     if (!type.IsValueType) {
-                        return Reference;
+                        return _Reference ?? (_Reference = new NotEqualReference());
                     }
                     // TODO: Nullable&lt;T&gt;
                     throw new NotImplementedException();
@@ -1310,6 +1521,138 @@ namespace Microsoft.Scripting.Interpreter {
         }
     }
 
+    public abstract class LessThanInstruction : Instruction {
+        private static Instruction _SByte, _Int16, _Char, _Int32, _Int64, _Byte, _UInt16, _UInt32, _UInt64, _Single, _Double;
+
+        public override int ConsumedStack { get { return 2; } }
+        public override int ProducedStack { get { return 1; } }
+
+        private LessThanInstruction() {
+        }
+
+        internal sealed class LessThanSByte : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((SByte)frame.Pop()) &lt; ((SByte)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanInt16 : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((Int16)frame.Pop()) &lt; ((Int16)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanChar : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((Char)frame.Pop()) &lt; ((Char)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanInt32 : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((Int32)frame.Pop()) &lt; ((Int32)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanInt64 : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((Int64)frame.Pop()) &lt; ((Int64)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanByte : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((Byte)frame.Pop()) &lt; ((Byte)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanUInt16 : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((UInt16)frame.Pop()) &lt; ((UInt16)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanUInt32 : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((UInt32)frame.Pop()) &lt; ((UInt32)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanUInt64 : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((UInt64)frame.Pop()) &lt; ((UInt64)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanSingle : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((Single)frame.Pop()) &lt; ((Single)frame.Pop()));
+                return +1;
+            }
+        }
+
+        internal sealed class LessThanDouble : LessThanInstruction {
+            public override int Run(InterpretedFrame frame) {
+                frame.Push(((Double)frame.Pop()) &lt; ((Double)frame.Pop()));
+                return +1;
+            }
+        }
+
+        public static Instruction Instance(Type type) {
+            Debug.Assert(!type.IsEnum);
+            switch (Type.GetTypeCode(type)) {
+                case TypeCode.SByte: return _SByte ?? (_SByte = new LessThanSByte());
+                case TypeCode.Byte: return _Byte ?? (_Byte = new LessThanSByte());
+                case TypeCode.Char: return _Char ?? (_Char = new LessThanSByte());
+                case TypeCode.Int16: return _Int16 ?? (_Int16 = new LessThanSByte());
+                case TypeCode.Int32: return _Int32 ?? (_Int32 = new LessThanSByte());
+                case TypeCode.Int64: return _Int64 ?? (_Int64 = new LessThanSByte());
+                case TypeCode.UInt16: return _UInt16 ?? (_UInt16 = new LessThanSByte());
+                case TypeCode.UInt32: return _UInt32 ?? (_UInt32 = new LessThanSByte());
+                case TypeCode.UInt64: return _UInt64 ?? (_UInt64 = new LessThanSByte());
+                case TypeCode.Single: return _Single ?? (_Single = new LessThanSByte());
+                case TypeCode.Double: return _Double ?? (_Double = new LessThanSByte());
+
+                default:
+                    throw Assert.Unreachable;
+            }
+        }
+
+        public override string ToString() {
+            return &quot;LessThan()&quot;;
+        }
+    }
+
+    public sealed class TypeEqualsInstruction : Instruction {
+        public static readonly TypeEqualsInstruction Instance = new TypeEqualsInstruction();
+
+        public override int ConsumedStack { get { return 2; } }
+        public override int ProducedStack { get { return 1; } }
+
+        private TypeEqualsInstruction() {
+        }
+
+        public override int Run(InterpretedFrame frame) {
+            Type type = (Type)frame.Pop();
+            object obj = frame.Pop();
+            frame.Push(ScriptingRuntimeHelpers.BooleanToObject(obj != null &amp;&amp; obj.GetType() == type));
+            return +1;
+        }
+
+        public override string InstructionName {
+            get { return &quot;TypeEquals()&quot;; }
+        }
+    }
+
     #endregion
 
     public class RuntimeVariablesInstruction : Instruction {</diff>
      <filename>Merlin/Main/Runtime/Microsoft.Scripting/Interpreter/Instruction.cs</filename>
    </modified>
    <modified>
      <diff>@@ -21,6 +21,7 @@ using System.Reflection;
 using System.Threading;
 using Microsoft.Scripting.Utils;
 using AstUtils = Microsoft.Scripting.Ast.Utils;
+using Microsoft.Scripting.Generation;
 
 namespace Microsoft.Scripting.Interpreter {
 
@@ -564,8 +565,12 @@ namespace Microsoft.Scripting.Interpreter {
 
             FieldInfo fi = member.Member as FieldInfo;
             if (fi != null) {
-                this.Compile(member.Expression);
-                this.Compile(node.Right);
+                if (member.Expression != null) {
+                    Compile(member.Expression);
+                } else {
+                    PushConstant(null);
+                }
+                Compile(node.Right);
 
                 int index = 0;
                 if (!asVoid) {
@@ -639,6 +644,10 @@ namespace Microsoft.Scripting.Interpreter {
                         CompileNotEqual(node.Left, node.Right);
                         return;
 
+                    case ExpressionType.LessThan:
+                        CompileLessThan(node.Left, node.Right);
+                        return;
+
                     default:
                         throw new NotImplementedException();
                 }
@@ -659,6 +668,17 @@ namespace Microsoft.Scripting.Interpreter {
             AddInstruction(NotEqualInstruction.Instance(left.Type));
         }
 
+        private void CompileLessThan(Expression left, Expression right) {
+            Debug.Assert(left.Type == right.Type &amp;&amp; TypeUtils.IsNumeric(left.Type));
+
+            // TODO:
+            // if (TypeUtils.IsNullableType(left.Type) &amp;&amp; liftToNull) ...
+
+            Compile(left);
+            Compile(right);
+            AddInstruction(LessThanInstruction.Instance(left.Type));
+        }
+
         private void CompileAdd(Expression left, Expression right) {
             if (left.Type == typeof(int) &amp;&amp; right.Type == typeof(int)) {
                 Compile(left);
@@ -688,7 +708,8 @@ namespace Microsoft.Scripting.Interpreter {
                 Compile(index);
                 AddInstruction(SetArrayItemInstruction&lt;object&gt;.Instance);
             } else {
-                throw new NotImplementedException();
+                // TODO: this code doesn't work, we just need to visit the expressions and force compilation
+                _forceCompile = true;
             }
         }
 
@@ -707,16 +728,42 @@ namespace Microsoft.Scripting.Interpreter {
 
         private void CompileConvertUnaryExpression(Expression expr) {
             var node = (UnaryExpression)expr;
-
-            // TODO: check the logic on this, but we think we can ignore conversions in this boxed world
-            Compile(node.Operand);
-
             if (node.Method != null) {
+                Compile(node.Operand);
+
                 // We should be able to ignore Int32ToObject
                 if (node.Method != Runtime.ScriptingRuntimeHelpers.Int32ToObjectMethod) {
                     AddInstruction(new CallInstruction(node.Method));
                 }
+            } else if (node.Type == typeof(void)) {
+                CompileAsVoid(node.Operand);
+            } else {
+                Compile(node.Operand);
+                CompileConvertToType(node.Operand.Type, node.Type, node.NodeType == ExpressionType.ConvertChecked);
+            }
+        }
+
+        private void CompileConvertToType(Type typeFrom, Type typeTo, bool isChecked) {
+            Debug.Assert(typeFrom != typeof(void) &amp;&amp; typeTo != typeof(void));
+
+            if (TypeUtils.AreEquivalent(typeTo, typeFrom)) {
+                return;
+            }
+
+            TypeCode from = Type.GetTypeCode(typeFrom);
+            TypeCode to = Type.GetTypeCode(typeTo);
+            if (TypeUtils.IsNumeric(from) &amp;&amp; TypeUtils.IsNumeric(to)) {
+                if (isChecked) {
+                    AddInstruction(new NumericConvertInstruction.Checked(from, to));
+                } else {
+                    AddInstruction(new NumericConvertInstruction.Unchecked(from, to));
+                }
+                return;
             }
+
+            // TODO: Conversions to a super-class or implemented interfaces are no-op. 
+            // A conversion to a non-implemented interface or an unrelated class, etc. should fail.
+            return;
         }
 
         private void CompileNotExpression(UnaryExpression node) {
@@ -1081,7 +1128,11 @@ namespace Microsoft.Scripting.Interpreter {
                 return;
             }
 
-            //TODO support pass by reference and lots of other fancy stuff
+            //TODO support pass by reference and lots of other fancy stuff;
+            // force compilation for now:
+            if (!CollectionUtils.TrueForAll(node.Method.GetParameters(), (p) =&gt; !p.IsByRefParameter())) {
+                _forceCompile = true;
+            }
 
             if (!node.Method.IsStatic) {
                 this.Compile(node.Object);
@@ -1319,7 +1370,15 @@ namespace Microsoft.Scripting.Interpreter {
         }
 
         private void CompileInvocationExpression(Expression expr) {
-            throw new System.NotImplementedException();
+            var node = (InvocationExpression)expr;
+
+            // TODO: LambdaOperand optimization (see compiler)
+            if (typeof(LambdaExpression).IsAssignableFrom(node.Expression.Type)) {
+                throw new System.NotImplementedException();
+            }
+
+            // TODO: do not create a new Call Expression
+            CompileMethodCallExpression(Expression.Call(node.Expression, node.Expression.Type.GetMethod(&quot;Invoke&quot;), node.Arguments));
         }
 
         private void CompileListInitExpression(Expression expr) {
@@ -1335,10 +1394,33 @@ namespace Microsoft.Scripting.Interpreter {
         }
 
         private void CompileUnboxUnaryExpression(Expression expr) {
-            throw new System.NotImplementedException();
+            var node = (UnaryExpression)expr;
+            // unboxing is a nop:
+            Compile(node.Operand);
+        }
+
+        private void CompileTypeEqualExpression(Expression expr) {
+            Debug.Assert(expr.NodeType == ExpressionType.TypeEqual);
+            var node = (TypeBinaryExpression)expr;
+
+            Compile(node.Expression);
+            PushConstant(node.TypeOperand);
+            AddInstruction(TypeEqualsInstruction.Instance);
         }
 
-        private void CompileTypeBinaryExpression(Expression expr) {
+        private void CompileTypeIsExpression(Expression expr) {
+            Debug.Assert(expr.NodeType == ExpressionType.TypeIs);
+            var node = (TypeBinaryExpression)expr;
+
+            // use TypeEqual for sealed types:
+            if (node.TypeOperand.IsSealed) {
+                Compile(node.Expression);
+                PushConstant(node.TypeOperand);
+                AddInstruction(TypeEqualsInstruction.Instance);
+                return;
+            }
+
+            // TODO:
             throw new System.NotImplementedException();
         }
 
@@ -1434,7 +1516,7 @@ namespace Microsoft.Scripting.Interpreter {
                 case ExpressionType.Subtract: CompileBinaryExpression(expr); break;
                 case ExpressionType.SubtractChecked: CompileBinaryExpression(expr); break;
                 case ExpressionType.TypeAs: CompileUnaryExpression(expr); break;
-                case ExpressionType.TypeIs: CompileTypeBinaryExpression(expr); break;
+                case ExpressionType.TypeIs: CompileTypeIsExpression(expr); break;
                 case ExpressionType.Assign: CompileAssignBinaryExpression(expr, expr.Type == typeof(void)); break;
                 case ExpressionType.Block: CompileBlockExpression(expr, expr.Type == typeof(void)); break;
                 case ExpressionType.DebugInfo: CompileDebugInfoExpression(expr); break;
@@ -1452,7 +1534,7 @@ namespace Microsoft.Scripting.Interpreter {
                 case ExpressionType.Throw: CompileThrowUnaryExpression(expr, expr.Type == typeof(void)); break;
                 case ExpressionType.Try: CompileTryExpression(expr); break;
                 case ExpressionType.Unbox: CompileUnboxUnaryExpression(expr); break;
-                case ExpressionType.TypeEqual: CompileTypeBinaryExpression(expr); break;
+                case ExpressionType.TypeEqual: CompileTypeEqualExpression(expr); break;
                 case ExpressionType.OnesComplement: CompileUnaryExpression(expr); break;
                 case ExpressionType.IsTrue: CompileUnaryExpression(expr); break;
                 case ExpressionType.IsFalse: CompileUnaryExpression(expr); break;</diff>
      <filename>Merlin/Main/Runtime/Microsoft.Scripting/Interpreter/LightCompiler.cs</filename>
    </modified>
    <modified>
      <diff>@@ -22,6 +22,7 @@ using Microsoft.Scripting.Runtime;
 
 namespace Microsoft.Scripting.Utils {
     static class TypeUtils {
+        // keep in sync with System.Core version
         internal static Type GetNonNullableType(Type type) {
             if (IsNullableType(type)) {
                 return type.GetGenericArguments()[0];
@@ -29,35 +30,44 @@ namespace Microsoft.Scripting.Utils {
             return type;
         }
 
+        // keep in sync with System.Core version
         internal static bool IsNullableType(Type type) {
             return type.IsGenericType &amp;&amp; type.GetGenericTypeDefinition() == typeof(Nullable&lt;&gt;);
         }
 
+        // keep in sync with System.Core version
         internal static bool IsBool(Type type) {
             return GetNonNullableType(type) == typeof(bool);
         }
 
+        // keep in sync with System.Core version
         internal static bool IsNumeric(Type type) {
             type = GetNonNullableType(type);
             if (!type.IsEnum) {
-                switch (Type.GetTypeCode(type)) {
-                    case TypeCode.Char:
-                    case TypeCode.SByte:
-                    case TypeCode.Byte:
-                    case TypeCode.Int16:
-                    case TypeCode.Int32:
-                    case TypeCode.Int64:
-                    case TypeCode.Double:
-                    case TypeCode.Single:
-                    case TypeCode.UInt16:
-                    case TypeCode.UInt32:
-                    case TypeCode.UInt64:
-                        return true;
-                }
+                return IsNumeric(Type.GetTypeCode(type));
             }
             return false;
         }
 
+        internal static bool IsNumeric(TypeCode typeCode) {
+            switch (typeCode) {
+                case TypeCode.Char:
+                case TypeCode.SByte:
+                case TypeCode.Byte:
+                case TypeCode.Int16:
+                case TypeCode.Int32:
+                case TypeCode.Int64:
+                case TypeCode.Double:
+                case TypeCode.Single:
+                case TypeCode.UInt16:
+                case TypeCode.UInt32:
+                case TypeCode.UInt64:
+                    return true;
+            }
+            return false;
+        }
+
+        // keep in sync with System.Core version
         internal static bool IsArithmetic(Type type) {
             type = GetNonNullableType(type);
             if (!type.IsEnum) {
@@ -76,7 +86,8 @@ namespace Microsoft.Scripting.Utils {
             return false;
         }
 
-        internal static bool IsUnsigned(Type type) {
+        // keep in sync with System.Core version
+        internal static bool IsUnsignedInt(Type type) {
             type = GetNonNullableType(type);
             if (!type.IsEnum) {
                 switch (Type.GetTypeCode(type)) {
@@ -89,6 +100,7 @@ namespace Microsoft.Scripting.Utils {
             return false;
         }
 
+        // keep in sync with System.Core version
         internal static bool IsIntegerOrBool(Type type) {
             type = GetNonNullableType(type);
             if (!type.IsEnum) {
@@ -226,6 +238,15 @@ namespace Microsoft.Scripting.Utils {
         }
 
         // keep in sync with System.Core version
+        internal static bool AreEquivalent(Type t1, Type t2) {
+#if !SYSTEM_CORE
+            return t1 == t2;
+#else
+            return t1 == t2 || t1.IsEquivalentTo(t2);
+#endif
+        }
+
+        // keep in sync with System.Core version
         internal static bool AreReferenceAssignable(Type dest, Type src) {
             // WARNING: This actually implements &quot;Is this identity assignable and/or reference assignable?&quot;
             if (dest == src) {</diff>
      <filename>Merlin/Main/Runtime/Microsoft.Scripting/Utils/TypeUtils.cs</filename>
    </modified>
    <modified>
      <diff>@@ -18,6 +18,7 @@ using System.Collections.ObjectModel;
 using System.Diagnostics;
 using System.Dynamic.Utils;
 using System.Linq.Expressions.Compiler;
+using System.Reflection;
 using System.Runtime.CompilerServices;
 
 namespace System.Linq.Expressions {
@@ -559,13 +560,13 @@ namespace System.Linq.Expressions {
             ValidateOneArgument(method, ExpressionType.Dynamic, arg1, parameters[2]);
             ValidateDynamicArgument(arg2);
             ValidateOneArgument(method, ExpressionType.Dynamic, arg2, parameters[3]);
-            ValidateDynamicArgument(arg2);
+            ValidateDynamicArgument(arg3);
             ValidateOneArgument(method, ExpressionType.Dynamic, arg3, parameters[4]);
 
             return DynamicExpression.Make(method.GetReturnType(), delegateType, binder, arg0, arg1, arg2, arg3);
         }
 
-        private static System.Reflection.MethodInfo GetValidMethodForDynamic(Type delegateType) {
+        private static MethodInfo GetValidMethodForDynamic(Type delegateType) {
             var method = delegateType.GetMethod(&quot;Invoke&quot;);
             var pi = method.GetParametersCached();
             ContractUtils.Requires(pi.Length &gt; 0 &amp;&amp; pi[0].ParameterType == typeof(CallSite), &quot;delegateType&quot;, Strings.FirstArgumentMustBeCallSite);</diff>
      <filename>ndp/fx/src/Core/Microsoft/Scripting/Ast/DynamicExpression.cs</filename>
    </modified>
    <modified>
      <diff>@@ -26,34 +26,6 @@ namespace System.Linq.Expressions {
 
     internal static class ConstantCheck {
 
-        /// &lt;summary&gt;
-        /// Tests to see if the expression is a constant with the given value.
-        /// &lt;/summary&gt;
-        /// &lt;param name=&quot;e&quot;&gt;The expression to examine&lt;/param&gt;
-        /// &lt;param name=&quot;value&quot;&gt;The constant value to check for.&lt;/param&gt;
-        /// &lt;returns&gt;true/false&lt;/returns&gt;
-        [System.Diagnostics.CodeAnalysis.SuppressMessage(&quot;Microsoft.Performance&quot;, &quot;CA1800:DoNotCastUnnecessarily&quot;)]
-        internal static bool IsConstant(Expression e, bool value) {
-            switch (e.NodeType) {
-                case ExpressionType.AndAlso:
-                    return CheckAndAlso((BinaryExpression)e, value);
-
-                case ExpressionType.OrElse:
-                    return CheckOrElse((BinaryExpression)e, value);
-
-                case ExpressionType.Constant:
-                    return value.Equals(((ConstantExpression)e).Value);
-
-                case ExpressionType.TypeIs:
-                    AnalyzeTypeIsResult result = AnalyzeTypeIs((TypeBinaryExpression)e);
-                    if (value) {
-                        return result == AnalyzeTypeIsResult.KnownTrue;
-                    }
-                    return result == AnalyzeTypeIsResult.KnownFalse;
-            }
-            return false;
-        }
-
         internal static bool IsNull(Expression e) {
             switch (e.NodeType) {
                 case ExpressionType.Constant:
@@ -68,35 +40,6 @@ namespace System.Linq.Expressions {
         }
 
 
-        private static bool CheckAndAlso(BinaryExpression node, bool value) {
-            Debug.Assert(node.NodeType == ExpressionType.AndAlso);
-
-            if (node.Method != null || node.IsLifted) {
-                return false;
-            }
-    
-            if (value) {
-                return IsConstant(node.Left, true) &amp;&amp; IsConstant(node.Right, true);
-            } else {
-                // if left isn't a constant it has to be evaluated
-                return IsConstant(node.Left, false);
-            }
-        }
-
-        private static bool CheckOrElse(BinaryExpression node, bool value) {
-            Debug.Assert(node.NodeType == ExpressionType.OrElse);
-
-            if (node.Method != null || node.IsLifted) {
-                return false;
-            }
-
-            if (value) {
-                return IsConstant(node.Left, true);
-            } else {
-                return IsConstant(node.Left, false) &amp;&amp; IsConstant(node.Right, false);
-            }
-        }
-
         /// &lt;summary&gt;
         /// If the result of a TypeBinaryExpression is known statically, this
         /// returns the result, otherwise it returns null, meaning we'll need</diff>
      <filename>ndp/fx/src/Core/Microsoft/Scripting/Compiler/ConstantCheck.cs</filename>
    </modified>
    <modified>
      <diff>@@ -443,12 +443,38 @@ namespace System.Linq.Expressions.Compiler {
 
         #region Optimized branching
 
+        /// &lt;summary&gt;
+        /// Emits the expression and then either brtrue/brfalse to the label.
+        /// &lt;/summary&gt;
+        /// &lt;param name=&quot;branchValue&quot;&gt;True for brtrue, false for brfalse.&lt;/param&gt;
+        /// &lt;param name=&quot;node&quot;&gt;The expression to emit.&lt;/param&gt;
+        /// &lt;param name=&quot;label&quot;&gt;The label to conditionally branch to.&lt;/param&gt;
+        /// &lt;remarks&gt;
+        /// This function optimizes equality and short circuiting logical
+        /// operators to avoid double-branching, minimize instruction count,
+        /// and generate similar IL to the C# compiler. This is important for
+        /// the JIT to optimize patterns like:
+        ///     x != null AndAlso x.GetType() == typeof(SomeType)
+        ///     
+        /// One optimization we don't do: we always emits at least one
+        /// conditional branch to the label, and always possibly falls through,
+        /// even if we know if the branch will always succeed or always fail.
+        /// We do this to avoid generating unreachable code, which is fine for
+        /// the CLR JIT, but doesn't verify with peverify.
+        /// 
+        /// This kind of optimization could be implemented safely, by doing
+        /// constant folding over conditionals and logical expressions at the
+        /// tree level.
+        /// &lt;/remarks&gt;
         [System.Diagnostics.CodeAnalysis.SuppressMessage(&quot;Microsoft.Performance&quot;, &quot;CA1800:DoNotCastUnnecessarily&quot;)]
         private void EmitExpressionAndBranch(bool branchValue, Expression node, Label label) {
             CompilationFlags startEmitted = EmitExpressionStart(node);
             try {
                 if (node.Type == typeof(bool)) {
                     switch (node.NodeType) {
+                        case ExpressionType.Not:
+                            EmitBranchNot(branchValue, (UnaryExpression)node, label);
+                            return;
                         case ExpressionType.AndAlso:
                         case ExpressionType.OrElse:
                             EmitBranchLogical(branchValue, (BinaryExpression)node, label);
@@ -473,6 +499,15 @@ namespace System.Linq.Expressions.Compiler {
             _ilg.Emit(branch ? OpCodes.Brtrue : OpCodes.Brfalse, label);
         }
 
+        private void EmitBranchNot(bool branch, UnaryExpression node, Label label) {
+            if (node.Method != null) {
+                EmitExpression(node, CompilationFlags.EmitAsNoTail | CompilationFlags.EmitNoExpressionStart);
+                EmitBranchOp(branch, label);
+                return;
+            }
+            EmitExpressionAndBranch(!branch, node.Operand, label);
+        }
+
         private void EmitBranchComparison(bool branch, BinaryExpression node, Label label) {
             Debug.Assert(node.NodeType == ExpressionType.Equal || node.NodeType == ExpressionType.NotEqual);
             Debug.Assert(!node.IsLiftedToNull);
@@ -555,35 +590,29 @@ namespace System.Linq.Expressions.Compiler {
             //     if (!(left &amp;&amp; right)) branch value
             // becomes:
             //     if (!left || !right) branch value
-
+            //
+            // The observation is that &quot;brtrue(x &amp;&amp; y)&quot; has the same codegen as
+            // &quot;brfalse(x || y)&quot; except the branches have the opposite sign.
+            // Same for &quot;brfalse(x &amp;&amp; y)&quot; and &quot;brtrue(x || y)&quot;.
+            //
             if (branch == isAnd) {
-                EmitBranchAnd(branch, (BinaryExpression)node, label);
+                EmitBranchAnd(branch, node, label);
             } else {
-                EmitBranchOr(branch, (BinaryExpression)node, label);
+                EmitBranchOr(branch, node, label);
             }
         }
 
         // Generates optimized AndAlso with branch == true
         // or optimized OrElse with branch == false
         private void EmitBranchAnd(bool branch, BinaryExpression node, Label label) {
-            // if (left AND right) branch label
-
-            if (!ConstantCheck.IsConstant(node.Left, !branch) &amp;&amp; !ConstantCheck.IsConstant(node.Right, !branch)) {
-                if (ConstantCheck.IsConstant(node.Left, branch)) {
-                    EmitExpressionAndBranch(branch, node.Right, label);
-                } else if (ConstantCheck.IsConstant(node.Right, branch)) {
-                    EmitExpressionAndBranch(branch, node.Left, label);
-                } else {
-                    // if (left) then 
-                    //   if (right) branch label
-                    // endif
-
-                    Label endif = _ilg.DefineLabel();
-                    EmitExpressionAndBranch(!branch, node.Left, endif);
-                    EmitExpressionAndBranch(branch, node.Right, label);
-                    _ilg.MarkLabel(endif);
-                }
-            }
+            // if (left) then 
+            //   if (right) branch label
+            // endif
+
+            Label endif = _ilg.DefineLabel();
+            EmitExpressionAndBranch(!branch, node.Left, endif);
+            EmitExpressionAndBranch(branch, node.Right, label);
+            _ilg.MarkLabel(endif);
         }
 
         // Generates optimized OrElse with branch == true
@@ -591,19 +620,8 @@ namespace System.Linq.Expressions.Compiler {
         private void EmitBranchOr(bool branch, BinaryExpression node, Label label) {
             // if (left OR right) branch label
 
-            if (ConstantCheck.IsConstant(node.Left, branch)) {
-                _ilg.Emit(OpCodes.Br, label);
-            } else {
-                if (!ConstantCheck.IsConstant(node.Left, !branch)) {
-                    EmitExpressionAndBranch(branch, node.Left, label);
-                }
-
-                if (ConstantCheck.IsConstant(node.Right, branch)) {
-                    _ilg.Emit(OpCodes.Br, label);
-                } else if (!ConstantCheck.IsConstant(node.Right, !branch)) {
-                    EmitExpressionAndBranch(branch, node.Right, label);
-                }
-            }
+            EmitExpressionAndBranch(branch, node.Left, label);
+            EmitExpressionAndBranch(branch, node.Right, label);
         }
 
         private void EmitBranchBlock(bool branch, BlockExpression node, Label label) {</diff>
      <filename>ndp/fx/src/Core/Microsoft/Scripting/Compiler/LambdaCompiler.Logical.cs</filename>
    </modified>
    <modified>
      <diff>@@ -203,27 +203,3 @@ namespace System {
 }
 
 #endif
-
-#if !SPECSHARP
-
-namespace Microsoft.Contracts {
-    [Conditional(&quot;SPECSHARP&quot;), AttributeUsage(AttributeTargets.Delegate | AttributeTargets.Event | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Constructor, AllowMultiple = false, Inherited = true)]
-    internal sealed class StateIndependentAttribute : Attribute {
-    }
-
-#if MICROSOFT_SCRIPTING_CORE
-    [Conditional(&quot;SPECSHARP&quot;), AttributeUsage(AttributeTargets.Delegate | AttributeTargets.Event | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Constructor, AllowMultiple = false, Inherited = true)]
-    internal sealed class PureAttribute : Attribute {
-    }
-#endif
-
-    [Conditional(&quot;SPECSHARP&quot;), AttributeUsage(AttributeTargets.Delegate | AttributeTargets.Event | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Constructor, AllowMultiple = false, Inherited = true)]
-    internal sealed class ConfinedAttribute : Attribute {
-    }
-
-    [Conditional(&quot;SPECSHARP&quot;), AttributeUsage(AttributeTargets.Field)]
-    internal sealed class StrictReadonlyAttribute : Attribute {
-    }
-}
-
-#endif</diff>
      <filename>ndp/fx/src/Core/Microsoft/Scripting/Stubs.cs</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b1fe23ee1dc61e14ef70586945f4ad639fd63fa8</id>
    </parent>
  </parents>
  <author>
    <name>Jim Deville</name>
    <email>jdeville@microsoft.com</email>
  </author>
  <url>http://github.com/ironruby/ironruby/commit/2b73aba8bde0e6cf2ee0e579d6dabee57836708a</url>
  <id>2b73aba8bde0e6cf2ee0e579d6dabee57836708a</id>
  <committed-date>2009-06-19T10:46:46-07:00</committed-date>
  <authored-date>2009-06-19T10:46:46-07:00</authored-date>
  <message>Syncing to head of TFS</message>
  <tree>e404820686b7e27f8de84c8e6c26b01afc429890</tree>
  <committer>
    <name>Jim Deville</name>
    <email>jdeville@microsoft.com</email>
  </committer>
</commit>
