[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
};