[MLton-commit] r4680

Matthew Fluet MLton@mlton.org
Tue, 11 Jul 2006 19:06:10 -0700


Disallow types with multiple indirections in ffi.
For example, we now disallow "(int vector) vector".
The primary reason for doing so is that on a 64-bit platform with
32-bit object pointers, the elements of an (int vector) vector are
32-bit pointers, which can't be dereferenced.


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

U   mlton/branches/on-20050822-x86_64-branch/basis-library/mlton/process.sml
U   mlton/branches/on-20050822-x86_64-branch/basis-library/posix/process.sml
U   mlton/branches/on-20050822-x86_64-branch/basis-library/primitive/basis-ffi.sml
U   mlton/branches/on-20050822-x86_64-branch/basis-library/util/CUtil.sig
U   mlton/branches/on-20050822-x86_64-branch/basis-library/util/CUtil.sml
U   mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/elaborate-core.fun
U   mlton/branches/on-20050822-x86_64-branch/runtime/basis/MLton/Process/spawne.c
U   mlton/branches/on-20050822-x86_64-branch/runtime/basis/MLton/Process/spawnp.c
U   mlton/branches/on-20050822-x86_64-branch/runtime/basis/Posix/Process/exece.c
U   mlton/branches/on-20050822-x86_64-branch/runtime/basis/Posix/Process/execp.c
U   mlton/branches/on-20050822-x86_64-branch/runtime/gen/basis-ffi.def
U   mlton/branches/on-20050822-x86_64-branch/runtime/gen/gen-types.c

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

Modified: mlton/branches/on-20050822-x86_64-branch/basis-library/mlton/process.sml
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/basis-library/mlton/process.sml	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/basis-library/mlton/process.sml	2006-07-12 02:06:00 UTC (rev 4680)
@@ -319,12 +319,14 @@
             then
                let
                   val path = NullString.nullTerm path
