summaryrefslogtreecommitdiff
path: root/dev-lang/polyml/files/polyml-5.5.1-optimize-closure.patch
diff options
context:
space:
mode:
Diffstat (limited to 'dev-lang/polyml/files/polyml-5.5.1-optimize-closure.patch')
-rw-r--r--dev-lang/polyml/files/polyml-5.5.1-optimize-closure.patch141
1 files changed, 0 insertions, 141 deletions
diff --git a/dev-lang/polyml/files/polyml-5.5.1-optimize-closure.patch b/dev-lang/polyml/files/polyml-5.5.1-optimize-closure.patch
deleted file mode 100644
index 5b33203d69e1..000000000000
--- a/dev-lang/polyml/files/polyml-5.5.1-optimize-closure.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-https://sourceforge.net/p/polyml/code/1869/
-Required for sci-mathematics/isabelle-2013.2
-
-------------------------------------------------------------------------
-r1869 | dcjm | 2013-10-11 05:59:58 -0600 (Fri, 11 Oct 2013) | 1 line
-
-Back-port commits 1855 and 1867 from trunk. These fix two optimiser bugs. Includes the regression tests.
-
-Index: polyml/mlsource/MLCompiler/CodeTree/CODETREE_OPTIMISER.sml
-===================================================================
---- polyml/mlsource/MLCompiler/CodeTree/CODETREE_OPTIMISER.sml (revision 1851)
-+++ polyml/mlsource/MLCompiler/CodeTree/CODETREE_OPTIMISER.sml (working copy)
-@@ -645,8 +645,9 @@
- (thisDec :: decs, thisArg @ args, LoadLocal newAddr :: mapList)
- end
-
-- | mapPattern(ArgPattCurry(currying, ArgPattTuple{allConst=false, filter, ...}) :: patts, n, m) =
-- (* It's a function that returns a tuple. *)
-+ | mapPattern(ArgPattCurry(currying as [_], ArgPattTuple{allConst=false, filter, ...}) :: patts, n, m) =
-+ (* It's a function that returns a tuple. The function must not be curried because
-+ otherwise it returns a function not a tuple. *)
- let
- val (thisDec, thisArg, thisMap) =
- transformFunctionArgument(currying, [LoadArgument m], [LoadArgument n], SOME filter)
-@@ -657,7 +658,7 @@
-
- | mapPattern(ArgPattCurry(currying as firstArgSet :: _, _) :: patts, n, m) =
- (* Transform it if it's curried or if there is a tuple in the first arg. *)
-- if List.length currying >= 2 orelse
-+ if (*List.length currying >= 2 orelse *) (* This transformation is unsafe. *)
- List.exists(fn ArgPattTuple{allConst=false, ...} => true | _ => false) firstArgSet
- then
- let
-@@ -685,6 +686,13 @@
-
- and transformFunctionArgument(argumentArgs, loadPack, loadThisArg, filterOpt) =
- let
-+ (* Disable the transformation of curried arguments for the moment.
-+ This is unsafe. See Test146. The problem is that this transformation
-+ is only safe if the function is applied immediately to all the arguments.
-+ However the usage information is propagated so that if the result of
-+ the first application is bound to a variable and then that variable is
-+ applied it still appears as curried. *)
-+ val argumentArgs = [hd argumentArgs]
- (* We have a function that takes a series of curried argument.
- Change that so that the function takes a list of arguments. *)
- val newAddr = ! localCounter before localCounter := ! localCounter + 1
-@@ -1214,9 +1222,11 @@
- let
- fun checkArg (ArgPattTuple{allConst=false, ...}) = true
- (* Function has at least one tupled arg. *)
-- | checkArg (ArgPattCurry(_, ArgPattTuple{allConst=false, ...})) = true
-- (* Function has an arg that is a function that returns a tuple. *)
-- | checkArg (ArgPattCurry(_ :: _ :: _, _)) = true
-+ | checkArg (ArgPattCurry([_], ArgPattTuple{allConst=false, ...})) = true
-+ (* Function has an arg that is a function that returns a tuple.
-+ It must not be curried otherwise it returns a function not a tuple. *)
-+ (* This transformation is unsafe. See comment in transformFunctionArgument above. *)
-+ (*| checkArg (ArgPattCurry(_ :: _ :: _, _)) = true *)
- (* Function has an arg that is a curried function. *)
- | checkArg (ArgPattCurry(firstArgSet :: _, _)) =
- (* Function has an arg that is a function that
-Index: polyml/Tests/Succeed/Test146.ML
-===================================================================
---- polyml/Tests/Succeed/Test146.ML (revision 0)
-+++ polyml/Tests/Succeed/Test146.ML (revision 1875)
-@@ -0,0 +1,24 @@
-+(* Bug in transformation of arguments which are curried functions. It is not
-+ safe to transform "f" in the argument to "bar". Although it is curried
-+ the application to the first argument "()" is not immediately followed
-+ by the application to the second. *)
-+
-+local
-+ val r = ref 0
-+in
-+ (* Foo should be called exactly once *)
-+ fun foo () = (r:= !r+1; fn i => i)
-+
-+ fun checkOnce () = if !r = 1 then () else raise Fail "bad"
-+end;
-+
-+fun bar f = let val r = f() in (r 1; r 2; List.map r [1, 2, 3]) end;
-+
-+bar foo;
-+
-+checkOnce();
-+
-+exception A and B and C;
-+fun rA () = raise A and rB () = raise B;
-+fun h (f, g) = let val a = f() in g(); a () end;
-+h(rA, rB) handle A => ();
-
-Property changes on: polyml/Tests/Succeed/Test146.ML
-___________________________________________________________________
-Added: svn:eol-style
-## -0,0 +1 ##
-+native
-\ No newline at end of property
-Index: polyml/Tests/Succeed/Test147.ML
-===================================================================
---- polyml/Tests/Succeed/Test147.ML (revision 0)
-+++ polyml/Tests/Succeed/Test147.ML (revision 1875)
-@@ -0,0 +1,31 @@
-+(* Bug in optimiser transformation. A function argument that returns a tuple
-+ can be transformed to take a container but only if it is not curried. *)
-+
-+(* Cut down example from Isabelle that caused an internal error exception. *)
-+
-+fun one _ [] = raise Fail "bad"
-+ | one pred (x :: xs) =
-+ if pred x then (x, xs) else raise Fail "bad";
-+
-+fun foo (scan, f) xs = let val (x, y) = scan xs in (f x, y) end;
-+
-+fun bar (scan1, scan2) xs =
-+ let
-+ val (x, ys) = scan1 xs;
-+ val (y, zs) = scan2 x ys;
-+ in ((x, y), zs) end;
-+
-+fun bub (scan1, scan2) = foo(bar(scan1, (fn _ => scan2)), op ^);
-+
-+val qqq: string list -> string * int = bub(one (fn _ => raise Match), (foo((fn _ => raise Match), String.concat)));
-+
-+(* Further example - This caused a segfault. *)
-+
-+PolyML.Compiler.maxInlineSize := 1;
-+fun f g = let val (x,y) = g 1 2 in x+y end;
-+
-+fun r (x, y, z) = fn _ => (x, y+z);
-+
-+val h: int-> int*int = r (4,5,6);
-+
-+f (fn _ => h);
-
-Property changes on: polyml/Tests/Succeed/Test147.ML
-___________________________________________________________________
-Added: svn:eol-style
-## -0,0 +1 ##
-+native
-\ No newline at end of property