aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorRichard Brooksby2013-05-09 17:34:01 +0100
committerRichard Brooksby2013-05-09 17:34:01 +0100
commitaf44d1241f83f6e0dd5a1309d68905cf128bd444 (patch)
tree457b6d08f6fe8ccc3e557eeb11fee4688fdef256 /mps/code
parentf4416c7efc53e2092dbacd6a2e1d67c4ec3b0a68 (diff)
downloademacs-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.c2
-rw-r--r--mps/code/arg.c13
-rw-r--r--mps/code/arg.h2
-rw-r--r--mps/code/config.h4
-rw-r--r--mps/code/mpm.h3
-rw-r--r--mps/code/mpmtypes.h2
-rw-r--r--mps/code/mps.h12
-rw-r--r--mps/code/mpsi.c4
-rw-r--r--mps/code/poolamc.c20
-rw-r--r--mps/code/poolams.c6
-rw-r--r--mps/code/poolawl.c18
-rw-r--r--mps/code/poollo.c6
-rw-r--r--mps/code/poolmrg.c41
-rw-r--r--mps/code/poolmv2.c3
-rw-r--r--mps/code/poolmvff.c4
-rw-r--r--mps/code/poolsnc.c4
-rw-r--r--mps/code/seg.c14
-rw-r--r--mps/code/segsmss.c2
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
79Bool ArgCheckPointer(Arg arg) {
80 CHECKL(arg != NULL);
81 return TRUE;
82}
83
84Bool ArgCheckRankSet(Arg arg) {
85 CHECKL(COMPATTYPE(RankSet, unsigned));
86 CHECKL(RankSetCheck(arg->val.u));
87 return TRUE;
88}
89
79 90
80ARG_DEFINE_KEY(args_end, Shouldnt); 91ARG_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);
49extern Bool ArgCheckAlign(Arg arg); 49extern Bool ArgCheckAlign(Arg arg);
50extern Bool ArgCheckBool(Arg arg); 50extern Bool ArgCheckBool(Arg arg);
51extern Bool ArgCheckCount(Arg arg); 51extern Bool ArgCheckCount(Arg arg);
52extern Bool ArgCheckPointer(Arg arg);
53extern 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
642extern Res SegAlloc(Seg *segReturn, SegClass class, SegPref pref, 642extern 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);
644extern void SegFree(Seg seg); 645extern void SegFree(Seg seg);
645extern Bool SegOfAddr(Seg *segReturn, Arena arena, Addr addr); 646extern Bool SegOfAddr(Seg *segReturn, Arena arena, Addr addr);
646extern Bool SegFirst(Seg *segReturn, Arena arena); 647extern 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
149typedef Res (*SegInitMethod)(Seg seg, Pool pool, Addr base, Size size, 149typedef Res (*SegInitMethod)(Seg seg, Pool pool, Addr base, Size size,
150 Bool withReservoirPermit, va_list args); 150 Bool withReservoirPermit, ArgList args);
151typedef void (*SegFinishMethod)(Seg seg); 151typedef void (*SegFinishMethod)(Seg seg);
152typedef void (*SegSetGreyMethod)(Seg seg, TraceSet grey); 152typedef void (*SegSetGreyMethod)(Seg seg, TraceSet grey);
153typedef void (*SegSetWhiteMethod)(Seg seg, TraceSet white); 153typedef 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;
140extern const struct mps_key_s _mps_key_vmw3_top_down; 141extern 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,
629mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, mps_arena_t arena, 629mps_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
145ARG_DEFINE_KEY(amc_seg_type, Pointer);
146#define amcKeySegType (&_mps_key_amc_seg_type)
147
145static Res AMCSegInit(Seg seg, Pool pool, Addr base, Size size, 148static 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
205static Res AMSSegInit(Seg seg, Pool pool, Addr base, Size size, 205static 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
172ARG_DEFINE_KEY(awl_seg_rank_set, RankSet);
173#define awlKeySegRankSet (&_mps_key_awl_seg_rank_set)
174
172static Res AWLSegInit(Seg seg, Pool pool, Addr base, Size size, 175static 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 */
65static Res loSegInit(Seg seg, Pool pool, Addr base, Size size, 65static Res loSegInit(Seg seg, Pool pool, Addr base, Size size,
66 Bool reservoirPermit, va_list args); 66 Bool reservoirPermit, ArgList args);
67static void loSegFinish(Seg seg); 67static 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
101static Res loSegInit(Seg seg, Pool pool, Addr base, Size size, 101static 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
213static Res MRGLinkSegInit(Seg seg, Pool pool, Addr base, Size size, 213static 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 244ARG_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 */
249static Res MRGRefSegInit(Seg seg, Pool pool, Addr base, Size size, 247static 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
230static Res sncSegInit(Seg seg, Pool pool, Addr base, Size size, 230static 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$");
46static void SegFinish(Seg seg); 46static void SegFinish(Seg seg);
47 47
48static Res SegInit(Seg seg, Pool pool, Addr base, Size size, 48static 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
57Res SegAlloc(Seg *segReturn, SegClass class, SegPref pref, 57Res 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
140static Res SegInit(Seg seg, Pool pool, Addr base, Size size, 137static 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
693static Res segTrivInit(Seg seg, Pool pool, Addr base, Size size, 690static 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
1066static Res gcSegInit(Seg seg, Pool pool, Addr base, Size size, 1064static 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
117static Res amstSegInit(Seg seg, Pool pool, Addr base, Size size, 117static 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;