[MLton-commit] r7508

Wesley Terpstra wesley at mlton.org
Sun Mar 20 05:12:18 PST 2011


Incremental patch

----------------------------------------------------------------------

A   mlton/trunk/package/debian/patches/11-fixes-20100608-to-20110319.patch

----------------------------------------------------------------------

Added: mlton/trunk/package/debian/patches/11-fixes-20100608-to-20110319.patch
===================================================================
--- mlton/trunk/package/debian/patches/11-fixes-20100608-to-20110319.patch	2011-03-20 13:08:28 UTC (rev 7507)
+++ mlton/trunk/package/debian/patches/11-fixes-20100608-to-20110319.patch	2011-03-20 13:12:17 UTC (rev 7508)
@@ -0,0 +1,665 @@
+Description: Accumulatd fixes since last upstream release
+Author: Wesley W. Terpstra (Debian) <terpstra at debian.org>
+Forwarded: no
+Last-Update: 2011-03-20
+
+Index: regression/common-subexp0.ok
+===================================================================
+--- regression/common-subexp0.ok	(.../tags/on-20100608-release)	(revision 0)
++++ regression/common-subexp0.ok	(.../trunk)	(revision 7506)
+@@ -0,0 +1 @@
++nan
+Index: regression/weak.3.sml
+===================================================================
+--- regression/weak.3.sml	(.../tags/on-20100608-release)	(revision 0)
++++ regression/weak.3.sml	(.../trunk)	(revision 7506)
+@@ -0,0 +1,23 @@
++fun find cache x =
++   case (List.find (fn (y,_) => x = y) (!cache)) of
++      NONE => NONE
++    | SOME (_,r) => SOME r
++fun remove cache x =
++   cache := (List.filter (fn (y,_) => not (x = y)) (!cache))
++fun insert cache (x,r) =
++   cache := (x,r)::(!cache)
++
++val cache = ref []
++
++fun lookup (x : int) =
++   case find cache x of
++      SOME r  => (case MLton.Weak.get r of
++                     SOME r' => r'
++                   | NONE => (remove cache x; lookup x))
++    | NONE    => let val res = x + 1
++                     val wres = MLton.Weak.new res
++                 in insert cache (x, wres);
++                    res
++                 end
++
++val _ = List.app (fn x => print (concat [Int.toString (lookup x), "\n"])) [5,4,3,2,1]
+Index: regression/weak.3.ok
+===================================================================
+--- regression/weak.3.ok	(.../tags/on-20100608-release)	(revision 0)
++++ regression/weak.3.ok	(.../trunk)	(revision 7506)
+@@ -0,0 +1,5 @@
++6
++5
++4
++3
++2
+Index: regression/common-subexp0.sml
+===================================================================
+--- regression/common-subexp0.sml	(.../tags/on-20100608-release)	(revision 0)
++++ regression/common-subexp0.sml	(.../trunk)	(revision 7506)
+@@ -0,0 +1,2 @@
++val x = !(ref 0.0) / !(ref 0.0)
++val _ = print (concat [Real.toString x, "\n"])
+Index: regression/real-basic.x86-mingw.ok
+===================================================================
+--- regression/real-basic.x86-mingw.ok	(.../tags/on-20100608-release)	(revision 0)
++++ regression/real-basic.x86-mingw.ok	(.../trunk)	(revision 7506)
+@@ -0,0 +1,32 @@
++Real32
++  Reported
++    precision:    24
++    max exponent: 128
++    min exponent: ~125
++    min denormal: ~148
++  Actual
++    precision:    64
++    max exponent: 128
++    min exponent: ~149
++    min denormal: ~149
++  Exported
++    precision:    24
++    max exponent: 128
++    min exponent: ~149
++    min denormal: ~149
++Real64
++  Reported
++    precision:    53
++    max exponent: 1024
++    min exponent: ~1021
++    min denormal: ~1073
++  Actual
++    precision:    64
++    max exponent: 1024
++    min exponent: ~1074
++    min denormal: ~1074
++  Exported
++    precision:    53
++    max exponent: 1024
++    min exponent: ~1074
++    min denormal: ~1074
+Index: runtime/platform/mingw.c
+===================================================================
+--- runtime/platform/mingw.c	(.../tags/on-20100608-release)	(revision 7506)
++++ runtime/platform/mingw.c	(.../trunk)	(revision 7506)
+@@ -1308,26 +1308,75 @@
+         }
+ }
+ 
+-/* The default strerror() does not know extended error codes. */
++static const char *MLton_strerrorExtension(int code) {
++        switch (code) {
++        case EINTR:           return "Interrupted function call";
++        case EBADF:           return "Bad file descriptor";
++        case EACCES:          return "Permission denied";
++        case EFAULT:          return "Bad address";
++        case EINVAL:          return "Invalid argument";
++        case EMFILE:          return "Too many open files";
++        case EAGAIN:          return "Resource temporarily unavailable";
++        case EINPROGRESS:     return "Operation in progress";
++        case EALREADY:        return "Connection already in progress";
++        case ENOTSOCK:        return "Not a socket";
++        case EDESTADDRREQ:    return "Destination address required";
++        case EMSGSIZE:        return "Message too long";
++        case EPROTOTYPE:      return "Protocol wrong type for socket";
++        case ENOPROTOOPT:     return "Protocol not available";
++        case EPROTONOSUPPORT: return "Protocol not supported";
++        case ESOCKTNOSUPPORT: return "Socket type not supported";
++        case EOPNOTSUPP:      return "Operation not supported on socket";
++        case EPFNOSUPPORT:    return "Protocol family not supported";
++        case EAFNOSUPPORT:    return "Address family not supported";
++        case EADDRINUSE:      return "Address already in use";
++        case EADDRNOTAVAIL:   return "Address not available";
++        case ENETDOWN:        return "Network is down";
++        case ENETUNREACH:     return "Network unreachable";
++        case ENETRESET:       return "Connection aborted by network";
++        case ECONNABORTED:    return "Connection aborted";
++        case ECONNRESET:      return "Connection reset";
++        case ENOBUFS:         return "No buffer space available";
++        case EISCONN:         return "Socket is connected";
++        case ENOTCONN:        return "The socket is not connected";
++        case ESHUTDOWN:       return "Cannot send after transport endpoint shutdown";
++        case ETIMEDOUT:       return "Connection timed out";
++        case ECONNREFUSED:    return "Connection refused";
++        case ELOOP:           return "Too many levels of symbolic links";
++        case ENAMETOOLONG:    return "Filename too long";
++        case EHOSTDOWN:       return "Host is down";
++        case EHOSTUNREACH:    return "Host is unreachable";
++        case ENOTEMPTY:       return "Directory not empty";
++        case EDQUOT:          return "Disk quota exceeded";
++        case ESTALE:          return "Stale file handle";
++        case EREMOTE:         return "Object is remote";
++        case EUSERS:          return "Too many users";
++        case ECANCELED:       return "Operation canceled";
++        default:              return "Unknown error";
++        }
++}
++
++/* MinGW strerror works for all system-defined errno values.
++ * However, platform/mingw.h adds some missing POSIX networking error codes.
++ * It defines these codes as their closest-equivalent winsock error code.
++ * To report network errors, MLton_fixSocketErrno maps winsock errors to 
++ * their closest POSIX errno value.
++ * 
++ * This function must handle the winsock errno values we have added.
++ * FormatMessage doesn't return the POSIX string for errors, and it uses
++ * the current locale's language. The MinGW strerror is always English.
++ * 
++ * Thus, we just make a big English table to augment strerror.
++ * The descriptions are taken from man errno(3).
++ */
+ char *MLton_strerror(int code) {
+-        static char buffer[512];
++        static char buffer[80];
+         
+-        /* Windows specific strerror */
+-        if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 
+-                          0,      /* Not used for FROM_SYSTEM */
+-                          code,   /* The status code to look up */
+-                          0,      /* Use the default language */
+-                          buffer, /* Write the message to here */
+-                          sizeof(buffer)-1,
+-                          0) == 0) {
+-                strcpy(buffer, "Unknown error");
+-        }
+-        
+-        /* Cut message at EOL */
+-        for (int i = 0; buffer[i]; ++i)
+-                if (buffer[i] == '\n' || buffer[i] == '\r')
+-                        buffer[i] = 0;
+-        
++#undef strerror
++        if (code < sys_nerr) return strerror(code);
++#define strerror MLton_strerror
++
++        strcpy(buffer, MLton_strerrorExtension(code));
+         return buffer;
+ }
+ 
+Index: mlton/atoms/real-x.fun
+===================================================================
+--- mlton/atoms/real-x.fun	(.../tags/on-20100608-release)	(revision 7506)
++++ mlton/atoms/real-x.fun	(.../trunk)	(revision 7506)
+@@ -1,4 +1,4 @@
+-(* Copyright (C) 2009 Matthew Fluet.
++(* Copyright (C) 2009,2011 Matthew Fluet.
+  * Copyright (C) 2004-2006 Henry Cejtin, Matthew Fluet, Suresh
+  *    Jagannathan, and Stephen Weeks.
+  *
+@@ -42,9 +42,12 @@
+        | R64 => doit (Real64.fromString, Real64.isFinite, Real64)
+    end
+ 
+-(* We need to check the sign bit when comparing reals so that we don't treat
+- * 0.0 and ~0.0 identically.  The difference between the two is detectable by
+- * user programs that look at the sign bit.
++(* RealX.equals determines if two floating-point constants are equal.
++ * Must check the sign bit, since Real{32,64}.== ignores the sign of
++ * zeros; the difference between 0.0 and ~0.0 is observable by
++ * programs that examine the sign bit.
++ * Must check for nan, since Real{32,64}.== returns false for any
++ * comparison with nan values.
+  *)
+ fun equals (r, r') =
+    case (r, r') of
+@@ -52,13 +55,15 @@
+          let
+             open Real32
+          in
+-            equals (r, r') andalso signBit r = signBit r'
++            (equals (r, r') andalso signBit r = signBit r')
++            orelse (isNan r andalso isNan r')
+          end
+     | (Real64 r, Real64 r') =>
+          let
+             open Real64
+          in
+-            equals (r, r') andalso signBit r = signBit r'
++            (equals (r, r') andalso signBit r = signBit r')
++            orelse (isNan r andalso isNan r')
+          end
+     | _ => false
+ 
+Index: mlton/main/main.fun
+===================================================================
+--- mlton/main/main.fun	(.../tags/on-20100608-release)	(revision 7506)
++++ mlton/main/main.fun	(.../trunk)	(revision 7506)
+@@ -737,7 +737,7 @@
+                    Result.Yes () => ()
+                  | Result.No s' => usage (concat ["invalid -ssa2-passes arg: ", s']))
+           | NONE => Error.bug "ssa2 optimization passes missing")),
+-       (Normal, "stop", " {f|g|o|sml|tc}", "when to stop",
++       (Normal, "stop", " {f|g|o|tc}", "when to stop",
+         SpaceString
+         (fn s =>
+          stop := (case s of
+Index: mlton/ssa/common-subexp.fun
+===================================================================
+--- mlton/ssa/common-subexp.fun	(.../tags/on-20100608-release)	(revision 7506)
++++ mlton/ssa/common-subexp.fun	(.../trunk)	(revision 7506)
+@@ -1,4 +1,4 @@
+-(* Copyright (C) 2009 Matthew Fluet.
++(* Copyright (C) 2009,2011 Matthew Fluet.
+  * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh
+  *    Jagannathan, and Stephen Weeks.
+  * Copyright (C) 1997-2000 NEC Research Institute.
+@@ -17,7 +17,7 @@
+ fun eliminate (Program.T {globals, datatypes, functions, main}) =
+    let
+       (* Keep track of control-flow specific cse's,
+-       * arguments, and in-degree of blocks. 
++       * arguments, and in-degree of blocks.
+        *)
+       val {get = labelInfo: Label.t -> {add: (Var.t * Exp.t) list ref,
+                                         args: (Var.t * Type.t) vector,
+@@ -33,7 +33,7 @@
+          Property.getSetOnce (Var.plist, Property.initConst NONE)
+       (* Keep track of the variable that holds the length of arrays (and
+        * vectors and strings).
+-       *) 
++       *)
+       val {get = getLength: Var.t -> Var.t option, set = setLength, ...} =
+          Property.getSetOnce (Var.plist, Property.initConst NONE)
+       fun canonVar x =
+@@ -52,8 +52,8 @@
+           | Const _ => e
+           | PrimApp {prim, targs, args} =>
+                let
+-                  fun doit args = 
+-                     PrimApp {prim = prim, 
++                  fun doit args =
++                     PrimApp {prim = prim,
+                               targs = targs,
+                               args = args}
+                   val args = canonVars args
+@@ -86,7 +86,7 @@
+                           | IntInf_xorb => true
+                           | _ => false)
+                         then
+-                           let 
++                           let
+                               val (a0, a1) = canon2 ()
+                            in doit (Vector.new3 (a0, a1, arg 2))
+                            end
+@@ -103,7 +103,7 @@
+          HashSet.new {hash = #hash}
+       fun lookup (var, exp, hash) =
+          HashSet.lookupOrInsert
+-         (table, hash, 
++         (table, hash,
+           fn {exp = exp', ...} => Exp.equals (exp, exp'),
+           fn () => {exp = exp,
+                     hash = hash,
+@@ -113,9 +113,9 @@
+       (* The hash-cons'ing of globals in ConstantPropagation ensures
+        *  that each global is unique.
+        *)
+-      val _ = 
++      val _ =
+          Vector.foreach
+-         (globals, fn Statement.T {var, exp, ...} => 
++         (globals, fn Statement.T {var, exp, ...} =>
+           let
+              val exp = canon exp
+              val _ = lookup (valOf var, exp, Exp.hash exp)
+@@ -138,15 +138,25 @@
+                       display (seq [Label.layout label, str ": ", str s])
+                     end)
+                   val _ = diag "started"
+-                  val removes = ref []
++                  val remove = ref []
+                   val {add, ...} = labelInfo label
++                  val _ = Control.diagnostics
++                          (fn display =>
++                           let open Layout
++                           in
++                              display (seq [str "add: ",
++                                            List.layout (fn (var,exp) =>
++                                                         seq [Var.layout var,
++                                                              str ": ",
++                                                              Exp.layout exp]) (!add)])
++                           end)
+                   val _ = List.foreach
+                           (!add, fn (var, exp) =>
+                            let
+                              val hash = Exp.hash exp
+                              val elem as {var = var', ...} = lookup (var, exp, hash)
+                              val _ = if Var.equals(var, var')
+-                                       then List.push (removes, elem)
++                                       then List.push (remove, elem)
+                                        else ()
+                            in
+                              ()
+@@ -165,18 +175,18 @@
+                       in
+                          case var of
+                             NONE => keep ()
+-                          | SOME var => 
++                          | SOME var =>
+                                let
+                                   fun replace var' =
+                                      (setReplace (var, SOME var'); NONE)
+                                   fun doit () =
+                                      let
+                                         val hash = Exp.hash exp
+-                                        val elem as {var = var', ...} = 
++                                        val elem as {var = var', ...} =
+                                            lookup (var, exp, hash)
+                                      in
+                                         if Var.equals(var, var')
+-                                          then (List.push (removes, elem)
++                                          then (List.push (remove, elem)
+                                                 ; keep ())
+                                           else replace var'
+                                      end
+@@ -216,14 +226,15 @@
+                   val _ = diag "statements"
+                   val transfer = Transfer.replaceVar (transfer, canonVar)
+                   val transfer =
+-                     case transfer of 
++                     case transfer of
+                         Arith {prim, args, overflow, success, ...} =>
+                            let
+                               val {args = succArgs,
+                                    inDeg = succInDeg,
+-                                   add = succAdd, ...} = 
++                                   add = succAdd, ...} =
+                                  labelInfo success
+-                              val {inDeg = overInDeg, add = overAdd, ...} =
++                              val {inDeg = overInDeg,
++                                   add = overAdd, ...} =
+                                  labelInfo overflow
+                               val exp = canon (PrimApp {prim = prim,
+                                                         targs = Vector.new0 (),
+@@ -241,7 +252,7 @@
+                                              then let
+                                                      val (var', _) =
+                                                         Vector.sub (succArgs, 0)
+-                                                  in 
++                                                  in
+                                                      setReplace (var', SOME var)
+                                                   end
+                                           else ()
+@@ -251,7 +262,7 @@
+                                              then let
+                                                      val (var, _) =
+                                                         Vector.sub (succArgs, 0)
+-                                                  in 
++                                                  in
+                                                      List.push
+                                                      (succAdd, (var, exp))
+                                                   end
+@@ -284,27 +295,27 @@
+                                        label = label,
+                                        statements = statements,
+                                        transfer = transfer}
++                  val _ = List.push (blocks, block)
++                  val _ = Vector.foreach (children, loop)
++                  val _ = diag "children"
++                  val _ = Control.diagnostics
++                          (fn display =>
++                           let open Layout
++                           in
++                              display (seq [str "remove: ",
++                                            List.layout (fn {var,exp,...} =>
++                                                         seq [Var.layout var,
++                                                              str ": ",
++                                                              Exp.layout exp]) (!remove)])
++                           end)
++                  val _ = List.foreach
++                          (!remove, fn {var, hash, ...} =>
++                           HashSet.remove
++                           (table, hash, fn {var = var', ...} =>
++                            Var.equals (var, var')))
++                  val _ = diag "removed"
+                in
+-                  List.push (blocks, block) ;
+-                  Vector.foreach (children, loop) ;
+-                  diag "children";
+-                  Control.diagnostics
+-                  (fn display =>
+-                   let open Layout
+-                   in
+-                     display (seq [str "removes: ",
+-                                   List.layout (fn {var,exp,...} => 
+-                                                seq [Var.layout var,
+-                                                     str ": ",
+-                                                     Exp.layout exp]) (!removes)])
+-                   end);
+-                  List.foreach 
+-                  (!removes, fn {var, exp, hash} =>
+-                   HashSet.remove
+-                   (table, hash, fn {var = var', exp = exp', ...} =>
+-                    Var.equals (var, var') andalso 
+-                    Exp.equals (exp, exp')));
+-                  diag "removed"
++                  ()
+                end
+             val _ =
+               Control.diagnostics
+@@ -327,7 +338,7 @@
+       val shrink = shrinkFunction {globals = globals}
+       val functions =
+          List.revMap
+-         (functions, fn f => 
++         (functions, fn f =>
+           let
+              val {args, blocks, mayInline, name, raises, returns, start} =
+                 Function.dest f
+@@ -340,7 +351,7 @@
+              val _ =
+                 Vector.foreach
+                 (blocks, fn Block.T {transfer, ...} =>
+-                 Transfer.foreachLabel (transfer, fn label' => 
++                 Transfer.foreachLabel (transfer, fn label' =>
+                                         Int.inc (#inDeg (labelInfo label'))))
+              val blocks = doitTree (Function.dominatorTree f)
+           in
+@@ -352,7 +363,7 @@
+                                    returns = returns,
+                                    start = start})
+           end)
+-      val program = 
++      val program =
+          Program.T {datatypes = datatypes,
+                     globals = globals,
+                     functions = functions,
+Index: mlton/backend/ssa-to-rssa.fun
+===================================================================
+--- mlton/backend/ssa-to-rssa.fun	(.../tags/on-20100608-release)	(revision 7506)
++++ mlton/backend/ssa-to-rssa.fun	(.../trunk)	(revision 7506)
+@@ -1,4 +1,4 @@
+-(* Copyright (C) 2009 Matthew Fluet.
++(* Copyright (C) 2009,2011 Matthew Fluet.
+  * Copyright (C) 1999-2008 Henry Cejtin, Matthew Fluet, Suresh
+  *    Jagannathan, and Stephen Weeks.
+  * Copyright (C) 1997-2000 NEC Research Institute.
+@@ -1375,7 +1375,9 @@
+                                      (CFunction.weakGet
+                                       {arg = Operand.ty (a 0),
+                                        return = t}),
+-                                     none)
++                                     fn () => (case toRtype ty of
++                                                  NONE => none ()
++                                                | SOME t => move (bogus t)))
+                                | Weak_new =>
+                                     ifIsWeakPointer
+                                     (ty,
+Index: mlton/elaborate/elaborate-core.fun
+===================================================================
+--- mlton/elaborate/elaborate-core.fun	(.../tags/on-20100608-release)	(revision 7506)
++++ mlton/elaborate/elaborate-core.fun	(.../trunk)	(revision 7506)
+@@ -2097,31 +2097,32 @@
+                                       pats = pats}
+                                   end))
+                              val numArgs =
+-                                Vector.length (#pats (Vector.sub (rs, 0)))
++                                Vector.fold
++                                (rs, Vector.length (#pats (Vector.sub (rs, 0))),
++                                 fn (r,numArgs) =>
++                                 Int.max (Vector.length (#pats r), numArgs))
+                              val argTypes =
+                                 Vector.tabulate
+                                 (numArgs, fn i =>
+                                  let
+-                                    val t =
+-                                       Cpat.ty
+-                                       (#pat (Vector.sub
+-                                              (#pats (Vector.sub (rs, 0)),
+-                                               i)))
++                                    val t = Type.new ()
+                                     val _ =
+                                        Vector.foreach
+                                        (rs, fn {pats, ...} =>
+-                                        let
+-                                           val {pat, region} =
+-                                              Vector.sub (pats, i)
+-                                        in
+-                                           unify
+-                                           (t, Cpat.ty pat, fn (l1, l2) =>
+-                                            (region,
+-                                             str "function with argument of different types",
+-                                             align [seq [str "argument: ", l2],
+-                                                    seq [str "previous: ", l1],
+-                                                    lay ()]))
+-                                        end)
++                                        if Vector.length pats > i
++                                           then let
++                                                   val {pat, region} =
++                                                      Vector.sub (pats, i)
++                                                in
++                                                   unify
++                                                   (t, Cpat.ty pat, fn (l1, l2) =>
++                                                    (region,
++                                                     str "function with argument of different types",
++                                                     align [seq [str "argument: ", l2],
++                                                            seq [str "previous: ", l1],
++                                                            lay ()]))
++                                                end
++                                        else ())
+                                  in
+                                     t
+                                  end)
+Index: mlton/codegen/amd64-codegen/amd64-generate-transfers.fun
+===================================================================
+--- mlton/codegen/amd64-codegen/amd64-generate-transfers.fun	(.../tags/on-20100608-release)	(revision 7506)
++++ mlton/codegen/amd64-codegen/amd64-generate-transfers.fun	(.../trunk)	(revision 7506)
+@@ -1357,6 +1357,31 @@
+                                     size = pointerSize})),
+                                  size_stack_args + 32)
+                            else (setup_args, size_stack_args)
++                     (* SysV ABI AMD64 requires %rax set to the number
++                      * of xmms registers passed for varags functions;
++                      * since %rax is caller-save, we conservatively 
++                      * set %rax for all functions (not just varargs).
++                      *)
++                     val (reg_args, setup_args) =
++                        if not win64
++                           then let
++                                   val mem = applyFFTempRegArg 8
++                                   val reg = Register.rax
++                                in
++                                   ((mem,reg) :: reg_args,
++                                    AppendList.append
++                                    (setup_args,
++                                     AppendList.fromList
++                                     [Assembly.instruction_mov
++                                      {src = Operand.immediate_int (List.length xmmreg_args),
++                                       dst = Operand.memloc mem,
++                                       size = Size.QUAD},
++                                      Assembly.directive_cache
++                                      {caches = [{register = reg,
++                                                  memloc = mem,
++                                                  reserve = true}]}]))
++                                end
++                        else (reg_args, setup_args)
+                      (*
+                      val reserve_args =
+                         AppendList.fromList
+Index: doc/changelog
+===================================================================
+--- doc/changelog	(.../tags/on-20100608-release)	(revision 7506)
++++ doc/changelog	(.../trunk)	(revision 7506)
+@@ -1,3 +1,20 @@
++Here are the changes from version 2010608 to version YYYYMMDD.
++
++* 2011-02-18
++   - Fixed bug with treatment of nan in common subexpression
++     elimination SSA optimization.
++
++* 2011-02-17
++   - Fixed bug in translation from SSA2 to RSSA with weak pointers.
++
++* 2011-02-05
++   - Fixed bug in amd64 codegen calling convention for varargs C calls.
++
++* 2011-01-17
++   - Fixed bug in comment-handling in lexer for mlyacc's input language.
++
++--------------------------------------------------------------------------------
++
+ Here are the changes from version 20070826 to version 20100608.
+ 
+ Summary:
+Index: lib/mlton/basic/real.sig
+===================================================================
+--- lib/mlton/basic/real.sig	(.../tags/on-20100608-release)	(revision 7506)
++++ lib/mlton/basic/real.sig	(.../trunk)	(revision 7506)
+@@ -1,4 +1,4 @@
+-(* Copyright (C) 2009 Matthew Fluet.
++(* Copyright (C) 2009,2011 Matthew Fluet.
+  * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh
+  *    Jagannathan, and Stephen Weeks.
+  *
+@@ -60,6 +60,7 @@
+       val input: In0.t -> t
+       val inverse: t -> t
+       val isFinite: t -> bool
++      val isNan: t -> bool
+       val layout: t -> Layout.t
+       val ln: t -> t
+       val log2: t -> t
+Index: mlyacc/src/yacc.lex
+===================================================================
+--- mlyacc/src/yacc.lex	(.../tags/on-20100608-release)	(revision 7506)
++++ mlyacc/src/yacc.lex	(.../trunk)	(revision 7506)
+@@ -75,11 +75,11 @@
+ qualid ={id}".";
+ %%
+ <INITIAL>"(*"   => (Add yytext; YYBEGIN COMMENT; commentLevel := 1;
+-                    continue() before YYBEGIN INITIAL);
++                    continue(); YYBEGIN INITIAL; continue());
+ <A>"(*"         => (YYBEGIN EMPTYCOMMENT; commentLevel := 1; continue());
+ <CODE>"(*"      => (Add yytext; YYBEGIN COMMENT; commentLevel := 1;
+-                    continue() before YYBEGIN CODE);
+-<INITIAL>[^%\013\n]+ => (Add yytext; continue());
++                    continue(); YYBEGIN CODE; continue());
++<INITIAL>[^(%\013\n]+ => (Add yytext; continue());
+ <INITIAL>"%%"    => (YYBEGIN A; HEADER (concat (rev (!text)),pos yypos,pos yypos));
+ <INITIAL,CODE,COMMENT,F,EMPTYCOMMENT>{eol}  => (Add yytext; incLineNum yypos; continue());
+ <INITIAL>.       => (Add yytext; continue());
+Index: bin/mlton-script
+===================================================================
+--- bin/mlton-script	(.../tags/on-20100608-release)	(revision 7506)
++++ bin/mlton-script	(.../trunk)	(revision 7506)
+@@ -131,6 +131,7 @@
+         -target-link-opt freebsd '-L/usr/local/lib/'             \
+         -target-link-opt aix '-maix64'                           \
+         -target-link-opt ia64 "$ia64hpux"                        \
++        -target-link-opt linux '-Wl,-znoexecstack'               \
+         -target-link-opt mingw                                   \
+                 '-lws2_32 -lkernel32 -lpsapi -lnetapi32 -lwinmm' \
+         -target-link-opt mingw '-Wl,--enable-stdcall-fixup'      \




More information about the MLton-commit mailing list