[svn] r7058: nemerle/trunk/ncc: generation/Typer3.n testsuite/positive/delegate.n

malekith svnadmin at nemerle.org
Wed Dec 6 13:08:58 CET 2006


Log:
It seems delegate proxies were not needed at all. Kill 'em. Resolves #718.

Author: malekith
Date: Wed Dec  6 13:08:57 2006
New Revision: 7058

Modified:
   nemerle/trunk/ncc/generation/Typer3.n
   nemerle/trunk/ncc/testsuite/positive/delegate.n

Modified: nemerle/trunk/ncc/generation/Typer3.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer3.n	(original)
+++ nemerle/trunk/ncc/generation/Typer3.n	Wed Dec  6 13:08:57 2006
@@ -604,48 +604,19 @@
 
     EmitDelegateProxy (expr : TExpr) : TExpr * TExpr.MethodAddress
     {
-      def decl =
+      def (fnty, apply) =
         match (expr.Type.Fix ()) {
-          | MType.Fun (from, ret_type) as ty =>
-            def parms =
-              from.Fix ().GetFunctionArguments ().Map (fun (ty) {
-                def name = Macros.NewSymbol ("parm");
-                (<[ parameter: $(name : name) : $(ty : typed) ]>,
-                 <[ $(name : name) ]>)
-              });
-            def (parms, parm_refs) = List.Split (parms);
-            
-            <[ decl: 
-              private sealed class $(Macros.NewSymbol ("delegate_proxy") : name)
-              {
-                funptr : $(ty : typed);
-                public this (fp : $(ty : typed))
-                {
-                  funptr = fp;
-                }
-
-                public InvokeDelegate (.. $parms) : $(ret_type : typed)
-                {
-                  funptr (.. $parm_refs)
-                }
-              }
-            ]>
-
+          | MType.Fun (from, to) =>
+            def args = from.Fix ().GetUnfixedFunctionArguments ();
+            def fnty = InternalType.GetFunctionType (args.Length);
+            if (to.Fix () is MType.Void)
+              (MType.Class (fnty.VoidTyCon, args), fnty.ApplyVoidMethod)
+            else
+              (MType.Class (fnty.TyCon, args + [to]), fnty.ApplyMethod)
           | _ => assert (false)
         }
 
-      def tb = CurrentType.DefineNestedType (decl);
-      tb.MarkWithSpecialName ();
-      tb.Compile ();
-
-      def ctor = SingleMemberLookup (tb, ".ctor");
-
-      def ctor_call =
-        TExpr.Call (tb.GetMemType (), StaticRef (ctor), [Parm (expr)], false);
-
-      def meth = SingleMemberLookup (tb, "InvokeDelegate") :> IMethod;
-      
-      (ctor_call, TExpr.MethodAddress (tb.GetMemType (), meth, false, []))
+      (expr, TExpr.MethodAddress (fnty, apply, true, []))
     }
     #endregion
 

Modified: nemerle/trunk/ncc/testsuite/positive/delegate.n
==============================================================================
--- nemerle/trunk/ncc/testsuite/positive/delegate.n	(original)
+++ nemerle/trunk/ncc/testsuite/positive/delegate.n	Wed Dec  6 13:08:57 2006
@@ -235,6 +235,7 @@
      def str_arr = Convert (my_arr, fun (x) { (x + 1).ToString () });
      print_arr (str_arr);
      ForEach (str_arr, System.Console.Write : string -> void);
+     System.Console.WriteLine ();
    }
 }
       
@@ -242,6 +243,18 @@
 
 public module M {
 
+// bug #718
+public Sort[T, Val] (this sourse : array [T], getComparableValue : T -> Val) : array [T]
+  where Val: System.IComparable[Val]
+{
+  def Cmp(x : T, y : T) : int
+  {
+    getComparableValue(x).CompareTo(getComparableValue(y))
+  }
+  System.Array.Sort.[T](sourse, System.Comparison.[T](Cmp));
+  sourse
+}
+
   public delegate MyPrintDelegate (s : string) : void;
   private delegate MySprintDelegate (s : string) : string;
   delegate MyIntReturningDelegate () : int;
@@ -339,6 +352,8 @@
     Tester.Mai ();    
     MyClass.Run ();
     FunctionToDelegate.Run ();
+
+    System.Console.WriteLine ($[x | x in Sort ([3, 2, 7, 1, 18].ToArray (), x => -x)])
   }
 }
 
@@ -369,5 +384,6 @@
 -33, -3, 1, 2, 2, 6, 7, 8, 9, 32, 43, 333, 
 -32, -2, 2, 3, 3, 7, 8, 9, 10, 33, 44, 334, 
 -32-2233789103344334
+[18, 7, 3, 2, 1]
 END-OUTPUT
 */



More information about the svn mailing list