-                  val args = CUtil.C_StringArray.fromList args
-                  val env = CUtil.C_StringArray.fromList env
+                  val args = CUtil.StringVector.fromList args
+                  val env = CUtil.StringVector.fromList env
                in
                   SysCall.simpleResult'
                   ({errVal = C_PId.castFromFixedInt ~1}, fn () =>
-                   Prim.spawne (path, args, env))
+                   Prim.spawne (path, 
+                                #1 args, #2 args, #3 args,
+                                #1 env, #2 env, #3 env))
                end
          else
             case Posix.Process.fork () of
@@ -341,11 +343,12 @@
             then
                let
                   val file = NullString.nullTerm file
-                  val args = CUtil.C_StringArray.fromList args
+                  val args = CUtil.StringVector.fromList args
                in
                   SysCall.simpleResult'
                   ({errVal = C_PId.castFromFixedInt ~1}, fn () =>
-                   Prim.spawnp (file, args))
+                   Prim.spawnp (file, 
+                                #1 args, #2 args, #3 args))
                end
          else    
             case Posix.Process.fork () of

Modified: mlton/branches/on-20050822-x86_64-branch/basis-library/posix/process.sml
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/basis-library/posix/process.sml	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/basis-library/posix/process.sml	2006-07-12 02:06:00 UTC (rev 4680)
@@ -31,7 +31,7 @@
          else fn () => Error.raiseSys Error.nosys
 
       val conv = NullString.nullTerm
-      val convs = CUtil.C_StringArray.fromList
+      val convs = CUtil.StringVector.fromList
 
       fun exece (path, args, env): 'a =
          let
@@ -40,7 +40,9 @@
             val env = convs env
          in
             (SysCall.simple
-             (fn () => Prim.exece (path, args, env))
+             (fn () => Prim.exece (path, 
+                                   #1 args, #2 args, #3 args, 
+                                   #1 env, #2 env, #3 env))
              ; raise Fail "Posix.Process.exece")
          end
          
@@ -53,7 +55,8 @@
             val args = convs args
          in
             (SysCall.simple 
-             (fn () => Prim.execp (file, args))
+             (fn () => Prim.execp (file, 
+                                   #1 args, #2 args, #3 args))
              ; raise Fail "Posix.Process.execp")
          end
 

Modified: mlton/branches/on-20050822-x86_64-branch/basis-library/primitive/basis-ffi.sml
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/basis-library/primitive/basis-ffi.sml	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/basis-library/primitive/basis-ffi.sml	2006-07-12 02:06:00 UTC (rev 4680)
@@ -76,8 +76,8 @@
 structure Process = 
 struct
 val cwait = _import "MLton_Process_cwait" : C_PId.t * (C_Status.t) ref -> (C_PId.t) C_Errno.t;
-val spawne = _import "MLton_Process_spawne" : NullString8.t * NullString8Array.t * NullString8Array.t -> (C_Int.t) C_Errno.t;
-val spawnp = _import "MLton_Process_spawnp" : NullString8.t * NullString8Array.t -> (C_Int.t) C_Errno.t;
+val spawne = _import "MLton_Process_spawne" : NullString8.t * String8.t * (C_Pointer.t) array * (C_Size.t) vector * String8.t * (C_Pointer.t) array * (C_Size.t) vector -> (C_Int.t) C_Errno.t;
+val spawnp = _import "MLton_Process_spawnp" : NullString8.t * String8.t * (C_Pointer.t) array * (C_Size.t) vector -> (C_Int.t) C_Errno.t;
 end
 structure Rlimit = 
 struct
@@ -714,8 +714,8 @@
 structure Process = 
 struct
 val alarm = _import "Posix_Process_alarm" : C_UInt.t -> C_UInt.t;
-val exece = _import "Posix_Process_exece" : NullString8.t * NullString8Array.t * NullString8Array.t -> (C_Int.t) C_Errno.t;
-val execp = _import "Posix_Process_execp" : NullString8.t * NullString8Array.t -> (C_Int.t) C_Errno.t;
+val exece = _import "Posix_Process_exece" : NullString8.t * String8.t * (C_Pointer.t) array * (C_Size.t) vector * String8.t * (C_Pointer.t) array * (C_Size.t) vector -> (C_Int.t) C_Errno.t;
+val execp = _import "Posix_Process_execp" : NullString8.t * String8.t * (C_Pointer.t) array * (C_Size.t) vector -> (C_Int.t) C_Errno.t;
 val exit = _import "Posix_Process_exit" : C_Status.t -> unit;
 val exitStatus = _import "Posix_Process_exitStatus" : C_Status.t -> C_Int.t;
 val fork = _import "Posix_Process_fork" : unit -> (C_PId.t) C_Errno.t;

Modified: mlton/branches/on-20050822-x86_64-branch/basis-library/util/CUtil.sig
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/basis-library/util/CUtil.sig	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/basis-library/util/CUtil.sig	2006-07-12 02:06:00 UTC (rev 4680)
@@ -37,9 +37,15 @@
          sig
             type t = C_StringArray.t
 
-            val fromList: string list -> NullString.t array
             (* extract first n strings from array *)
             val toArrayOfLength: t * int -> string array
             val toList: t -> string list
          end
+
+      (* NULL terminated char** *)
+      structure StringVector :
+         sig
+            type t = string * C_Pointer.t array * C_Size.t vector
+            val fromList: string list -> t
+         end
    end

Modified: mlton/branches/on-20050822-x86_64-branch/basis-library/util/CUtil.sml
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/basis-library/util/CUtil.sml	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/basis-library/util/CUtil.sml	2006-07-12 02:06:00 UTC (rev 4680)
@@ -50,19 +50,23 @@
             fun sub (cs, i) =
                Primitive.Char8.idFromWord8
                (Pointer.getWord8 
-                (Pointer.fromWord cs, C_Ptrdiff.fromInt i))
+                (Pointer.fromWord cs, 
+                 C_Ptrdiff.fromInt i))
 
             fun update (cs, i, c) =
                Pointer.setWord8 
-               (Pointer.fromWord cs, C_Ptrdiff.fromInt i, 
+               (Pointer.fromWord cs, 
+                C_Ptrdiff.fromInt i, 
                 Primitive.Char8.idToWord8 c)
 
-            fun toCharArrayOfLength (cs, n) = toArrayOfLength (cs, sub, n)
+            val length = makeLength (sub, fn #"\000" => true | _ => false)
 
-            fun toStringOfLength cs =
-               String.fromArray (CharArray.fromPoly (toCharArrayOfLength cs))
+            fun toCharArrayOfLength (cs, n) = 
+               toArrayOfLength (cs, sub, n)
 
-            val length = makeLength (sub, fn #"\000" => true | _ => false)
+            fun toStringOfLength (cs, n) =
+               String.fromArray 
+               (CharArray.fromPoly (toCharArrayOfLength (cs, n)))
 
             fun toString cs = toStringOfLength (cs, length cs)
          end
@@ -73,32 +77,53 @@
 
             fun sub (css: t, i) = 
                Pointer.getPointer 
-               (Pointer.fromWord css, C_Ptrdiff.fromInt i)
+               (Pointer.fromWord css, 
+                C_Ptrdiff.fromInt i)
 
             val length = makeLength (sub, Pointer.isNull)
 
-            val toArrayOfLength =
-               fn (css, n) => toArrayOfLength (css, C_String.toString o sub, n)
+            val toArrayOfLength = 
+               fn (css, n) => 
+               toArrayOfLength (css, C_String.toString o sub, n)
 
             fun toArray css = toArrayOfLength (css, length css)
 
             val toList = Array.toList o toArray
+         end
 
-            (* The C side converts the last element of the array, "",
-             * to the null terminator that C primitives expect.
-             * As far as C can tell, the other elements of the array
-             * are just char*'s.
-             *)
-            fun fromList l =
+      structure StringVector =
+         struct
+            type t = string * C_Pointer.t array * C_Size.t vector
+            val padVec =
+               Vector.fromList
+               ["\000\000\000",
+                "\000\000",
+                "\000",
+                "\000\000\000\000"]
+            fun fromList (l : string list) : t =
                let
-                  val a = Array.array (1 +? List.length l, NullString.empty)
-                  val _ =
-                     List.foldl (fn (s, i) =>
-                                 (Array.update (a, i, NullString.nullTerm s)
-                                  ; i +? 1))
-                     0 l
+                  val n = List.length l
+                  (* The C side updates the array with addresses
+                   * using the vector of offsets.
+                   *)
+                  val aPtr = Array.array (1 +? n, C_Pointer.null)
+                  val (vOff,(_,_,acc)) =
+                     Vector.unfoldi
+                     (n, (l, 0w0, []), fn (_, (l, off, acc)) =>
+                      let
+                         val s' = List.hd l
+                         val l' = List.tl l
+                         val n' = String.size s'
+
+                         val pad' = Vector.sub (padVec, Int.mod (n', 4))
+                         val sz' = n' + Vector.length pad'
+                         val off' = C_Size.+ (off, C_Size.fromInt sz')
+                      in
+                         (off, (l', off', pad'::s'::acc))
+                      end)
+                  val str = Vector.concat (List.rev acc)
                in
-                  a
+                  (str, aPtr, vOff)
                end
          end
    end

Modified: mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/elaborate-core.fun
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/elaborate-core.fun	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/mlton/elaborate/elaborate-core.fun	2006-07-12 02:06:00 UTC (rev 4680)
@@ -766,20 +766,30 @@
       val unary: Tycon.t list =
          [Tycon.array, Tycon.reff, Tycon.vector]
 
-      fun toCType (t: t): {ctype: CType.t, name: string} option =
+      fun toNullaryCType (t: t): {ctype: CType.t, name: string} option =
          case deConOpt t of
             NONE => NONE
           | SOME (c, ts) =>
                case List.peek (nullary, fn {tycon = c', ...} =>
                                Tycon.equals (c, c')) of
-                  NONE =>
-                     if List.exists (unary, fn c' => Tycon.equals (c, c'))
-                        andalso 1 = Vector.length ts
-                        andalso isSome (toCType (Vector.sub (ts, 0)))
-                        then SOME {ctype = CType.pointer, name = "Pointer"}
-                     else NONE
+                  NONE => NONE
                 | SOME {ctype, name, ...} => SOME {ctype = ctype, name = name}
 
+      fun toUnaryCType (t: t): {ctype: CType.t, name: string} option =
+         case deConOpt t of
+            NONE => NONE
+          | SOME (c, ts) =>
+               if List.exists (unary, fn c' => Tycon.equals (c, c'))
+                  andalso 1 = Vector.length ts
+                  andalso isSome (toNullaryCType (Vector.sub (ts, 0)))
+                  then SOME {ctype = CType.pointer, name = "Pointer"}
+                  else NONE
+
+      fun toCType (t: t): {ctype: CType.t, name: string} option =
+         case toNullaryCType t of
+            NONE => toUnaryCType t
+          | SOME {ctype, name} => SOME {ctype = ctype, name = name}
+
       val toCType =
          Trace.trace
          ("ElaborateCore.Type.toCType",

Modified: mlton/branches/on-20050822-x86_64-branch/runtime/basis/MLton/Process/spawne.c
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/runtime/basis/MLton/Process/spawne.c	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/runtime/basis/MLton/Process/spawne.c	2006-07-12 02:06:00 UTC (rev 4680)
@@ -2,39 +2,49 @@
 
 #if HAS_SPAWN
 
-C_Errno_t(C_Int_t) MLton_Process_spawne (NullString8_t p, NullString8Array_t a, NullString8Array_t e) {
+C_Errno_t(C_Int_t) MLton_Process_spawne (NullString8_t pNStr,
+                                         String8_t aStr, 
+                                         Array(C_Pointer_t) aPtr,
+                                         Vector(C_Size_t) aOff,
+                                         String8_t eStr, 
+                                         Array(C_Pointer_t) ePtr,
+                                         Vector(C_Size_t) eOff) {
   const char      *path;
-  const char      *asaved;
-  const char      *esaved;
-  const char      **args;
-  const char      **env;
-  int             an;
-  int             en;
+  char            **args;
+  char            **env;
+  int             aLen;
+  int             eLen;
   int             res;
 
-  path = (const char *) p;
-  args = (const char **) a;
-  env = (const char **) e;
-  an = GC_getArrayLength((pointer)a) - 1;
-  asaved = args[an];
-  en = GC_getArrayLength((pointer)e) - 1;
-  esaved = env[en];
-  args[an] = (const char *) NULL;
-  env[en] = (const char *) NULL;
+  path = (const char *) pNStr;
+  args = (char **) aPtr;
+  aLen = GC_getArrayLength((pointer)aPtr);
+  for (int i = 0; i < aLen - 1; i++) {
+    args[i] = (char *)aStr + ((size_t*)aOff)[i];
+  }
+  args[aLen - 1] = NULL;
+  env = (char **) ePtr;
+  eLen = GC_getArrayLength((pointer)ePtr);
+  for (int i = 0; i < eLen - 1; i++) {
+    env[i] = (char *)eStr + ((size_t*)eOff)[i];
+  }
+  env[eLen - 1] = NULL;
   res = spawnve (SPAWN_MODE, path, 
                  (const char * const *)args,
                  (const char * const *)env);
-  args[an] = asaved;
-  env[en] = esaved;
   return res;
 }
 
 #else
 
 __attribute__ ((noreturn))
-C_Errno_t(C_Int_t) MLton_Process_spawne (__attribute__ ((unused)) NullString8_t p, 
-                                         __attribute__ ((unused)) NullString8Array_t a, 
-                                         __attribute__ ((unused)) NullString8Array_t e) {
+C_Errno_t(C_Int_t) MLton_Process_spawne (__attribute__ ((unused))NullString8_t pNStr,
+                                         __attribute__ ((unused))String8_t aStr, 
+                                         __attribute__ ((unused))Array(C_Pointer_t) aPtr,
+                                         __attribute__ ((unused))Vector(C_Size_t) aOff,
+                                         __attribute__ ((unused))String8_t eStr, 
+                                         __attribute__ ((unused))Array(C_Pointer_t) ePtr,
+                                         __attribute__ ((unused)) Vector(C_Size_t) eOff) {
   die ("MLton_Process_spawne not implemented");
 }
 

Modified: mlton/branches/on-20050822-x86_64-branch/runtime/basis/MLton/Process/spawnp.c
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/runtime/basis/MLton/Process/spawnp.c	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/runtime/basis/MLton/Process/spawnp.c	2006-07-12 02:06:00 UTC (rev 4680)
@@ -2,29 +2,34 @@
 
 #if HAS_SPAWN
 
-C_Errno_t(C_Int_t) MLton_Process_spawnp (NullString8_t p, NullString8Array_t a) {
+C_Errno_t(C_Int_t) MLton_Process_spawnp (NullString8_t pNStr, 
+                                         String8_t aStr,
+                                         Array(C_Pointer_t) aPtr,
+                                         Vector(C_Size_t) aOff) {
   const char      *path;
-  const char      *asaved;
-  const char      **args;
-  int             an;
+  char            **args;
+  int             aLen;
   int             res;
 
-  path = (const char *) p;
-  args = (const char **) a;
-  an = GC_getArrayLength((pointer)a) - 1;
-  asaved = args[an];
-  args[an] = (const char *) NULL;
+  path = (const char *) pNStr;
+  args = (char **) aPtr;
+  aLen = GC_getArrayLength((pointer)aPtr);
+  for (int i = 0; i < aLen - 1; i++) {
+    args[i] = (char *)aStr + ((size_t*)aOff)[i];
+  }
+  args[aLen - 1] = NULL;
   res = spawnvp (SPAWN_MODE, path, 
-                    (const char * const *)args);
-  args[an] = asaved;
+                 (const char * const *)args);
   return (C_Errno_t(C_Int_t))res;
 }
 
 #else
 
 __attribute__ ((noreturn))
-C_Errno_t(C_Int_t) MLton_Process_spawnp (__attribute__ ((unused)) NullString8_t p, 
-                                         __attribute__ ((unused)) NullString8Array_t a) {
+C_Errno_t(C_Int_t) MLton_Process_spawnp (__attribute__ ((unused)) NullString8_t pNStr, 
+                                         __attribute__ ((unused)) String8_t aStr,
+                                         __attribute__ ((unused)) Array(C_Pointer_t) aPtr,
+                                         __attribute__ ((unused)) Vector(C_Size_t) aOff) {
   die ("MLton_Process_spawnp not implemented");
 }
 

Modified: mlton/branches/on-20050822-x86_64-branch/runtime/basis/Posix/Process/exece.c
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/runtime/basis/Posix/Process/exece.c	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/runtime/basis/Posix/Process/exece.c	2006-07-12 02:06:00 UTC (rev 4680)
@@ -1,29 +1,35 @@
 #include "platform.h"
 
-C_Errno_t(C_Int_t) Posix_Process_exece (NullString8_t p, NullString8Array_t a, NullString8Array_t e) {
+C_Errno_t(C_Int_t) Posix_Process_exece (NullString8_t pNStr,
+                                        String8_t aStr, 
+                                        Array(C_Pointer_t) aPtr,
+                                        Vector(C_Size_t) aOff,
+                                        String8_t eStr, 
+                                        Array(C_Pointer_t) ePtr,
+                                        Vector(C_Size_t) eOff) {
   const char      *path;
-  char            *asaved;
-  char            *esaved;
   char            **args;
   char            **env;
-  int             an;
-  int             en;
+  int             aLen;
+  int             eLen;
   int             res;
 
-  path = (const char *) p;
-  args = (char **) a;
-  env = (char **) e;
-  an = GC_getArrayLength ((pointer)a) - 1;
-  asaved = args[an];
-  en = GC_getArrayLength ((pointer)e) - 1;
-  esaved = env[en];
-  args[an] = (char *) NULL;
-  env[en] = (char *) NULL;
+  path = (const char *) pNStr;
+  args = (char **) aPtr;
+  aLen = GC_getArrayLength((pointer)aPtr);
+  for (int i = 0; i < aLen - 1; i++) {
+    args[i] = (char *)aStr + ((size_t*)aOff)[i];
+  }
+  args[aLen - 1] = NULL;
+  env = (char **) ePtr;
+  eLen = GC_getArrayLength((pointer)ePtr);
+  for (int i = 0; i < eLen - 1; i++) {
+    env[i] = (char *)eStr + ((size_t*)eOff)[i];
+  }
+  env[eLen - 1] = NULL;
   res = EXECVE (path, 
                 (char * const *)args, 
                 (char * const *)env);
   /* exece failed */
-  args[an] = asaved;
-  env[en] = esaved;
   return (C_Errno_t(C_Int_t))res;
 }

Modified: mlton/branches/on-20050822-x86_64-branch/runtime/basis/Posix/Process/execp.c
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/runtime/basis/Posix/Process/execp.c	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/runtime/basis/Posix/Process/execp.c	2006-07-12 02:06:00 UTC (rev 4680)
@@ -1,20 +1,23 @@
 #include "platform.h"
 
-C_Errno_t(C_Int_t) Posix_Process_execp (NullString8_t f, NullString8Array_t a) {
+C_Errno_t(C_Int_t) Posix_Process_execp (NullString8_t fNStr, 
+                                        String8_t aStr,
+                                        Array(C_Pointer_t) aPtr,
+                                        Vector(C_Size_t) aOff) {
   const char      *file;
-  char            *asaved;
   char            **args;
-  int             an;
+  int             aLen;
   int             res;
-  
-  file = (const char *) f;
-  args = (char **) a;
-  an = GC_getArrayLength ((pointer)a) - 1;
-  asaved = args[an];
-  args[an] = (char *) NULL;
+
+  file = (const char *) fNStr;
+  args = (char **) aPtr;
+  aLen = GC_getArrayLength((pointer)aPtr);
+  for (int i = 0; i < aLen - 1; i++) {
+    args[i] = (char *)aStr + ((size_t*)aOff)[i];
+  }
+  args[aLen - 1] = NULL;
   res = EXECVP (file, 
                 (char * const *)args);
   /* execp failed */
-  args[an] = asaved;
   return (C_Errno_t(C_Int_t))res;
 }

Modified: mlton/branches/on-20050822-x86_64-branch/runtime/gen/basis-ffi.def
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/runtime/gen/basis-ffi.def	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/runtime/gen/basis-ffi.def	2006-07-12 02:06:00 UTC (rev 4680)
@@ -43,8 +43,8 @@
 MLton.Itimer.VIRTUAL = _const : C_Int.t
 MLton.Itimer.set = _import : C_Int.t * C_Time.t * C_SUSeconds.t * C_Time.t * C_SUSeconds.t -> C_Int.t C_Errno.t
 MLton.Process.cwait = _import : C_PId.t * C_Status.t ref -> C_PId.t C_Errno.t
-MLton.Process.spawne = _import : NullString8.t * NullString8Array.t * NullString8Array.t -> C_Int.t C_Errno.t
-MLton.Process.spawnp = _import : NullString8.t * NullString8Array.t -> C_Int.t C_Errno.t
+MLton.Process.spawne = _import : NullString8.t * String8.t * C_Pointer.t array * C_Size.t vector * String8.t * C_Pointer.t array * C_Size.t vector -> C_Int.t C_Errno.t
+MLton.Process.spawnp = _import : NullString8.t * String8.t * C_Pointer.t array * C_Size.t vector -> C_Int.t C_Errno.t
 MLton.Rlimit.AS = _const : C_Int.t
 MLton.Rlimit.CORE = _const : C_Int.t
 MLton.Rlimit.CPU = _const : C_Int.t
@@ -578,8 +578,8 @@
 Posix.Process.W.NOHANG = _const : C_Int.t
 Posix.Process.W.UNTRACED = _const : C_Int.t
 Posix.Process.alarm = _import : C_UInt.t -> C_UInt.t
-Posix.Process.exece = _import : NullString8.t * NullString8Array.t * NullString8Array.t -> C_Int.t C_Errno.t
-Posix.Process.execp = _import : NullString8.t * NullString8Array.t -> C_Int.t C_Errno.t
+Posix.Process.exece = _import : NullString8.t * String8.t * C_Pointer.t array * C_Size.t vector * String8.t * C_Pointer.t array * C_Size.t vector -> C_Int.t C_Errno.t
+Posix.Process.execp = _import : NullString8.t * String8.t * C_Pointer.t array * C_Size.t vector -> C_Int.t C_Errno.t
 Posix.Process.exit = _import __attribute__((noreturn)) : C_Status.t -> unit
 Posix.Process.exitStatus = _import : C_Status.t -> C_Int.t
 Posix.Process.fork = _import : unit -> C_PId.t C_Errno.t

Modified: mlton/branches/on-20050822-x86_64-branch/runtime/gen/gen-types.c
===================================================================
--- mlton/branches/on-20050822-x86_64-branch/runtime/gen/gen-types.c	2006-07-08 16:02:19 UTC (rev 4679)
+++ mlton/branches/on-20050822-x86_64-branch/runtime/gen/gen-types.c	2006-07-12 02:06:00 UTC (rev 4680)
@@ -143,8 +143,6 @@
   ""
   "typedef String8_t NullString8_t;",
   "typedef String8_t NullString8;",
-  "typedef Array(NullString8_t) NullString8Array_t;",
-  "typedef Array(NullString8_t) NullString8Array;",
   "",
   NULL
 };