aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorRichard Brooksby2013-05-02 17:55:07 +0100
committerRichard Brooksby2013-05-02 17:55:07 +0100
commit1bc62b27ef66fc2fea1d4d83648ea0176708d83e (patch)
treec941ecbf6f5e461a73c2f4fe486220129d0b8b5a /mps/code
parent8d00f8dbefd79df749527f66315b445bf1c94070 (diff)
downloademacs-1bc62b27ef66fc2fea1d4d83648ea0176708d83e.tar.gz
emacs-1bc62b27ef66fc2fea1d4d83648ea0176708d83e.zip
First draft of keyword arguments. mainly checking in in order to try working with git fusion on this branch.
Copied from Perforce Change: 181538 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/arena.c5
-rw-r--r--mps/code/arenacl.c31
-rw-r--r--mps/code/arenacv.c2
-rw-r--r--mps/code/arenavm.c19
-rw-r--r--mps/code/arg.c126
-rw-r--r--mps/code/mpm.h12
-rw-r--r--mps/code/mpmtypes.h7
-rw-r--r--mps/code/mps.c1
-rw-r--r--mps/code/mps.h33
-rw-r--r--mps/code/mps.xcodeproj/project.pbxproj4
-rw-r--r--mps/code/mpsacl.h3
-rw-r--r--mps/code/mpsi.c43
-rw-r--r--mps/code/vmix.c7
13 files changed, 271 insertions, 22 deletions
diff --git a/mps/code/arena.c b/mps/code/arena.c
index 1273502968d..904ed0701ac 100644
--- a/mps/code/arena.c
+++ b/mps/code/arena.c
@@ -205,15 +205,16 @@ failGlobalsInit:
205} 205}
206 206
207 207
208/* ArenaCreateV -- create the arena and call initializers */ 208/* ArenaCreate -- create the arena and call initializers */
209 209
210Res ArenaCreateV(Arena *arenaReturn, ArenaClass class, va_list args) 210Res ArenaCreate(Arena *arenaReturn, ArenaClass class, ArgList args)
211{ 211{
212 Arena arena; 212 Arena arena;
213 Res res; 213 Res res;
214 214
215 AVER(arenaReturn != NULL); 215 AVER(arenaReturn != NULL);
216 AVERT(ArenaClass, class); 216 AVERT(ArenaClass, class);
217 AVER(ArgListCheck(args));
217 218
218 /* We must initialise the event subsystem very early, because event logging 219 /* We must initialise the event subsystem very early, because event logging
219 will start as soon as anything interesting happens and expect to write 220 will start as soon as anything interesting happens and expect to write
diff --git a/mps/code/arenacl.c b/mps/code/arenacl.c
index d76a6d9a485..bfe640bfc05 100644
--- a/mps/code/arenacl.c
+++ b/mps/code/arenacl.c
@@ -186,8 +186,7 @@ static void ClientChunkFinish(Chunk chunk)
186 * .arena.init: Once the arena has been allocated, we call ArenaInit 186 * .arena.init: Once the arena has been allocated, we call ArenaInit
187 * to do the generic part of init. 187 * to do the generic part of init.
188 */ 188 */
189static Res ClientArenaInit(Arena *arenaReturn, ArenaClass class, 189static Res ClientArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args)
190 va_list args)
191{ 190{
192 Arena arena; 191 Arena arena;
193 ClientArena clientArena; 192 ClientArena clientArena;
@@ -196,11 +195,32 @@ static Res ClientArenaInit(Arena *arenaReturn, ArenaClass class,
196 Addr base, limit, chunkBase; 195 Addr base, limit, chunkBase;
197 Res res; 196 Res res;
198 Chunk chunk; 197 Chunk chunk;
199 198 mps_arg_s arg;
200 size = va_arg(args, Size); 199
201 base = va_arg(args, Addr);
202 AVER(arenaReturn != NULL); 200 AVER(arenaReturn != NULL);
203 AVER((ArenaClass)mps_arena_class_cl() == class); 201 AVER((ArenaClass)mps_arena_class_cl() == class);
202 AVER(ArgListCheck(args));
203
204 if (ArgPick(&arg, args, MPS_KEY_ARENA_SIZE)) {
205 size = arg.val.size;
206 if (ArgPick(&arg, args, MPS_KEY_ARENA_CL_ADDR))
207 base = arg.val.addr;
208 else {
209 res = ResPARAM;
210 goto failParam;
211 }
212 } else if (ArgPick(&arg, args, MPS_KEY_VARARGS)) {
213 if (ArgPick(&arg, args, MPS_KEY_ARENA_CL_ADDR)) {
214 res = ResPARAM;
215 goto failParam;
216 }
217 size = va_arg(arg.val.varargs, Size);
218 base = va_arg(arg.val.varargs, Addr);
219 } else {
220 res = ResPARAM;
221 goto failParam;
222 }
223
204 AVER(base != (Addr)0); 224 AVER(base != (Addr)0);
205 225
206 clArenaSize = SizeAlignUp(sizeof(ClientArenaStruct), MPS_PF_ALIGN); 226 clArenaSize = SizeAlignUp(sizeof(ClientArenaStruct), MPS_PF_ALIGN);
@@ -243,6 +263,7 @@ static Res ClientArenaInit(Arena *arenaReturn, ArenaClass class,
243 263
244failChunkCreate: 264failChunkCreate:
245 ArenaFinish(arena); 265 ArenaFinish(arena);
266failParam:
246 return res; 267 return res;
247} 268}
248 269
diff --git a/mps/code/arenacv.c b/mps/code/arenacv.c
index 5055cf421a6..7228ea80ee7 100644
--- a/mps/code/arenacv.c
+++ b/mps/code/arenacv.c
@@ -340,7 +340,7 @@ static void testPageTable(ArenaClass class, ...)
340 va_list args; 340 va_list args;
341 341
342 va_start(args, class); 342 va_start(args, class);
343 die(ArenaCreateV(&arena, class, args), "ArenaCreate"); 343 die(ArenaCreate(&arena, class, args), "ArenaCreate");
344 va_end(args); 344 va_end(args);
345 345
346 die(PoolCreate(&pool, arena, PoolClassMV(), 346 die(PoolCreate(&pool, arena, PoolClassMV(),
diff --git a/mps/code/arenavm.c b/mps/code/arenavm.c
index ca2188c04b1..b0c2d732dc1 100644
--- a/mps/code/arenavm.c
+++ b/mps/code/arenavm.c
@@ -445,7 +445,7 @@ static void VMChunkFinish(Chunk chunk)
445 * .arena.init: Once the arena has been allocated, we call ArenaInit 445 * .arena.init: Once the arena has been allocated, we call ArenaInit
446 * to do the generic part of init. 446 * to do the generic part of init.
447 */ 447 */
448static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, va_list args) 448static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args)
449{ 449{
450 Size userSize; /* size requested by user */ 450 Size userSize; /* size requested by user */
451 Size chunkSize; /* size actually created */ 451 Size chunkSize; /* size actually created */
@@ -456,15 +456,26 @@ static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, va_list args)
456 Index gen; 456 Index gen;
457 VM arenaVM; 457 VM arenaVM;
458 Chunk chunk; 458 Chunk chunk;
459 459 mps_arg_s arg;
460 userSize = va_arg(args, Size); 460
461 AVER(arenaReturn != NULL); 461 AVER(arenaReturn != NULL);
462 AVER(class == VMArenaClassGet() || class == VMNZArenaClassGet()); 462 AVER(class == VMArenaClassGet() || class == VMNZArenaClassGet());
463 AVER(ArgListCheck(args));
464
465 if (ArgPick(&arg, args, MPS_KEY_ARENA_SIZE))
466 userSize = arg.val.size;
467 else if (ArgPick(&arg, args, MPS_KEY_VARARGS))
468 userSize = va_arg(arg.val.varargs, Size);
469 else {
470 res = ResPARAM;
471 goto failVMCreate;
472 }
473
463 AVER(userSize > 0); 474 AVER(userSize > 0);
464 475
465 /* Create a VM to hold the arena and map it. */ 476 /* Create a VM to hold the arena and map it. */
466 vmArenaSize = SizeAlignUp(sizeof(VMArenaStruct), MPS_PF_ALIGN); 477 vmArenaSize = SizeAlignUp(sizeof(VMArenaStruct), MPS_PF_ALIGN);
467 res = VMCreate(&arenaVM, vmArenaSize); 478 res = VMCreate(&arenaVM, vmArenaSize, args);
468 if (res != ResOK) 479 if (res != ResOK)
469 goto failVMCreate; 480 goto failVMCreate;
470 res = VMMap(arenaVM, VMBase(arenaVM), VMLimit(arenaVM)); 481 res = VMMap(arenaVM, VMBase(arenaVM), VMLimit(arenaVM));
diff --git a/mps/code/arg.c b/mps/code/arg.c
new file mode 100644
index 00000000000..425bbf6c496
--- /dev/null
+++ b/mps/code/arg.c
@@ -0,0 +1,126 @@
1/* arg.c: ARGUMENT LISTS
2 *
3 * $Id: //info.ravenbrook.com/project/mps/custom/cet/main/code/bt.c#1 $
4 * Copyright (c) 2013 Ravenbrook Limited. See end of file for license.
5 */
6
7#include "config.h"
8#include "check.h"
9#include "mpm.h"
10
11SRCID(arg, "$Id$");
12
13#define KeySig ((Sig)0x519CE333) /* SIGnature KEYyy */
14typedef struct mps_key_s {
15 Sig sig;
16 const char *name;
17 Bool (*check)(Arg arg);
18} KeyStruct;
19
20
21static Bool ArgCheckCant(Arg arg) {
22 UNUSED(arg);
23 return TRUE;
24}
25
26const KeyStruct _mps_key_varargs = {KeySig, "VARARGS", ArgCheckCant};
27
28
29/* KeyCheck -- check the validity of an argument key */
30
31Bool KeyCheck(Key key)
32{
33 CHECKS(Key, key);
34 CHECKL(key->name != NULL);
35 CHECKL(FUNCHECK(key->check));
36 return TRUE;
37}
38
39
40Bool ArgCheck(Arg arg)
41{
42 CHECKL(arg != NULL);
43 CHECKD(Key, arg->key);
44 CHECKL(arg->key->check(arg));
45 return TRUE;
46}
47
48
49/* ArgCheck -- check the validity of an argument list */
50
51Bool ArgListCheck(ArgList args)
52{
53 Index i;
54 CHECKL(args != NULL);
55 /* FIXME: Maximum plausible length? */
56 for (i = 0; args[i].key != MPS_KEY_ARGS_END; ++i)
57 CHECKL(ArgCheck(&args[i]));
58 return TRUE;
59}
60
61
62Bool ArgPick(mps_arg_s *argOut, mps_arg_s args[], Key key) {
63 Index i;
64
65 AVER(argOut != NULL);
66 AVERT(Arg, args);
67 AVERT(Key, key);
68
69 for (i = 0; args[i].key != MPS_KEY_ARGS_END; ++i)
70 if (args[i].key == key)
71 goto found;
72 return FALSE;
73
74found:
75 *argOut = args[i];
76 for(;;) {
77 args[i] = args[i + 1];
78 if (args[i].key == MPS_KEY_ARGS_END)
79 break;
80 ++i;
81 }
82
83 return TRUE;
84}
85
86
87/* C. COPYRIGHT AND LICENSE
88 *
89 * Copyright (C) 2001-2002 Ravenbrook Limited <http://www.ravenbrook.com/>.
90 * All rights reserved. This is an open source license. Contact
91 * Ravenbrook for commercial licensing options.
92 *
93 * Redistribution and use in source and binary forms, with or without
94 * modification, are permitted provided that the following conditions are
95 * met:
96 *
97 * 1. Redistributions of source code must retain the above copyright
98 * notice, this list of conditions and the following disclaimer.
99 *
100 * 2. Redistributions in binary form must reproduce the above copyright
101 * notice, this list of conditions and the following disclaimer in the
102 * documentation and/or other materials provided with the distribution.
103 *
104 * 3. Redistributions in any form must be accompanied by information on how
105 * to obtain complete source code for this software and any accompanying
106 * software that uses this software. The source code must either be
107 * included in the distribution or be available for no more than the cost
108 * of distribution plus a nominal fee, and must be freely redistributable
109 * under reasonable conditions. For an executable file, complete source
110 * code means the source code for all modules it contains. It does not
111 * include source code for modules or files that typically accompany the
112 * major components of the operating system on which the executable file
113 * runs.
114 *
115 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
116 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
117 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
118 * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE
119 * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
120 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
121 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
122 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
123 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
124 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
125 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
126 */
diff --git a/mps/code/mpm.h b/mps/code/mpm.h
index 049cbf65343..98e35b54189 100644
--- a/mps/code/mpm.h
+++ b/mps/code/mpm.h
@@ -130,6 +130,14 @@ extern int (AddrComp)(Addr a, Addr b, Size size);
130extern Bool ResIsAllocFailure(Res res); 130extern Bool ResIsAllocFailure(Res res);
131 131
132 132
133/* Argument Lists */
134
135extern Bool KeyCheck(Key key);
136extern Bool ArgCheck(Arg arg);
137extern Bool ArgListCheck(ArgList args);
138extern Bool ArgPick(ArgStruct *argOut, ArgList args, Key key);
139
140
133/* Logs and Powers 141/* Logs and Powers
134 * 142 *
135 * SizeIsP2 returns TRUE if and only if size is a non-negative integer 143 * SizeIsP2 returns TRUE if and only if size is a non-negative integer
@@ -485,7 +493,7 @@ extern AbstractArenaClass AbstractArenaClassGet(void);
485extern Bool ArenaClassCheck(ArenaClass class); 493extern Bool ArenaClassCheck(ArenaClass class);
486 494
487extern Bool ArenaCheck(Arena arena); 495extern Bool ArenaCheck(Arena arena);
488extern Res ArenaCreateV(Arena *arenaReturn, ArenaClass class, va_list args); 496extern Res ArenaCreate(Arena *arenaReturn, ArenaClass class, mps_arg_s args[]);
489extern void ArenaDestroy(Arena arena); 497extern void ArenaDestroy(Arena arena);
490extern Res ArenaInit(Arena arena, ArenaClass class); 498extern Res ArenaInit(Arena arena, ArenaClass class);
491extern void ArenaFinish(Arena arena); 499extern void ArenaFinish(Arena arena);
@@ -966,7 +974,7 @@ extern Res RootsIterate(Globals arena, RootIterateFn f, void *p);
966 974
967extern Align VMAlign(VM vm); 975extern Align VMAlign(VM vm);
968extern Bool VMCheck(VM vm); 976extern Bool VMCheck(VM vm);
969extern Res VMCreate(VM *VMReturn, Size size); 977extern Res VMCreate(VM *VMReturn, Size size, mps_arg_s args[]);
970extern void VMDestroy(VM vm); 978extern void VMDestroy(VM vm);
971extern Addr VMBase(VM vm); 979extern Addr VMBase(VM vm);
972extern Addr VMLimit(VM vm); 980extern Addr VMLimit(VM vm);
diff --git a/mps/code/mpmtypes.h b/mps/code/mpmtypes.h
index f7cf9a023ea..8df2e91dbb0 100644
--- a/mps/code/mpmtypes.h
+++ b/mps/code/mpmtypes.h
@@ -44,6 +44,11 @@ typedef void *Pointer; /* <design/type/#pointer> */
44typedef Word Clock; /* processor time */ 44typedef Word Clock; /* processor time */
45typedef MPS_T_ULONGEST ULongest; /* <design/type/#ulongest> */ 45typedef MPS_T_ULONGEST ULongest; /* <design/type/#ulongest> */
46 46
47typedef mps_arg_s ArgStruct;
48typedef mps_arg_s *Arg;
49typedef mps_arg_s *ArgList;
50typedef mps_key_t Key;
51
47typedef Word RefSet; /* design.mps.refset */ 52typedef Word RefSet; /* design.mps.refset */
48typedef Word ZoneSet; /* design.mps.refset */ 53typedef Word ZoneSet; /* design.mps.refset */
49typedef unsigned Rank; 54typedef unsigned Rank;
@@ -109,7 +114,7 @@ typedef struct StackContextStruct *StackContext;
109/* Arena*Method -- see <code/mpmst.h#ArenaClassStruct> */ 114/* Arena*Method -- see <code/mpmst.h#ArenaClassStruct> */
110 115
111typedef Res (*ArenaInitMethod)(Arena *arenaReturn, 116typedef Res (*ArenaInitMethod)(Arena *arenaReturn,
112 ArenaClass class, va_list args); 117 ArenaClass class, mps_arg_s args[]);
113typedef void (*ArenaFinishMethod)(Arena arena); 118typedef void (*ArenaFinishMethod)(Arena arena);
114typedef Size (*ArenaReservedMethod)(Arena arena); 119typedef Size (*ArenaReservedMethod)(Arena arena);
115typedef void (*ArenaSpareCommitExceededMethod)(Arena arena); 120typedef void (*ArenaSpareCommitExceededMethod)(Arena arena);
diff --git a/mps/code/mps.c b/mps/code/mps.c
index 1d1d93100d0..99cf42d5a33 100644
--- a/mps/code/mps.c
+++ b/mps/code/mps.c
@@ -70,6 +70,7 @@
70#include "ss.c" 70#include "ss.c"
71#include "version.c" 71#include "version.c"
72#include "table.c" 72#include "table.c"
73#include "arg.c"
73 74
74/* Additional pool classes */ 75/* Additional pool classes */
75 76
diff --git a/mps/code/mps.h b/mps/code/mps.h
index 0c2cc9dbd53..0b450da9f5b 100644
--- a/mps/code/mps.h
+++ b/mps/code/mps.h
@@ -62,6 +62,7 @@ typedef struct mps_alloc_pattern_s
62 *mps_alloc_pattern_t; /* allocation patterns */ 62 *mps_alloc_pattern_t; /* allocation patterns */
63typedef struct mps_frame_s 63typedef struct mps_frame_s
64 *mps_frame_t; /* allocation frames */ 64 *mps_frame_t; /* allocation frames */
65typedef const struct mps_key_s *mps_key_t; /* argument key */
65 66
66/* Concrete Types */ 67/* Concrete Types */
67 68
@@ -91,6 +92,36 @@ enum {
91 MPS_RES_PARAM /* illegal user parameter value */ 92 MPS_RES_PARAM /* illegal user parameter value */
92}; 93};
93 94
95/* Keyword argument lists */
96
97typedef struct mps_arg_s {
98 mps_key_t key;
99 union {
100 mps_bool_t b;
101 char c;
102 const char *string;
103 int i;
104 unsigned u;
105 long l;
106 unsigned long ul;
107 size_t size;
108 va_list varargs;
109 mps_addr_t addr;
110 } val;
111} mps_arg_s;
112
113#define MPS_KEY_ARGS_END NULL
114
115/* FIXME: This shouldn't be here */
116extern const struct mps_key_s _mps_key_vmw3_top_down;
117#define MPS_KEY_VMW3_TOP_DOWN (&_mps_key_vmw3_top_down)
118
119extern const struct mps_key_s _mps_key_varargs;
120#define MPS_KEY_VARARGS (&_mps_key_varargs)
121extern const struct mps_key_s _mps_key_arena_size;
122#define MPS_KEY_ARENA_SIZE (&_mps_key_arena_size)
123
124
94/* <a id="message.types"> Keep in sync with 125/* <a id="message.types"> Keep in sync with
95 * <code/mpmtypes.h#message.types> */ 126 * <code/mpmtypes.h#message.types> */
96/* Not meant to be used by clients, they should use the macros below. */ 127/* Not meant to be used by clients, they should use the macros below. */
@@ -272,6 +303,8 @@ extern mps_bool_t mps_arena_step(mps_arena_t, double, double);
272 303
273extern mps_res_t mps_arena_create(mps_arena_t *, mps_arena_class_t, ...); 304extern mps_res_t mps_arena_create(mps_arena_t *, mps_arena_class_t, ...);
274extern mps_res_t mps_arena_create_v(mps_arena_t *, mps_arena_class_t, va_list); 305extern mps_res_t mps_arena_create_v(mps_arena_t *, mps_arena_class_t, va_list);
306extern mps_res_t mps_arena_create_args(mps_arena_t *, mps_arena_class_t,
307 mps_arg_s []);
275extern void mps_arena_destroy(mps_arena_t); 308extern void mps_arena_destroy(mps_arena_t);
276 309
277extern size_t mps_arena_reserved(mps_arena_t); 310extern size_t mps_arena_reserved(mps_arena_t);
diff --git a/mps/code/mps.xcodeproj/project.pbxproj b/mps/code/mps.xcodeproj/project.pbxproj
index 375124a990f..134e873becc 100644
--- a/mps/code/mps.xcodeproj/project.pbxproj
+++ b/mps/code/mps.xcodeproj/project.pbxproj
@@ -182,6 +182,7 @@
182 3124CAFB156BE82000753214 /* testlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 31EEAC9E156AB73400714D05 /* testlib.c */; }; 182 3124CAFB156BE82000753214 /* testlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 31EEAC9E156AB73400714D05 /* testlib.c */; };
183 3124CAFC156BE82900753214 /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; }; 183 3124CAFC156BE82900753214 /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; };
184 3150AE53156ABA2500A6E22A /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; }; 184 3150AE53156ABA2500A6E22A /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; };
185 317B3C2B1731830100F9A469 /* arg.c in Sources */ = {isa = PBXBuildFile; fileRef = 317B3C2A1731830100F9A469 /* arg.c */; };
185 31A47BA4156C1E130039B1C2 /* mps.c in Sources */ = {isa = PBXBuildFile; fileRef = 31A47BA3156C1E130039B1C2 /* mps.c */; }; 186 31A47BA4156C1E130039B1C2 /* mps.c in Sources */ = {isa = PBXBuildFile; fileRef = 31A47BA3156C1E130039B1C2 /* mps.c */; };
186 31D60007156D3C6200337B26 /* segsmss.c in Sources */ = {isa = PBXBuildFile; fileRef = 31D60006156D3C5F00337B26 /* segsmss.c */; }; 187 31D60007156D3C6200337B26 /* segsmss.c in Sources */ = {isa = PBXBuildFile; fileRef = 31D60006156D3C5F00337B26 /* segsmss.c */; };
187 31D60008156D3C7400337B26 /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; }; 188 31D60008156D3C7400337B26 /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; };
@@ -1049,6 +1050,7 @@
1049 3124CAE4156BE6D500753214 /* fmthe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fmthe.c; sourceTree = "<group>"; }; 1050 3124CAE4156BE6D500753214 /* fmthe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fmthe.c; sourceTree = "<group>"; };
1050 3124CAEB156BE7F300753214 /* amcss */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = amcss; sourceTree = BUILT_PRODUCTS_DIR; }; 1051 3124CAEB156BE7F300753214 /* amcss */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = amcss; sourceTree = BUILT_PRODUCTS_DIR; };
1051 3124CAF5156BE81100753214 /* amcss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = amcss.c; sourceTree = "<group>"; }; 1052 3124CAF5156BE81100753214 /* amcss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = amcss.c; sourceTree = "<group>"; };
1053 317B3C2A1731830100F9A469 /* arg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arg.c; sourceTree = "<group>"; };
1052 31A47BA3156C1E130039B1C2 /* mps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mps.c; sourceTree = "<group>"; }; 1054 31A47BA3156C1E130039B1C2 /* mps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mps.c; sourceTree = "<group>"; };
1053 31A47BA5156C1E5E0039B1C2 /* ssixi3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ssixi3.c; sourceTree = "<group>"; }; 1055 31A47BA5156C1E5E0039B1C2 /* ssixi3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ssixi3.c; sourceTree = "<group>"; };
1054 31D60006156D3C5F00337B26 /* segsmss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = segsmss.c; sourceTree = "<group>"; }; 1056 31D60006156D3C5F00337B26 /* segsmss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = segsmss.c; sourceTree = "<group>"; };
@@ -1568,6 +1570,7 @@
1568 31EEAC05156AB27B00714D05 /* arena.c */, 1570 31EEAC05156AB27B00714D05 /* arena.c */,
1569 31EEAC06156AB27B00714D05 /* arenacl.c */, 1571 31EEAC06156AB27B00714D05 /* arenacl.c */,
1570 31EEAC03156AB23A00714D05 /* arenavm.c */, 1572 31EEAC03156AB23A00714D05 /* arenavm.c */,
1573 317B3C2A1731830100F9A469 /* arg.c */,
1571 31EEAC3F156AB32500714D05 /* boot.c */, 1574 31EEAC3F156AB32500714D05 /* boot.c */,
1572 31EEAC27156AB2F200714D05 /* bt.c */, 1575 31EEAC27156AB2F200714D05 /* bt.c */,
1573 31EEAC19156AB2B200714D05 /* buffer.c */, 1576 31EEAC19156AB2B200714D05 /* buffer.c */,
@@ -2690,6 +2693,7 @@
2690 buildActionMask = 2147483647; 2693 buildActionMask = 2147483647;
2691 files = ( 2694 files = (
2692 31A47BA4156C1E130039B1C2 /* mps.c in Sources */, 2695 31A47BA4156C1E130039B1C2 /* mps.c in Sources */,
2696 317B3C2B1731830100F9A469 /* arg.c in Sources */,
2693 ); 2697 );
2694 runOnlyForDeploymentPostprocessing = 0; 2698 runOnlyForDeploymentPostprocessing = 0;
2695 }; 2699 };
diff --git a/mps/code/mpsacl.h b/mps/code/mpsacl.h
index 62a8952ba83..ec7a21c027a 100644
--- a/mps/code/mpsacl.h
+++ b/mps/code/mpsacl.h
@@ -9,6 +9,9 @@
9 9
10#include "mps.h" 10#include "mps.h"
11 11
12/* Client arena base address argument */
13extern const struct mps_key_s _mps_key_arena_cl_addr;
14#define MPS_KEY_ARENA_CL_ADDR (&_mps_key_arena_cl_addr)
12 15
13extern mps_arena_class_t mps_arena_class_cl(void); 16extern mps_arena_class_t mps_arena_class_cl(void);
14 17
diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c
index 435b4fbc0c6..15f44a24ff1 100644
--- a/mps/code/mpsi.c
+++ b/mps/code/mpsi.c
@@ -52,6 +52,10 @@
52#include "sac.h" 52#include "sac.h"
53#include "chain.h" 53#include "chain.h"
54 54
55#include <stdarg.h>
56#include <string.h>
57
58
55SRCID(mpsi, "$Id$"); 59SRCID(mpsi, "$Id$");
56 60
57 61
@@ -311,11 +315,14 @@ mps_res_t mps_arena_create(mps_arena_t *mps_arena_o,
311 mps_arena_class_t mps_arena_class, ...) 315 mps_arena_class_t mps_arena_class, ...)
312{ 316{
313 mps_res_t res; 317 mps_res_t res;
314 va_list args; 318 mps_arg_s args[2];
319
320 args[0].key = MPS_KEY_VARARGS;
321 va_start(args[0].val.varargs, mps_arena_class);
322 args[1].key = MPS_KEY_ARGS_END;
323 res = mps_arena_create_args(mps_arena_o, mps_arena_class, args);
324 va_end(args[0].val.varargs);
315 325
316 va_start(args, mps_arena_class);
317 res = mps_arena_create_v(mps_arena_o, mps_arena_class, args);
318 va_end(args);
319 return res; 326 return res;
320} 327}
321 328
@@ -323,7 +330,25 @@ mps_res_t mps_arena_create(mps_arena_t *mps_arena_o,
323/* mps_arena_create_v -- create an arena object */ 330/* mps_arena_create_v -- create an arena object */
324 331
325mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o, 332mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o,
326 mps_arena_class_t arena_class, va_list args) 333 mps_arena_class_t arena_class,
334 va_list varargs)
335{
336 mps_arg_s args[2];
337
338 args[0].key = MPS_KEY_VARARGS;
339 /* FIXME: va_copy not available in C89 */
340 memcpy(&args[0].val.varargs, &varargs, sizeof(va_list));
341 args[1].key = MPS_KEY_ARGS_END;
342
343 return mps_arena_create_args(mps_arena_o, arena_class, args);
344}
345
346
347/* mps_arena_create_arg -- create an arena object */
348
349mps_res_t mps_arena_create_args(mps_arena_t *mps_arena_o,
350 mps_arena_class_t arena_class,
351 mps_arg_s mps_args[])
327{ 352{
328 Arena arena; 353 Arena arena;
329 Res res; 354 Res res;
@@ -334,15 +359,21 @@ mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o,
334 359
335 AVER(mps_arena_o != NULL); 360 AVER(mps_arena_o != NULL);
336 361
337 res = ArenaCreateV(&arena, arena_class, args); 362 res = ArenaCreate(&arena, arena_class, mps_args);
338 if (res != ResOK) 363 if (res != ResOK)
339 return res; 364 return res;
340 365
366 /* FIXME: Consider doing this
367 if (args[0].key != MPS_KEY_ARGS_END)
368 return MPS_RES_PARAM;
369 */
370
341 ArenaLeave(arena); 371 ArenaLeave(arena);
342 *mps_arena_o = (mps_arena_t)arena; 372 *mps_arena_o = (mps_arena_t)arena;
343 return MPS_RES_OK; 373 return MPS_RES_OK;
344} 374}
345 375
376
346/* mps_arena_destroy -- destroy an arena object */ 377/* mps_arena_destroy -- destroy an arena object */
347 378
348void mps_arena_destroy(mps_arena_t arena) 379void mps_arena_destroy(mps_arena_t arena)
diff --git a/mps/code/vmix.c b/mps/code/vmix.c
index bc26b647dc8..f5b8aa681b3 100644
--- a/mps/code/vmix.c
+++ b/mps/code/vmix.c
@@ -98,9 +98,12 @@ Bool VMCheck(VM vm)
98} 98}
99 99
100 100
101Res VM
102
103
101/* VMCreate -- reserve some virtual address space, and create a VM structure */ 104/* VMCreate -- reserve some virtual address space, and create a VM structure */
102 105
103Res VMCreate(VM *vmReturn, Size size) 106Res VMCreate(VM *vmReturn, Size size, mps_arg_s args[])
104{ 107{
105 Align align; 108 Align align;
106 VM vm; 109 VM vm;
@@ -109,6 +112,8 @@ Res VMCreate(VM *vmReturn, Size size)
109 Res res; 112 Res res;
110 113
111 AVER(vmReturn != NULL); 114 AVER(vmReturn != NULL);
115 AVERT(Arg, args);
116 UNUSED(args);
112 117
113 /* Find out the page size from the OS */ 118 /* Find out the page size from the OS */
114 pagesize = getpagesize(); 119 pagesize = getpagesize();