diff options
| author | Richard Brooksby | 2013-05-09 17:34:01 +0100 |
|---|---|---|
| committer | Richard Brooksby | 2013-05-09 17:34:01 +0100 |
| commit | af44d1241f83f6e0dd5a1309d68905cf128bd444 (patch) | |
| tree | 457b6d08f6fe8ccc3e557eeb11fee4688fdef256 /mps/code | |
| parent | f4416c7efc53e2092dbacd6a2e1d67c4ec3b0a68 (diff) | |
| download | emacs-af44d1241f83f6e0dd5a1309d68905cf128bd444.tar.gz emacs-af44d1241f83f6e0dd5a1309d68905cf128bd444.zip | |
Replacing varargs passed to seginit with keyword argument list.
Copied from Perforce
Change: 181679
ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
| -rw-r--r-- | mps/code/arenacv.c | 2 | ||||
| -rw-r--r-- | mps/code/arg.c | 13 | ||||
| -rw-r--r-- | mps/code/arg.h | 2 | ||||
| -rw-r--r-- | mps/code/config.h | 4 | ||||
| -rw-r--r-- | mps/code/mpm.h | 3 | ||||
| -rw-r--r-- | mps/code/mpmtypes.h | 2 | ||||
| -rw-r--r-- | mps/code/mps.h | 12 | ||||
| -rw-r--r-- | mps/code/mpsi.c | 4 | ||||
| -rw-r--r-- | mps/code/poolamc.c | 20 | ||||
| -rw-r--r-- | mps/code/poolams.c | 6 | ||||
| -rw-r--r-- | mps/code/poolawl.c | 18 | ||||
| -rw-r--r-- | mps/code/poollo.c | 6 | ||||
| -rw-r--r-- | mps/code/poolmrg.c | 41 | ||||
| -rw-r--r-- | mps/code/poolmv2.c | 3 | ||||
| -rw-r--r-- | mps/code/poolmvff.c | 4 | ||||
| -rw-r--r-- | mps/code/poolsnc.c | 4 | ||||
| -rw-r--r-- | mps/code/seg.c | 14 | ||||
| -rw-r--r-- | mps/code/segsmss.c | 2 |
18 files changed, 101 insertions, 59 deletions
diff --git a/mps/code/arenacv.c b/mps/code/arenacv.c index cfd124ec7d1..62f6e788d70 100644 --- a/mps/code/arenacv.c +++ b/mps/code/arenacv.c | |||
| @@ -180,7 +180,7 @@ static Res allocAsSeg(AllocInfoStruct *aiReturn, SegPref pref, | |||
| 180 | { | 180 | { |
| 181 | Res res; | 181 | Res res; |
| 182 | Seg seg; | 182 | Seg seg; |
| 183 | res = SegAlloc(&seg, SegClassGet(), pref, size, pool, FALSE); | 183 | res = SegAlloc(&seg, SegClassGet(), pref, size, pool, FALSE, argsNone); |
| 184 | if (res == ResOK) { | 184 | if (res == ResOK) { |
| 185 | aiReturn->the.segData.seg = seg; | 185 | aiReturn->the.segData.seg = seg; |
| 186 | } | 186 | } |
diff --git a/mps/code/arg.c b/mps/code/arg.c index 14170c3ed35..5cda234adb2 100644 --- a/mps/code/arg.c +++ b/mps/code/arg.c | |||
| @@ -76,6 +76,17 @@ Bool ArgCheckCount(Arg arg) { | |||
| 76 | return TRUE; | 76 | return TRUE; |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | Bool ArgCheckPointer(Arg arg) { | ||
| 80 | CHECKL(arg != NULL); | ||
| 81 | return TRUE; | ||
| 82 | } | ||
| 83 | |||
| 84 | Bool ArgCheckRankSet(Arg arg) { | ||
| 85 | CHECKL(COMPATTYPE(RankSet, unsigned)); | ||
| 86 | CHECKL(RankSetCheck(arg->val.u)); | ||
| 87 | return TRUE; | ||
| 88 | } | ||
| 89 | |||
| 79 | 90 | ||
| 80 | ARG_DEFINE_KEY(args_end, Shouldnt); | 91 | ARG_DEFINE_KEY(args_end, Shouldnt); |
| 81 | 92 | ||
| @@ -109,7 +120,7 @@ Bool ArgListCheck(ArgList args) | |||
| 109 | Index i; | 120 | Index i; |
| 110 | CHECKL(args != NULL); | 121 | CHECKL(args != NULL); |
| 111 | for (i = 0; args[i].key != MPS_KEY_ARGS_END; ++i) { | 122 | for (i = 0; args[i].key != MPS_KEY_ARGS_END; ++i) { |
| 112 | CHECKL(i < ARGS_MAX); | 123 | CHECKL(i < MPS_ARGS_MAX); |
| 113 | CHECKL(ArgCheck(&args[i])); | 124 | CHECKL(ArgCheck(&args[i])); |
| 114 | } | 125 | } |
| 115 | return TRUE; | 126 | return TRUE; |
diff --git a/mps/code/arg.h b/mps/code/arg.h index dc1e8a2a991..7bf7f0390bf 100644 --- a/mps/code/arg.h +++ b/mps/code/arg.h | |||
| @@ -49,6 +49,8 @@ extern Bool ArgCheckFun(Arg arg); | |||
| 49 | extern Bool ArgCheckAlign(Arg arg); | 49 | extern Bool ArgCheckAlign(Arg arg); |
| 50 | extern Bool ArgCheckBool(Arg arg); | 50 | extern Bool ArgCheckBool(Arg arg); |
| 51 | extern Bool ArgCheckCount(Arg arg); | 51 | extern Bool ArgCheckCount(Arg arg); |
| 52 | extern Bool ArgCheckPointer(Arg arg); | ||
| 53 | extern Bool ArgCheckRankSet(Arg arg); | ||
| 52 | 54 | ||
| 53 | 55 | ||
| 54 | #endif /* arg_h */ | 56 | #endif /* arg_h */ |
diff --git a/mps/code/config.h b/mps/code/config.h index e50d86c8cd6..03d265c4dba 100644 --- a/mps/code/config.h +++ b/mps/code/config.h | |||
| @@ -299,10 +299,6 @@ | |||
| 299 | #define LDHistoryLENGTH ((Size)4) | 299 | #define LDHistoryLENGTH ((Size)4) |
| 300 | 300 | ||
| 301 | 301 | ||
| 302 | /* Maximum length of a keyword argument list. */ | ||
| 303 | #define ARGS_MAX ((Count)32) | ||
| 304 | |||
| 305 | |||
| 306 | /* Stack configuration */ | 302 | /* Stack configuration */ |
| 307 | 303 | ||
| 308 | /* Currently StackProbe has a useful implementation only on | 304 | /* Currently StackProbe has a useful implementation only on |
diff --git a/mps/code/mpm.h b/mps/code/mpm.h index 580dd255e9c..52d2478017f 100644 --- a/mps/code/mpm.h +++ b/mps/code/mpm.h | |||
| @@ -640,7 +640,8 @@ extern Bool LocusCheck(Arena arena); | |||
| 640 | /* Segment interface */ | 640 | /* Segment interface */ |
| 641 | 641 | ||
| 642 | extern Res SegAlloc(Seg *segReturn, SegClass class, SegPref pref, | 642 | extern Res SegAlloc(Seg *segReturn, SegClass class, SegPref pref, |
| 643 | Size size, Pool pool, Bool withReservoirPermit, ...); | 643 | Size size, Pool pool, Bool withReservoirPermit, |
| 644 | ArgList args); | ||
| 644 | extern void SegFree(Seg seg); | 645 | extern void SegFree(Seg seg); |
| 645 | extern Bool SegOfAddr(Seg *segReturn, Arena arena, Addr addr); | 646 | extern Bool SegOfAddr(Seg *segReturn, Arena arena, Addr addr); |
| 646 | extern Bool SegFirst(Seg *segReturn, Arena arena); | 647 | extern Bool SegFirst(Seg *segReturn, Arena arena); |
diff --git a/mps/code/mpmtypes.h b/mps/code/mpmtypes.h index e74dcefae67..d7ced482b17 100644 --- a/mps/code/mpmtypes.h +++ b/mps/code/mpmtypes.h | |||
| @@ -147,7 +147,7 @@ typedef void (*FreeBlockStepMethod)(Addr base, Addr limit, Pool pool, void *p); | |||
| 147 | /* Seg*Method -- see <design/seg/> */ | 147 | /* Seg*Method -- see <design/seg/> */ |
| 148 | 148 | ||
| 149 | typedef Res (*SegInitMethod)(Seg seg, Pool pool, Addr base, Size size, | 149 | typedef Res (*SegInitMethod)(Seg seg, Pool pool, Addr base, Size size, |
| 150 | Bool withReservoirPermit, va_list args); | 150 | Bool withReservoirPermit, ArgList args); |
| 151 | typedef void (*SegFinishMethod)(Seg seg); | 151 | typedef void (*SegFinishMethod)(Seg seg); |
| 152 | typedef void (*SegSetGreyMethod)(Seg seg, TraceSet grey); | 152 | typedef void (*SegSetGreyMethod)(Seg seg, TraceSet grey); |
| 153 | typedef void (*SegSetWhiteMethod)(Seg seg, TraceSet white); | 153 | typedef void (*SegSetWhiteMethod)(Seg seg, TraceSet white); |
diff --git a/mps/code/mps.h b/mps/code/mps.h index 6b1f4b9a50d..588caced9cb 100644 --- a/mps/code/mps.h +++ b/mps/code/mps.h | |||
| @@ -112,6 +112,7 @@ typedef struct mps_arg_s { | |||
| 112 | mps_addr_t (*addr_method)(mps_addr_t); | 112 | mps_addr_t (*addr_method)(mps_addr_t); |
| 113 | mps_align_t align; | 113 | mps_align_t align; |
| 114 | mps_word_t count; | 114 | mps_word_t count; |
| 115 | void *p; | ||
| 115 | } val; | 116 | } val; |
| 116 | } mps_arg_s; | 117 | } mps_arg_s; |
| 117 | 118 | ||
| @@ -140,15 +141,18 @@ extern const struct mps_key_s _mps_key_align; | |||
| 140 | extern const struct mps_key_s _mps_key_vmw3_top_down; | 141 | extern const struct mps_key_s _mps_key_vmw3_top_down; |
| 141 | #define MPS_KEY_VMW3_TOP_DOWN (&_mps_key_vmw3_top_down) | 142 | #define MPS_KEY_VMW3_TOP_DOWN (&_mps_key_vmw3_top_down) |
| 142 | 143 | ||
| 144 | /* Maximum length of a keyword argument list. */ | ||
| 145 | #define MPS_ARGS_MAX 32 | ||
| 146 | |||
| 143 | #define MPS_ARGS_BEGIN(_var) \ | 147 | #define MPS_ARGS_BEGIN(_var) \ |
| 144 | BEGIN \ | 148 | BEGIN \ |
| 145 | mps_arg_s _var[ARGS_MAX]; \ | 149 | mps_arg_s _var[MPS_ARGS_MAX]; \ |
| 146 | unsigned _var##_i = 0; \ | 150 | unsigned _var##_i = 0; \ |
| 147 | BEGIN | 151 | BEGIN |
| 148 | 152 | ||
| 149 | #define MPS_ARGS_ADD(_var, _key, _field, _val) \ | 153 | #define MPS_ARGS_ADD(_var, _key, _field, _val) \ |
| 150 | BEGIN \ | 154 | BEGIN \ |
| 151 | /* TODO: AVER(_var_i < ARGS_MAX); */ \ | 155 | /* TODO: AVER(_var_i < MPS_ARGS_MAX); */ \ |
| 152 | _var[_var##_i].key = (_key); \ | 156 | _var[_var##_i].key = (_key); \ |
| 153 | _var[_var##_i].val._field = (_val); \ | 157 | _var[_var##_i].val._field = (_val); \ |
| 154 | ++_var##_i; \ | 158 | ++_var##_i; \ |
| @@ -156,9 +160,9 @@ extern const struct mps_key_s _mps_key_vmw3_top_down; | |||
| 156 | 160 | ||
| 157 | #define MPS_ARGS_DONE(_var) \ | 161 | #define MPS_ARGS_DONE(_var) \ |
| 158 | BEGIN \ | 162 | BEGIN \ |
| 159 | /* TODO: AVER(_var##_i < ARGS_MAX); */ \ | 163 | /* TODO: AVER(_var##_i < MPS_ARGS_MAX); */ \ |
| 160 | _var[_var##_i].key = MPS_KEY_ARGS_END; \ | 164 | _var[_var##_i].key = MPS_KEY_ARGS_END; \ |
| 161 | /* TODO: _var##_i = ARGS_MAX; */ \ | 165 | /* TODO: _var##_i = MPS_ARGS_MAX; */ \ |
| 162 | END | 166 | END |
| 163 | 167 | ||
| 164 | #define MPS_ARGS_END(_var) \ | 168 | #define MPS_ARGS_END(_var) \ |
diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c index edfea20b211..cde869c935a 100644 --- a/mps/code/mpsi.c +++ b/mps/code/mpsi.c | |||
| @@ -330,7 +330,7 @@ mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o, | |||
| 330 | mps_arena_class_t arena_class, | 330 | mps_arena_class_t arena_class, |
| 331 | va_list varargs) | 331 | va_list varargs) |
| 332 | { | 332 | { |
| 333 | mps_arg_s args[ARGS_MAX]; | 333 | mps_arg_s args[MPS_ARGS_MAX]; |
| 334 | AVERT(ArenaClass, arena_class); | 334 | AVERT(ArenaClass, arena_class); |
| 335 | arena_class->varargs(args, varargs); | 335 | arena_class->varargs(args, varargs); |
| 336 | va_end(varargs); | 336 | va_end(varargs); |
| @@ -629,7 +629,7 @@ mps_res_t mps_pool_create(mps_pool_t *mps_pool_o, mps_arena_t arena, | |||
| 629 | mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, mps_arena_t arena, | 629 | mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, mps_arena_t arena, |
| 630 | mps_class_t class, va_list varargs) | 630 | mps_class_t class, va_list varargs) |
| 631 | { | 631 | { |
| 632 | mps_arg_s args[ARGS_MAX]; | 632 | mps_arg_s args[MPS_ARGS_MAX]; |
| 633 | AVERT(PoolClass, class); | 633 | AVERT(PoolClass, class); |
| 634 | class->varargs(args, varargs); | 634 | class->varargs(args, varargs); |
| 635 | va_end(varargs); | 635 | va_end(varargs); |
diff --git a/mps/code/poolamc.c b/mps/code/poolamc.c index b6b4e5c0289..6ec1c63137b 100644 --- a/mps/code/poolamc.c +++ b/mps/code/poolamc.c | |||
| @@ -142,13 +142,20 @@ static Bool amcSegCheck(amcSeg amcseg) | |||
| 142 | 142 | ||
| 143 | /* AMCSegInit -- initialise an AMC segment */ | 143 | /* AMCSegInit -- initialise an AMC segment */ |
| 144 | 144 | ||
| 145 | ARG_DEFINE_KEY(amc_seg_type, Pointer); | ||
| 146 | #define amcKeySegType (&_mps_key_amc_seg_type) | ||
| 147 | |||
| 145 | static Res AMCSegInit(Seg seg, Pool pool, Addr base, Size size, | 148 | static Res AMCSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 146 | Bool reservoirPermit, va_list args) | 149 | Bool reservoirPermit, ArgList args) |
| 147 | { | 150 | { |
| 148 | int *segtype = va_arg(args, int*); /* .segtype */ | 151 | int *segtype; |
| 149 | SegClass super; | 152 | SegClass super; |
| 150 | amcSeg amcseg; | 153 | amcSeg amcseg; |
| 151 | Res res; | 154 | Res res; |
| 155 | ArgStruct arg; | ||
| 156 | |||
| 157 | ArgRequire(&arg, args, amcKeySegType); /* .segtype */ | ||
| 158 | segtype = arg.val.p; | ||
| 152 | 159 | ||
| 153 | AVERT(Seg, seg); | 160 | AVERT(Seg, seg); |
| 154 | amcseg = Seg2amcSeg(seg); | 161 | amcseg = Seg2amcSeg(seg); |
| @@ -1163,9 +1170,12 @@ static Res AMCBufferFill(Addr *baseReturn, Addr *limitReturn, | |||
| 1163 | SegPrefExpress(&segPrefStruct, SegPrefCollected, NULL); | 1170 | SegPrefExpress(&segPrefStruct, SegPrefCollected, NULL); |
| 1164 | genNr = PoolGenNr(&gen->pgen); | 1171 | genNr = PoolGenNr(&gen->pgen); |
| 1165 | SegPrefExpress(&segPrefStruct, SegPrefGen, &genNr); | 1172 | SegPrefExpress(&segPrefStruct, SegPrefGen, &genNr); |
| 1166 | res = SegAlloc(&seg, amcSegClassGet(), &segPrefStruct, | 1173 | MPS_ARGS_BEGIN(args) { |
| 1167 | alignedSize, pool, withReservoirPermit, | 1174 | MPS_ARGS_ADD(args, amcKeySegType, p, &gen->type); /* .segtype */ |
| 1168 | &gen->type); /* .segtype */ | 1175 | MPS_ARGS_DONE(args); |
| 1176 | res = SegAlloc(&seg, amcSegClassGet(), &segPrefStruct, | ||
| 1177 | alignedSize, pool, withReservoirPermit, args); | ||
| 1178 | } MPS_ARGS_END(args); | ||
| 1169 | if(res != ResOK) | 1179 | if(res != ResOK) |
| 1170 | return res; | 1180 | return res; |
| 1171 | AVER(alignedSize == SegSize(seg)); | 1181 | AVER(alignedSize == SegSize(seg)); |
diff --git a/mps/code/poolams.c b/mps/code/poolams.c index e5e4b249bcb..da5f917ea73 100644 --- a/mps/code/poolams.c +++ b/mps/code/poolams.c | |||
| @@ -203,7 +203,7 @@ static void amsDestroyTables(AMS ams, BT allocTable, | |||
| 203 | /* AMSSegInit -- Init method for AMS segments */ | 203 | /* AMSSegInit -- Init method for AMS segments */ |
| 204 | 204 | ||
| 205 | static Res AMSSegInit(Seg seg, Pool pool, Addr base, Size size, | 205 | static Res AMSSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 206 | Bool reservoirPermit, va_list args) | 206 | Bool reservoirPermit, ArgList args) |
| 207 | { | 207 | { |
| 208 | SegClass super; | 208 | SegClass super; |
| 209 | AMSSeg amsseg; | 209 | AMSSeg amsseg; |
| @@ -679,14 +679,14 @@ static Res AMSSegCreate(Seg *segReturn, Pool pool, Size size, | |||
| 679 | goto failSize; | 679 | goto failSize; |
| 680 | 680 | ||
| 681 | res = SegAlloc(&seg, (*ams->segClass)(), segPref, prefSize, | 681 | res = SegAlloc(&seg, (*ams->segClass)(), segPref, prefSize, |
| 682 | pool, withReservoirPermit); | 682 | pool, withReservoirPermit, argsNone); |
| 683 | if (res != ResOK) { /* try to allocate one that's just large enough */ | 683 | if (res != ResOK) { /* try to allocate one that's just large enough */ |
| 684 | Size minSize = SizeAlignUp(size, ArenaAlign(arena)); | 684 | Size minSize = SizeAlignUp(size, ArenaAlign(arena)); |
| 685 | 685 | ||
| 686 | if (minSize == prefSize) | 686 | if (minSize == prefSize) |
| 687 | goto failSeg; | 687 | goto failSeg; |
| 688 | res = SegAlloc(&seg, (*ams->segClass)(), segPref, minSize, | 688 | res = SegAlloc(&seg, (*ams->segClass)(), segPref, minSize, |
| 689 | pool, withReservoirPermit); | 689 | pool, withReservoirPermit, argsNone); |
| 690 | if (res != ResOK) | 690 | if (res != ResOK) |
| 691 | goto failSeg; | 691 | goto failSeg; |
| 692 | } | 692 | } |
diff --git a/mps/code/poolawl.c b/mps/code/poolawl.c index 96f0d2bef03..3014376a8eb 100644 --- a/mps/code/poolawl.c +++ b/mps/code/poolawl.c | |||
| @@ -169,8 +169,11 @@ static void awlStatTotalInit(AWL awl) | |||
| 169 | 169 | ||
| 170 | /* AWLSegInit -- Init method for AWL segments */ | 170 | /* AWLSegInit -- Init method for AWL segments */ |
| 171 | 171 | ||
| 172 | ARG_DEFINE_KEY(awl_seg_rank_set, RankSet); | ||
| 173 | #define awlKeySegRankSet (&_mps_key_awl_seg_rank_set) | ||
| 174 | |||
| 172 | static Res AWLSegInit(Seg seg, Pool pool, Addr base, Size size, | 175 | static Res AWLSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 173 | Bool reservoirPermit, va_list args) | 176 | Bool reservoirPermit, ArgList args) |
| 174 | { | 177 | { |
| 175 | SegClass super; | 178 | SegClass super; |
| 176 | AWLSeg awlseg; | 179 | AWLSeg awlseg; |
| @@ -181,6 +184,7 @@ static Res AWLSegInit(Seg seg, Pool pool, Addr base, Size size, | |||
| 181 | Res res; | 184 | Res res; |
| 182 | Size tableSize; | 185 | Size tableSize; |
| 183 | void *v; | 186 | void *v; |
| 187 | ArgStruct arg; | ||
| 184 | 188 | ||
| 185 | AVERT(Seg, seg); | 189 | AVERT(Seg, seg); |
| 186 | awlseg = Seg2AWLSeg(seg); | 190 | awlseg = Seg2AWLSeg(seg); |
| @@ -188,7 +192,9 @@ static Res AWLSegInit(Seg seg, Pool pool, Addr base, Size size, | |||
| 188 | arena = PoolArena(pool); | 192 | arena = PoolArena(pool); |
| 189 | /* no useful checks for base and size */ | 193 | /* no useful checks for base and size */ |
| 190 | AVER(BoolCheck(reservoirPermit)); | 194 | AVER(BoolCheck(reservoirPermit)); |
| 191 | rankSet = va_arg(args, RankSet); | 195 | ArgRequire(&arg, args, awlKeySegRankSet); |
| 196 | rankSet = arg.val.u; | ||
| 197 | AVERT(RankSet, rankSet); | ||
| 192 | /* .assume.samerank */ | 198 | /* .assume.samerank */ |
| 193 | /* AWL only accepts two ranks */ | 199 | /* AWL only accepts two ranks */ |
| 194 | AVER(RankSetSingle(RankEXACT) == rankSet | 200 | AVER(RankSetSingle(RankEXACT) == rankSet |
| @@ -467,8 +473,12 @@ static Res AWLSegCreate(AWLSeg *awlsegReturn, | |||
| 467 | segPrefStruct = *SegPrefDefault(); | 473 | segPrefStruct = *SegPrefDefault(); |
| 468 | SegPrefExpress(&segPrefStruct, SegPrefCollected, NULL); | 474 | SegPrefExpress(&segPrefStruct, SegPrefCollected, NULL); |
| 469 | SegPrefExpress(&segPrefStruct, SegPrefGen, &awl->gen); | 475 | SegPrefExpress(&segPrefStruct, SegPrefGen, &awl->gen); |
| 470 | res = SegAlloc(&seg, AWLSegClassGet(), &segPrefStruct, size, pool, | 476 | MPS_ARGS_BEGIN(args) { |
| 471 | reservoirPermit, rankSet); | 477 | MPS_ARGS_ADD(args, awlKeySegRankSet, u, rankSet); |
| 478 | MPS_ARGS_DONE(args); | ||
| 479 | res = SegAlloc(&seg, AWLSegClassGet(), &segPrefStruct, size, pool, | ||
| 480 | reservoirPermit, args); | ||
| 481 | } MPS_ARGS_END(args); | ||
| 472 | if (res != ResOK) | 482 | if (res != ResOK) |
| 473 | return res; | 483 | return res; |
| 474 | 484 | ||
diff --git a/mps/code/poollo.c b/mps/code/poollo.c index 8943f37c8ba..d59bc1995b8 100644 --- a/mps/code/poollo.c +++ b/mps/code/poollo.c | |||
| @@ -63,7 +63,7 @@ typedef struct LOSegStruct { | |||
| 63 | 63 | ||
| 64 | /* forward decls */ | 64 | /* forward decls */ |
| 65 | static Res loSegInit(Seg seg, Pool pool, Addr base, Size size, | 65 | static Res loSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 66 | Bool reservoirPermit, va_list args); | 66 | Bool reservoirPermit, ArgList args); |
| 67 | static void loSegFinish(Seg seg); | 67 | static void loSegFinish(Seg seg); |
| 68 | 68 | ||
| 69 | 69 | ||
| @@ -99,7 +99,7 @@ static Bool LOSegCheck(LOSeg loseg) | |||
| 99 | /* loSegInit -- Init method for LO segments */ | 99 | /* loSegInit -- Init method for LO segments */ |
| 100 | 100 | ||
| 101 | static Res loSegInit(Seg seg, Pool pool, Addr base, Size size, | 101 | static Res loSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 102 | Bool reservoirPermit, va_list args) | 102 | Bool reservoirPermit, ArgList args) |
| 103 | { | 103 | { |
| 104 | SegClass super; | 104 | SegClass super; |
| 105 | LOSeg loseg; | 105 | LOSeg loseg; |
| @@ -305,7 +305,7 @@ static Res loSegCreate(LOSeg *loSegReturn, Pool pool, Size size, | |||
| 305 | SegPrefExpress(&segPrefStruct, SegPrefCollected, NULL); | 305 | SegPrefExpress(&segPrefStruct, SegPrefCollected, NULL); |
| 306 | SegPrefExpress(&segPrefStruct, SegPrefGen, &gen); | 306 | SegPrefExpress(&segPrefStruct, SegPrefGen, &gen); |
| 307 | res = SegAlloc(&seg, EnsureLOSegClass(), &segPrefStruct, | 307 | res = SegAlloc(&seg, EnsureLOSegClass(), &segPrefStruct, |
| 308 | asize, pool, withReservoirPermit); | 308 | asize, pool, withReservoirPermit, argsNone); |
| 309 | if (res != ResOK) | 309 | if (res != ResOK) |
| 310 | return res; | 310 | return res; |
| 311 | PoolGenUpdateZones(&lo->pgen, seg); | 311 | PoolGenUpdateZones(&lo->pgen, seg); |
diff --git a/mps/code/poolmrg.c b/mps/code/poolmrg.c index 5e25c039b42..fc93cc47d0b 100644 --- a/mps/code/poolmrg.c +++ b/mps/code/poolmrg.c | |||
| @@ -211,7 +211,7 @@ static Bool MRGRefSegCheck(MRGRefSeg refseg) | |||
| 211 | /* MRGLinkSegInit -- initialise a link segment */ | 211 | /* MRGLinkSegInit -- initialise a link segment */ |
| 212 | 212 | ||
| 213 | static Res MRGLinkSegInit(Seg seg, Pool pool, Addr base, Size size, | 213 | static Res MRGLinkSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 214 | Bool reservoirPermit, va_list args) | 214 | Bool reservoirPermit, ArgList args) |
| 215 | { | 215 | { |
| 216 | SegClass super; | 216 | SegClass super; |
| 217 | MRGLinkSeg linkseg; | 217 | MRGLinkSeg linkseg; |
| @@ -239,21 +239,27 @@ static Res MRGLinkSegInit(Seg seg, Pool pool, Addr base, Size size, | |||
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | 241 | ||
| 242 | /* MRGRefSegInit -- initialise a ref segment | 242 | /* MRGRefSegInit -- initialise a ref segment */ |
| 243 | * | 243 | |
| 244 | * .ref.initarg: The paired link segment is passed as an additional | 244 | ARG_DEFINE_KEY(mrg_seg_link_seg, Pointer); |
| 245 | * (vararg) parameter when creating the ref segment. Initially the | 245 | #define mrgKeyLinkSeg (&_mps_key_mrg_seg_link_seg) |
| 246 | * refSeg field of the link segment is NULL (see .link.nullref). | 246 | |
| 247 | * It's initialized here to the newly initialized ref segment. | ||
| 248 | */ | ||
| 249 | static Res MRGRefSegInit(Seg seg, Pool pool, Addr base, Size size, | 247 | static Res MRGRefSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 250 | Bool reservoirPermit, va_list args) | 248 | Bool reservoirPermit, ArgList args) |
| 251 | { | 249 | { |
| 252 | MRGLinkSeg linkseg = va_arg(args, MRGLinkSeg); /* .ref.initarg */ | 250 | MRGLinkSeg linkseg; |
| 253 | MRGRefSeg refseg; | 251 | MRGRefSeg refseg; |
| 254 | MRG mrg; | 252 | MRG mrg; |
| 255 | SegClass super; | 253 | SegClass super; |
| 256 | Res res; | 254 | Res res; |
| 255 | ArgStruct arg; | ||
| 256 | |||
| 257 | /* .ref.initarg: The paired link segment is passed as a keyword | ||
| 258 | argument when creating the ref segment. Initially the | ||
| 259 | refSeg field of the link segment is NULL (see .link.nullref). | ||
| 260 | It's initialized here to the newly initialized ref segment. */ | ||
| 261 | ArgRequire(&arg, args, mrgKeyLinkSeg); | ||
| 262 | linkseg = arg.val.p; | ||
| 257 | 263 | ||
| 258 | AVERT(Seg, seg); | 264 | AVERT(Seg, seg); |
| 259 | refseg = Seg2RefSeg(seg); | 265 | refseg = Seg2RefSeg(seg); |
| @@ -513,15 +519,18 @@ static Res MRGSegPairCreate(MRGRefSeg *refSegReturn, MRG mrg, | |||
| 513 | 519 | ||
| 514 | res = SegAlloc(&segLink, EnsureMRGLinkSegClass(), | 520 | res = SegAlloc(&segLink, EnsureMRGLinkSegClass(), |
| 515 | SegPrefDefault(), linkSegSize, pool, | 521 | SegPrefDefault(), linkSegSize, pool, |
| 516 | withReservoirPermit); | 522 | withReservoirPermit, argsNone); |
| 517 | if (res != ResOK) | 523 | if (res != ResOK) |
| 518 | goto failLinkSegAlloc; | 524 | goto failLinkSegAlloc; |
| 519 | linkseg = Seg2LinkSeg(segLink); | 525 | linkseg = Seg2LinkSeg(segLink); |
| 520 | 526 | ||
| 521 | res = SegAlloc(&segRefPart, EnsureMRGRefSegClass(), | 527 | MPS_ARGS_BEGIN(args) { |
| 522 | SegPrefDefault(), mrg->extendBy, pool, | 528 | MPS_ARGS_ADD(args, mrgKeyLinkSeg, p, linkseg); /* .ref.initarg */ |
| 523 | withReservoirPermit, | 529 | MPS_ARGS_DONE(args); |
| 524 | linkseg); /* .ref.initarg */ | 530 | res = SegAlloc(&segRefPart, EnsureMRGRefSegClass(), |
| 531 | SegPrefDefault(), mrg->extendBy, pool, | ||
| 532 | withReservoirPermit, args); | ||
| 533 | } MPS_ARGS_END(args); | ||
| 525 | if (res != ResOK) | 534 | if (res != ResOK) |
| 526 | goto failRefPartSegAlloc; | 535 | goto failRefPartSegAlloc; |
| 527 | refseg = Seg2RefSeg(segRefPart); | 536 | refseg = Seg2RefSeg(segRefPart); |
diff --git a/mps/code/poolmv2.c b/mps/code/poolmv2.c index 076d39563b4..92b6708dec2 100644 --- a/mps/code/poolmv2.c +++ b/mps/code/poolmv2.c | |||
| @@ -890,7 +890,8 @@ static Res MVTSegAlloc(Seg *segReturn, MVT mvt, Size size, | |||
| 890 | Pool pool, Bool withReservoirPermit) | 890 | Pool pool, Bool withReservoirPermit) |
| 891 | { | 891 | { |
| 892 | Res res = SegAlloc(segReturn, GCSegClassGet(), | 892 | Res res = SegAlloc(segReturn, GCSegClassGet(), |
| 893 | MVTSegPref(mvt), size, pool, withReservoirPermit); | 893 | MVTSegPref(mvt), size, pool, withReservoirPermit, |
| 894 | argsNone); | ||
| 894 | 895 | ||
| 895 | if (res == ResOK) { | 896 | if (res == ResOK) { |
| 896 | Size segSize = SegSize(*segReturn); | 897 | Size segSize = SegSize(*segReturn); |
diff --git a/mps/code/poolmvff.c b/mps/code/poolmvff.c index ce6bf9cc9ae..4d3044aae86 100644 --- a/mps/code/poolmvff.c +++ b/mps/code/poolmvff.c | |||
| @@ -198,13 +198,13 @@ static Res MVFFAddSeg(Seg *segReturn, | |||
| 198 | segSize = SizeAlignUp(segSize, align); | 198 | segSize = SizeAlignUp(segSize, align); |
| 199 | 199 | ||
| 200 | res = SegAlloc(&seg, SegClassGet(), mvff->segPref, segSize, pool, | 200 | res = SegAlloc(&seg, SegClassGet(), mvff->segPref, segSize, pool, |
| 201 | withReservoirPermit); | 201 | withReservoirPermit, argsNone); |
| 202 | if (res != ResOK) { | 202 | if (res != ResOK) { |
| 203 | /* try again for a seg just large enough for object */ | 203 | /* try again for a seg just large enough for object */ |
| 204 | /* see <design/poolmvff/#design.seg-fail> */ | 204 | /* see <design/poolmvff/#design.seg-fail> */ |
| 205 | segSize = SizeAlignUp(size, align); | 205 | segSize = SizeAlignUp(size, align); |
| 206 | res = SegAlloc(&seg, SegClassGet(), mvff->segPref, segSize, pool, | 206 | res = SegAlloc(&seg, SegClassGet(), mvff->segPref, segSize, pool, |
| 207 | withReservoirPermit); | 207 | withReservoirPermit, argsNone); |
| 208 | if (res != ResOK) { | 208 | if (res != ResOK) { |
| 209 | return res; | 209 | return res; |
| 210 | } | 210 | } |
diff --git a/mps/code/poolsnc.c b/mps/code/poolsnc.c index 70c618bf385..9f999abf9fc 100644 --- a/mps/code/poolsnc.c +++ b/mps/code/poolsnc.c | |||
| @@ -228,7 +228,7 @@ static Bool SNCSegCheck(SNCSeg sncseg) | |||
| 228 | /* sncSegInit -- Init method for SNC segments */ | 228 | /* sncSegInit -- Init method for SNC segments */ |
| 229 | 229 | ||
| 230 | static Res sncSegInit(Seg seg, Pool pool, Addr base, Size size, | 230 | static Res sncSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 231 | Bool reservoirPermit, va_list args) | 231 | Bool reservoirPermit, ArgList args) |
| 232 | { | 232 | { |
| 233 | SegClass super; | 233 | SegClass super; |
| 234 | SNCSeg sncseg; | 234 | SNCSeg sncseg; |
| @@ -439,7 +439,7 @@ static Res SNCBufferFill(Addr *baseReturn, Addr *limitReturn, | |||
| 439 | arena = PoolArena(pool); | 439 | arena = PoolArena(pool); |
| 440 | asize = SizeAlignUp(size, ArenaAlign(arena)); | 440 | asize = SizeAlignUp(size, ArenaAlign(arena)); |
| 441 | res = SegAlloc(&seg, SNCSegClassGet(), &snc->segPrefStruct, | 441 | res = SegAlloc(&seg, SNCSegClassGet(), &snc->segPrefStruct, |
| 442 | asize, pool, withReservoirPermit); | 442 | asize, pool, withReservoirPermit, argsNone); |
| 443 | if (res != ResOK) | 443 | if (res != ResOK) |
| 444 | return res; | 444 | return res; |
| 445 | 445 | ||
diff --git a/mps/code/seg.c b/mps/code/seg.c index c544a8063e0..f6deeb5ba4f 100644 --- a/mps/code/seg.c +++ b/mps/code/seg.c | |||
| @@ -46,7 +46,7 @@ SRCID(seg, "$Id$"); | |||
| 46 | static void SegFinish(Seg seg); | 46 | static void SegFinish(Seg seg); |
| 47 | 47 | ||
| 48 | static Res SegInit(Seg seg, Pool pool, Addr base, Size size, | 48 | static Res SegInit(Seg seg, Pool pool, Addr base, Size size, |
| 49 | Bool withReservoirPermit, va_list args); | 49 | Bool withReservoirPermit, ArgList args); |
| 50 | 50 | ||
| 51 | 51 | ||
| 52 | /* Generic interface support */ | 52 | /* Generic interface support */ |
| @@ -55,13 +55,12 @@ static Res SegInit(Seg seg, Pool pool, Addr base, Size size, | |||
| 55 | /* SegAlloc -- allocate a segment from the arena */ | 55 | /* SegAlloc -- allocate a segment from the arena */ |
| 56 | 56 | ||
| 57 | Res SegAlloc(Seg *segReturn, SegClass class, SegPref pref, | 57 | Res SegAlloc(Seg *segReturn, SegClass class, SegPref pref, |
| 58 | Size size, Pool pool, Bool withReservoirPermit, ...) | 58 | Size size, Pool pool, Bool withReservoirPermit, ArgList args) |
| 59 | { | 59 | { |
| 60 | Res res; | 60 | Res res; |
| 61 | Arena arena; | 61 | Arena arena; |
| 62 | Seg seg; | 62 | Seg seg; |
| 63 | Addr base; | 63 | Addr base; |
| 64 | va_list args; | ||
| 65 | void *p; | 64 | void *p; |
| 66 | 65 | ||
| 67 | AVER(segReturn != NULL); | 66 | AVER(segReturn != NULL); |
| @@ -86,10 +85,8 @@ Res SegAlloc(Seg *segReturn, SegClass class, SegPref pref, | |||
| 86 | goto failControl; | 85 | goto failControl; |
| 87 | seg = p; | 86 | seg = p; |
| 88 | 87 | ||
| 89 | va_start(args, withReservoirPermit); | ||
| 90 | seg->class = class; | 88 | seg->class = class; |
| 91 | res = SegInit(seg, pool, base, size, withReservoirPermit, args); | 89 | res = SegInit(seg, pool, base, size, withReservoirPermit, args); |
| 92 | va_end(args); | ||
| 93 | if (res != ResOK) | 90 | if (res != ResOK) |
| 94 | goto failInit; | 91 | goto failInit; |
| 95 | 92 | ||
| @@ -138,7 +135,7 @@ void SegFree(Seg seg) | |||
| 138 | /* SegInit -- initialize a segment */ | 135 | /* SegInit -- initialize a segment */ |
| 139 | 136 | ||
| 140 | static Res SegInit(Seg seg, Pool pool, Addr base, Size size, | 137 | static Res SegInit(Seg seg, Pool pool, Addr base, Size size, |
| 141 | Bool withReservoirPermit, va_list args) | 138 | Bool withReservoirPermit, ArgList args) |
| 142 | { | 139 | { |
| 143 | Tract tract; | 140 | Tract tract; |
| 144 | Addr addr, limit; | 141 | Addr addr, limit; |
| @@ -691,7 +688,7 @@ Bool SegCheck(Seg seg) | |||
| 691 | /* segTrivInit -- method to initialize the base fields of a segment */ | 688 | /* segTrivInit -- method to initialize the base fields of a segment */ |
| 692 | 689 | ||
| 693 | static Res segTrivInit(Seg seg, Pool pool, Addr base, Size size, | 690 | static Res segTrivInit(Seg seg, Pool pool, Addr base, Size size, |
| 694 | Bool reservoirPermit, va_list args) | 691 | Bool reservoirPermit, ArgList args) |
| 695 | { | 692 | { |
| 696 | /* all the initialization happens in SegInit so checks are safe */ | 693 | /* all the initialization happens in SegInit so checks are safe */ |
| 697 | Size align; | 694 | Size align; |
| @@ -707,6 +704,7 @@ static Res segTrivInit(Seg seg, Pool pool, Addr base, Size size, | |||
| 707 | AVER(SegSize(seg) == size); | 704 | AVER(SegSize(seg) == size); |
| 708 | AVER(SegPool(seg) == pool); | 705 | AVER(SegPool(seg) == pool); |
| 709 | AVER(BoolCheck(reservoirPermit)); | 706 | AVER(BoolCheck(reservoirPermit)); |
| 707 | AVER(ArgListCheck(args)); | ||
| 710 | UNUSED(args); | 708 | UNUSED(args); |
| 711 | return ResOK; | 709 | return ResOK; |
| 712 | } | 710 | } |
| @@ -1064,7 +1062,7 @@ Bool GCSegCheck(GCSeg gcseg) | |||
| 1064 | /* gcSegInit -- method to initialize a GC segment */ | 1062 | /* gcSegInit -- method to initialize a GC segment */ |
| 1065 | 1063 | ||
| 1066 | static Res gcSegInit(Seg seg, Pool pool, Addr base, Size size, | 1064 | static Res gcSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 1067 | Bool withReservoirPermit, va_list args) | 1065 | Bool withReservoirPermit, ArgList args) |
| 1068 | { | 1066 | { |
| 1069 | SegClass super; | 1067 | SegClass super; |
| 1070 | GCSeg gcseg; | 1068 | GCSeg gcseg; |
diff --git a/mps/code/segsmss.c b/mps/code/segsmss.c index 02b29504d34..8708db2348d 100644 --- a/mps/code/segsmss.c +++ b/mps/code/segsmss.c | |||
| @@ -115,7 +115,7 @@ static Bool AMSTSegCheck(AMSTSeg amstseg) | |||
| 115 | /* amstSegInit -- initialise an amst segment */ | 115 | /* amstSegInit -- initialise an amst segment */ |
| 116 | 116 | ||
| 117 | static Res amstSegInit(Seg seg, Pool pool, Addr base, Size size, | 117 | static Res amstSegInit(Seg seg, Pool pool, Addr base, Size size, |
| 118 | Bool reservoirPermit, va_list args) | 118 | Bool reservoirPermit, ArgList args) |
| 119 | { | 119 | { |
| 120 | SegClass super; | 120 | SegClass super; |
| 121 | AMSTSeg amstseg; | 121 | AMSTSeg amstseg; |