aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorRichard Brooksby2013-05-09 14:04:23 +0100
committerRichard Brooksby2013-05-09 14:04:23 +0100
commit80e84d09a5e995eaa37719c7c100cbdf3cc296c0 (patch)
treef7701acd5593aea327bd064a74eaeeb4785b0a8d /mps/code
parentdfd71567402ff5dc6f85bbe1dc080ff55cb4dcc8 (diff)
downloademacs-80e84d09a5e995eaa37719c7c100cbdf3cc296c0.tar.gz
emacs-80e84d09a5e995eaa37719c7c100cbdf3cc296c0.zip
Adding macros to make keyword argument list formation more convenient and robust.
Copied from Perforce Change: 181666 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/arenacv.c23
-rw-r--r--mps/code/arg.h2
-rw-r--r--mps/code/cbs.c13
-rw-r--r--mps/code/dbgpool.c13
-rw-r--r--mps/code/mps.h43
-rw-r--r--mps/code/poolamc.c17
-rw-r--r--mps/code/poolmv.c25
-rw-r--r--mps/code/poolncv.c10
-rw-r--r--mps/code/segsmss.c12
9 files changed, 86 insertions, 72 deletions
diff --git a/mps/code/arenacv.c b/mps/code/arenacv.c
index 18b5ba3418f..cfd124ec7d1 100644
--- a/mps/code/arenacv.c
+++ b/mps/code/arenacv.c
@@ -337,14 +337,13 @@ static void testPageTable(ArenaClass class, Size size, Addr addr)
337 Arena arena; Pool pool; 337 Arena arena; Pool pool;
338 Size pageSize; 338 Size pageSize;
339 Count tractsPerPage; 339 Count tractsPerPage;
340 ArgStruct args[4];
341 340
342 args[0].key = MPS_KEY_ARENA_SIZE; 341 MPS_ARGS_BEGIN(args) {
343 args[0].val.size = size; 342 MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, size, size);
344 args[1].key = MPS_KEY_ARENA_CL_ADDR; 343 MPS_ARGS_ADD(args, MPS_KEY_ARENA_CL_ADDR, addr, addr);
345 args[1].val.addr = addr; 344 MPS_ARGS_DONE(args);
346 args[2].key = MPS_KEY_ARGS_END; 345 die(ArenaCreate(&arena, class, args), "ArenaCreate");
347 die(ArenaCreate(&arena, class, args), "ArenaCreate"); 346 } MPS_ARGS_END(args);
348 347
349 die(PoolCreate(&pool, arena, PoolClassMV(), argsNone), "PoolCreate"); 348 die(PoolCreate(&pool, arena, PoolClassMV(), argsNone), "PoolCreate");
350 349
@@ -378,11 +377,11 @@ static void testSize(Size size)
378 Res res; 377 Res res;
379 378
380 do { 379 do {
381 ArgStruct args[2]; 380 MPS_ARGS_BEGIN(args) {
382 args[0].key = MPS_KEY_ARENA_SIZE; 381 MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, size, size);
383 args[0].val.size = size; 382 MPS_ARGS_DONE(args);
384 args[1].key = MPS_KEY_ARGS_END; 383 res = ArenaCreate(&arena, class, args);
385 res = ArenaCreate(&arena, class, args); 384 } MPS_ARGS_END(args);
386 if (res == ResOK) 385 if (res == ResOK)
387 ArenaDestroy(arena); 386 ArenaDestroy(arena);
388 else 387 else
diff --git a/mps/code/arg.h b/mps/code/arg.h
index f50107b593f..2647937c201 100644
--- a/mps/code/arg.h
+++ b/mps/code/arg.h
@@ -37,6 +37,7 @@ extern Bool ArgCheck(Arg arg);
37extern Bool ArgListCheck(ArgList args); 37extern Bool ArgListCheck(ArgList args);
38 38
39extern Bool ArgPick(ArgStruct *argOut, ArgList args, Key key); 39extern Bool ArgPick(ArgStruct *argOut, ArgList args, Key key);
40extern void ArgRequired(ArgStruct *argOut, ArgList args, Key key);
40 41
41extern Bool ArgCheckCant(Arg arg); 42extern Bool ArgCheckCant(Arg arg);
42extern Bool ArgCheckFormat(Arg arg); 43extern Bool ArgCheckFormat(Arg arg);
@@ -49,6 +50,7 @@ extern Bool ArgCheckAlign(Arg arg);
49extern Bool ArgCheckBool(Arg arg); 50extern Bool ArgCheckBool(Arg arg);
50extern Bool ArgCheckCount(Arg arg); 51extern Bool ArgCheckCount(Arg arg);
51 52
53
52#endif /* arg_h */ 54#endif /* arg_h */
53 55
54 56
diff --git a/mps/code/cbs.c b/mps/code/cbs.c
index 23a66699333..14e13b51b01 100644
--- a/mps/code/cbs.c
+++ b/mps/code/cbs.c
@@ -273,7 +273,6 @@ Res CBSInit(Arena arena, CBS cbs, void *owner,
273 Bool mayUseInline, Bool fastFind) 273 Bool mayUseInline, Bool fastFind)
274{ 274{
275 Res res; 275 Res res;
276 ArgStruct args[3];
277 276
278 AVERT(Arena, arena); 277 AVERT(Arena, arena);
279 AVER(new == NULL || FUNCHECK(new)); 278 AVER(new == NULL || FUNCHECK(new));
@@ -287,12 +286,12 @@ Res CBSInit(Arena arena, CBS cbs, void *owner,
287 286
288 SplayTreeInit(splayTreeOfCBS(cbs), &cbsSplayCompare, 287 SplayTreeInit(splayTreeOfCBS(cbs), &cbsSplayCompare,
289 fastFind ? &cbsUpdateNode : NULL); 288 fastFind ? &cbsUpdateNode : NULL);
290 args[0].key = MPS_KEY_MFS_UNIT_SIZE; 289 MPS_ARGS_BEGIN(args) {
291 args[0].val.size = sizeof(CBSBlockStruct); 290 MPS_ARGS_ADD(args, MPS_KEY_MFS_UNIT_SIZE, size, sizeof(CBSBlockStruct));
292 args[1].key = MPS_KEY_EXTEND_BY; 291 MPS_ARGS_ADD(args, MPS_KEY_EXTEND_BY, size, sizeof(CBSBlockStruct) * 64);
293 args[1].val.size = sizeof(CBSBlockStruct) * 64; 292 MPS_ARGS_DONE(args);
294 args[2].key = MPS_KEY_ARGS_END; 293 res = PoolCreate(&(cbs->blockPool), arena, PoolClassMFS(), args);
295 res = PoolCreate(&(cbs->blockPool), arena, PoolClassMFS(), args); 294 } MPS_ARGS_END(args);
296 if (res != ResOK) 295 if (res != ResOK)
297 return res; 296 return res;
298 cbs->splayTreeSize = 0; 297 cbs->splayTreeSize = 0;
diff --git a/mps/code/dbgpool.c b/mps/code/dbgpool.c
index 591a7ce39de..8d416815471 100644
--- a/mps/code/dbgpool.c
+++ b/mps/code/dbgpool.c
@@ -185,16 +185,15 @@ static Res DebugPoolInit(Pool pool, ArgList args)
185 /* tag init */ 185 /* tag init */
186 debug->tagInit = tagInit; 186 debug->tagInit = tagInit;
187 if (debug->tagInit != NULL) { 187 if (debug->tagInit != NULL) {
188 ArgStruct pcArgs[3];
189 debug->tagSize = tagSize + sizeof(tagStruct) - 1; 188 debug->tagSize = tagSize + sizeof(tagStruct) - 1;
190 /* This pool has to be like the arena control pool: the blocks */ 189 /* This pool has to be like the arena control pool: the blocks */
191 /* allocated must be accessible using void*. */ 190 /* allocated must be accessible using void*. */
192 pcArgs[0].key = MPS_KEY_EXTEND_BY; 191 MPS_ARGS_BEGIN(pcArgs) {
193 pcArgs[0].val.size = debug->tagSize; /* FIXME: Really? */ 192 MPS_ARGS_ADD(pcArgs, MPS_KEY_EXTEND_BY, size, debug->tagSize); /* FIXME: Check this */
194 pcArgs[1].key = MPS_KEY_MFS_UNIT_SIZE; 193 MPS_ARGS_ADD(pcArgs, MPS_KEY_MFS_UNIT_SIZE, size, debug->tagSize);
195 pcArgs[1].val.size = debug->tagSize; 194 MPS_ARGS_DONE(pcArgs);
196 pcArgs[2].key = MPS_KEY_ARGS_END; 195 res = PoolCreate(&debug->tagPool, PoolArena(pool), PoolClassMFS(), pcArgs);
197 res = PoolCreate(&debug->tagPool, PoolArena(pool), PoolClassMFS(), pcArgs); 196 } MPS_ARGS_END(pcArgs);
198 if (res != ResOK) 197 if (res != ResOK)
199 goto tagFail; 198 goto tagFail;
200 debug->missingTags = 0; 199 debug->missingTags = 0;
diff --git a/mps/code/mps.h b/mps/code/mps.h
index 5f320e63c51..1a82d5c149b 100644
--- a/mps/code/mps.h
+++ b/mps/code/mps.h
@@ -119,10 +119,6 @@ extern const struct mps_key_s _mps_key_args_end;
119#define MPS_KEY_ARGS_END (&_mps_key_args_end) 119#define MPS_KEY_ARGS_END (&_mps_key_args_end)
120extern mps_arg_s mps_args_none[]; 120extern mps_arg_s mps_args_none[];
121 121
122/* FIXME: This shouldn't be here */
123extern const struct mps_key_s _mps_key_vmw3_top_down;
124#define MPS_KEY_VMW3_TOP_DOWN (&_mps_key_vmw3_top_down)
125
126extern const struct mps_key_s _mps_key_arena_size; 122extern const struct mps_key_s _mps_key_arena_size;
127#define MPS_KEY_ARENA_SIZE (&_mps_key_arena_size) 123#define MPS_KEY_ARENA_SIZE (&_mps_key_arena_size)
128extern const struct mps_key_s _mps_key_format; 124extern const struct mps_key_s _mps_key_format;
@@ -131,15 +127,44 @@ extern const struct mps_key_s _mps_key_chain;
131#define MPS_KEY_CHAIN (&_mps_key_chain) 127#define MPS_KEY_CHAIN (&_mps_key_chain)
132 128
133extern const struct mps_key_s _mps_key_extend_by; 129extern const struct mps_key_s _mps_key_extend_by;
134#define MPS_KEY_EXTEND_BY (&_mps_key_extend_by) 130#define MPS_KEY_EXTEND_BY (&_mps_key_extend_by)
135extern const struct mps_key_s _mps_key_min_size; 131extern const struct mps_key_s _mps_key_min_size;
136#define MPS_KEY_MIN_SIZE (&_mps_key_min_size) 132#define MPS_KEY_MIN_SIZE (&_mps_key_min_size)
137extern const struct mps_key_s _mps_key_mean_size; 133extern const struct mps_key_s _mps_key_mean_size;
138#define MPS_KEY_MEAN_SIZE (&_mps_key_mean_size) 134#define MPS_KEY_MEAN_SIZE (&_mps_key_mean_size)
139extern const struct mps_key_s _mps_key_max_size; 135extern const struct mps_key_s _mps_key_max_size;
140#define MPS_KEY_MAX_SIZE (&_mps_key_max_size) 136#define MPS_KEY_MAX_SIZE (&_mps_key_max_size)
141extern const struct mps_key_s _mps_key_align; 137extern const struct mps_key_s _mps_key_align;
142#define MPS_KEY_ALIGN (&_mps_key_align) 138#define MPS_KEY_ALIGN (&_mps_key_align)
139
140/* FIXME: This will only be present on Windows. */
141extern const struct mps_key_s _mps_key_vmw3_top_down;
142#define MPS_KEY_VMW3_TOP_DOWN (&_mps_key_vmw3_top_down)
143
144#define MPS_ARGS_BEGIN(_var) \
145 BEGIN \
146 mps_arg_s _var[ARGS_MAX]; \
147 unsigned _var##_i = 0; \
148 BEGIN
149
150#define MPS_ARGS_ADD(_var, _key, _field, _val) \
151 BEGIN \
152 /* FIXME: AVER(_var_i < ARGS_MAX); */ \
153 _var[_var##_i].key = (_key); \
154 _var[_var##_i].val._field = (_val); \
155 ++_var##_i; \
156 END
157
158#define MPS_ARGS_DONE(_var) \
159 BEGIN \
160 /* FIXME: AVER(_var##_i < ARGS_MAX); */ \
161 _var[_var##_i].key = MPS_KEY_ARGS_END; \
162 /* FIXME: _var##_i = ARGS_MAX; */ \
163 END
164
165#define MPS_ARGS_END(_var) \
166 END; \
167 END
143 168
144 169
145/* <a id="message.types"> Keep in sync with 170/* <a id="message.types"> Keep in sync with
diff --git a/mps/code/poolamc.c b/mps/code/poolamc.c
index d15404aad26..8235b66c05f 100644
--- a/mps/code/poolamc.c
+++ b/mps/code/poolamc.c
@@ -973,18 +973,10 @@ static Res amcInitComm(Pool pool, RankSet rankSet, ArgList args)
973 amc = Pool2AMC(pool); 973 amc = Pool2AMC(pool);
974 arena = PoolArena(pool); 974 arena = PoolArena(pool);
975 975
976 if (ArgPick(&arg, args, MPS_KEY_FORMAT)) 976 ArgRequired(&arg, args, MPS_KEY_FORMAT);
977 pool->format = arg.val.format; 977 pool->format = arg.val.format;
978 else { 978 ArgRequired(&arg, args, MPS_KEY_CHAIN);
979 res = ResPARAM; 979 amc->chain = arg.val.chain;
980 goto failParam;
981 }
982 if (ArgPick(&arg, args, MPS_KEY_CHAIN))
983 amc->chain = arg.val.chain;
984 else {
985 res = ResPARAM;
986 goto failParam;
987 }
988 980
989 AVERT(Format, pool->format); 981 AVERT(Format, pool->format);
990 AVERT(Chain, amc->chain); 982 AVERT(Chain, amc->chain);
@@ -1060,7 +1052,6 @@ failGenAlloc:
1060 } 1052 }
1061 ControlFree(arena, amc->gen, genArraySize); 1053 ControlFree(arena, amc->gen, genArraySize);
1062failGensAlloc: 1054failGensAlloc:
1063failParam:
1064 return res; 1055 return res;
1065} 1056}
1066 1057
diff --git a/mps/code/poolmv.c b/mps/code/poolmv.c
index 50af068f4ed..e827e9d69b6 100644
--- a/mps/code/poolmv.c
+++ b/mps/code/poolmv.c
@@ -216,7 +216,6 @@ static Res MVInit(Pool pool, ArgList args)
216 Arena arena; 216 Arena arena;
217 Res res; 217 Res res;
218 ArgStruct arg; 218 ArgStruct arg;
219 ArgStruct piArgs[3];
220 219
221 if (ArgPick(&arg, args, MPS_KEY_EXTEND_BY)) 220 if (ArgPick(&arg, args, MPS_KEY_EXTEND_BY))
222 extendBy = arg.val.size; 221 extendBy = arg.val.size;
@@ -241,23 +240,23 @@ static Res MVInit(Pool pool, ArgList args)
241 blockExtendBy = sizeof(MVBlockStruct); 240 blockExtendBy = sizeof(MVBlockStruct);
242 } 241 }
243 242
244 piArgs[0].key = MPS_KEY_EXTEND_BY; 243 MPS_ARGS_BEGIN(piArgs) {
245 piArgs[0].val.size = blockExtendBy; 244 MPS_ARGS_ADD(piArgs, MPS_KEY_EXTEND_BY, size, blockExtendBy);
246 piArgs[1].key = MPS_KEY_MFS_UNIT_SIZE; 245 MPS_ARGS_ADD(piArgs, MPS_KEY_MFS_UNIT_SIZE, size, sizeof(MVBlockStruct));
247 piArgs[1].val.size = sizeof(MVBlockStruct); 246 MPS_ARGS_DONE(piArgs);
248 piArgs[2].key = MPS_KEY_ARGS_END; 247 res = PoolInit(&mv->blockPoolStruct.poolStruct, arena, PoolClassMFS(), piArgs);
249 res = PoolInit(&mv->blockPoolStruct.poolStruct, arena, PoolClassMFS(), piArgs); 248 } MPS_ARGS_END(piArgs);
250 if(res != ResOK) 249 if(res != ResOK)
251 return res; 250 return res;
252 251
253 spanExtendBy = sizeof(MVSpanStruct) * (maxSize/extendBy); 252 spanExtendBy = sizeof(MVSpanStruct) * (maxSize/extendBy);
254 253
255 piArgs[0].key = MPS_KEY_EXTEND_BY; 254 MPS_ARGS_BEGIN(piArgs) {
256 piArgs[0].val.size = spanExtendBy; 255 MPS_ARGS_ADD(piArgs, MPS_KEY_EXTEND_BY, size, spanExtendBy);
257 piArgs[1].key = MPS_KEY_MFS_UNIT_SIZE; 256 MPS_ARGS_ADD(piArgs, MPS_KEY_MFS_UNIT_SIZE, size, sizeof(MVSpanStruct));
258 piArgs[1].val.size = sizeof(MVSpanStruct); 257 MPS_ARGS_DONE(piArgs);
259 piArgs[2].key = MPS_KEY_ARGS_END; 258 res = PoolInit(&mv->spanPoolStruct.poolStruct, arena, PoolClassMFS(), piArgs);
260 res = PoolInit(&mv->spanPoolStruct.poolStruct, arena, PoolClassMFS(), piArgs); 259 } MPS_ARGS_END(piArgs);
261 if(res != ResOK) 260 if(res != ResOK)
262 return res; 261 return res;
263 262
diff --git a/mps/code/poolncv.c b/mps/code/poolncv.c
index f7598c5539a..c250e84d2cd 100644
--- a/mps/code/poolncv.c
+++ b/mps/code/poolncv.c
@@ -32,12 +32,12 @@ static void testit(ArenaClass class, ArgList args)
32 32
33int main(int argc, char *argv[]) 33int main(int argc, char *argv[])
34{ 34{
35 mps_arg_s args[2];
36 testlib_unused(argc); 35 testlib_unused(argc);
37 args[0].key = MPS_KEY_ARENA_SIZE; 36 MPS_ARGS_BEGIN(args) {
38 args[0].val.size = (Size)600000; 37 MPS_ARGS_ADD(args, MPS_KEY_ARENA_SIZE, size, 600000);
39 args[1].key = MPS_KEY_ARGS_END; 38 MPS_ARGS_DONE(args);
40 testit((ArenaClass)mps_arena_class_vm(), args); 39 testit((ArenaClass)mps_arena_class_vm(), args);
40 } MPS_ARGS_END(args);
41 printf("%s: Conclusion: Failed to find any defects.\n", argv[0]); 41 printf("%s: Conclusion: Failed to find any defects.\n", argv[0]);
42 return 0; 42 return 0;
43} 43}
diff --git a/mps/code/segsmss.c b/mps/code/segsmss.c
index 46b3e0288ee..9d69aff302a 100644
--- a/mps/code/segsmss.c
+++ b/mps/code/segsmss.c
@@ -766,18 +766,18 @@ static void *test(void *arg, size_t s)
766 mps_ap_t busy_ap; 766 mps_ap_t busy_ap;
767 mps_addr_t busy_init; 767 mps_addr_t busy_init;
768 char *indent = " "; 768 char *indent = " ";
769 mps_arg_s args[2];
770 769
771 arena = (mps_arena_t)arg; 770 arena = (mps_arena_t)arg;
772 (void)s; /* unused */ 771 (void)s; /* unused */
773 772
774 die(mps_fmt_create_A(&format, arena, dylan_fmt_A()), "fmt_create"); 773 die(mps_fmt_create_A(&format, arena, dylan_fmt_A()), "fmt_create");
775 774
776 args[0].key = MPS_KEY_FORMAT; 775 MPS_ARGS_BEGIN(args) {
777 args[0].val.format = format; 776 MPS_ARGS_ADD(args, MPS_KEY_FORMAT, format, format);
778 args[1].key = MPS_KEY_ARGS_END; 777 MPS_ARGS_DONE(args);
779 die(mps_pool_create_k(&pool, arena, mps_class_amst(), args), 778 die(mps_pool_create_k(&pool, arena, mps_class_amst(), args),
780 "pool_create(amst)"); 779 "pool_create(amst)");
780 } MPS_ARGS_END(args);
781 781
782 die(mps_ap_create(&ap, pool, mps_rank_exact()), "BufferCreate"); 782 die(mps_ap_create(&ap, pool, mps_rank_exact()), "BufferCreate");
783 die(mps_ap_create(&busy_ap, pool, mps_rank_exact()), "BufferCreate 2"); 783 die(mps_ap_create(&busy_ap, pool, mps_rank_exact()), "BufferCreate 2");