From 688b5bf73d7462c8c2fabba7345d689c9aff2f21 Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Thu, 9 May 2013 18:25:53 +0100 Subject: [PATCH] Converting varags on buffer and ap creation into keyword argument lists. Copied from Perforce Change: 181680 ServerID: perforce.ravenbrook.com --- mps/code/arg.c | 5 +++ mps/code/arg.h | 1 + mps/code/buffer.c | 74 +++++++++++++++++++++++++-------------------- mps/code/mpm.h | 4 +-- mps/code/mpmst.h | 1 + mps/code/mpmtypes.h | 3 +- mps/code/mps.h | 4 +++ mps/code/mpsi.c | 70 +++++++++++++++++++++++------------------- mps/code/pool.c | 1 + mps/code/poolamc.c | 4 +-- mps/code/poolsnc.c | 2 +- 11 files changed, 99 insertions(+), 70 deletions(-) diff --git a/mps/code/arg.c b/mps/code/arg.c index 5cda234adb2..d8ab7277008 100644 --- a/mps/code/arg.c +++ b/mps/code/arg.c @@ -87,6 +87,11 @@ Bool ArgCheckRankSet(Arg arg) { return TRUE; } +Bool ArgCheckRank(Arg arg) { + CHECKL(RankCheck(arg->val.rank)); + return TRUE; +} + ARG_DEFINE_KEY(args_end, Shouldnt); diff --git a/mps/code/arg.h b/mps/code/arg.h index 7bf7f0390bf..e756da04182 100644 --- a/mps/code/arg.h +++ b/mps/code/arg.h @@ -51,6 +51,7 @@ extern Bool ArgCheckBool(Arg arg); extern Bool ArgCheckCount(Arg arg); extern Bool ArgCheckPointer(Arg arg); extern Bool ArgCheckRankSet(Arg arg); +extern Bool ArgCheckRank(Arg arg); #endif /* arg_h */ diff --git a/mps/code/buffer.c b/mps/code/buffer.c index 1731b2d9826..434635c9d3a 100644 --- a/mps/code/buffer.c +++ b/mps/code/buffer.c @@ -191,10 +191,10 @@ Res BufferDescribe(Buffer buffer, mps_lib_FILE *stream) } -/* BufferInitV -- initialize an allocation buffer */ +/* BufferInit -- initialize an allocation buffer */ -static Res BufferInitV(Buffer buffer, BufferClass class, - Pool pool, Bool isMutator, va_list args) +static Res BufferInit(Buffer buffer, BufferClass class, + Pool pool, Bool isMutator, ArgList args) { Arena arena; Res res; @@ -266,24 +266,7 @@ failInit: * See . */ Res BufferCreate(Buffer *bufferReturn, BufferClass class, - Pool pool, Bool isMutator, ...) -{ - Res res; - va_list args; - - va_start(args, isMutator); - res = BufferCreateV(bufferReturn, class, pool, isMutator, args); - va_end(args); - return res; -} - - -/* BufferCreateV -- create an allocation buffer, with varargs - * - * See . */ - -Res BufferCreateV(Buffer *bufferReturn, BufferClass class, - Pool pool, Bool isMutator, va_list args) + Pool pool, Bool isMutator, ArgList args) { Res res; Buffer buffer; @@ -304,7 +287,7 @@ Res BufferCreateV(Buffer *bufferReturn, BufferClass class, buffer = p; /* Initialize the buffer descriptor structure. */ - res = BufferInitV(buffer, class, pool, isMutator, args); + res = BufferInit(buffer, class, pool, isMutator, args); if (res != ResOK) goto failInit; @@ -1081,11 +1064,20 @@ void BufferRampReset(Buffer buffer) /* BufferClass -- support for the basic Buffer class */ +/* bufferTrivVarargs -- basic buffer varargs method */ + +static void bufferTrivVarargs(ArgStruct args[], va_list varargs) { + UNUSED(varargs); + args[0].key = MPS_KEY_ARGS_END; + AVER(ArgListCheck(args)); +} + + /* bufferTrivInit -- basic buffer init method */ -static Res bufferTrivInit (Buffer buffer, Pool pool, va_list args) +static Res bufferTrivInit(Buffer buffer, Pool pool, ArgList args) { - /* initialization happens in BufferInitV so checks are safe */ + /* initialization happens in BufferInit so checks are safe */ AVERT(Buffer, buffer); AVERT(Pool, pool); UNUSED(args); @@ -1096,7 +1088,7 @@ static Res bufferTrivInit (Buffer buffer, Pool pool, va_list args) /* bufferTrivFinish -- basic buffer finish method */ -static void bufferTrivFinish (Buffer buffer) +static void bufferTrivFinish(Buffer buffer) { /* No special finish for simple buffers */ AVERT(Buffer, buffer); @@ -1136,7 +1128,7 @@ static void bufferTrivDetach(Buffer buffer) * .noseg: basic buffers don't support segments, so this method should * not be called. */ -static Seg bufferNoSeg (Buffer buffer) +static Seg bufferNoSeg(Buffer buffer) { AVERT(Buffer, buffer); NOTREACHED; /* .noseg */ @@ -1147,7 +1139,7 @@ static Seg bufferNoSeg (Buffer buffer) /* bufferTrivRankSet -- basic BufferRankSet accessor method */ -static RankSet bufferTrivRankSet (Buffer buffer) +static RankSet bufferTrivRankSet(Buffer buffer) { AVERT(Buffer, buffer); /* vanilla buffers can only have empty rank set */ @@ -1160,7 +1152,7 @@ static RankSet bufferTrivRankSet (Buffer buffer) * .norank: basic buffers don't support ranksets, so this method should * not be called. */ -static void bufferNoSetRankSet (Buffer buffer, RankSet rankset) +static void bufferNoSetRankSet(Buffer buffer, RankSet rankset) { AVERT(Buffer, buffer); AVERT(RankSet, rankset); @@ -1173,7 +1165,7 @@ static void bufferNoSetRankSet (Buffer buffer, RankSet rankset) * .noseg: basic buffers don't support attachment to segments, so this * method should not be called. */ -static void bufferNoReassignSeg (Buffer buffer, Seg seg) +static void bufferNoReassignSeg(Buffer buffer, Seg seg) { AVERT(Buffer, buffer); AVERT(Seg, seg); @@ -1199,6 +1191,7 @@ Bool BufferClassCheck(BufferClass class) CHECKL(ProtocolClassCheck(&class->protocol)); CHECKL(class->name != NULL); /* Should be <=6 char C identifier */ CHECKL(class->size >= sizeof(BufferStruct)); + CHECKL(FUNCHECK(class->varargs)); CHECKL(FUNCHECK(class->init)); CHECKL(FUNCHECK(class->finish)); CHECKL(FUNCHECK(class->attach)); @@ -1222,6 +1215,7 @@ DEFINE_CLASS(BufferClass, class) INHERIT_CLASS(&class->protocol, ProtocolClass); class->name = "BUFFER"; class->size = sizeof(BufferStruct); + class->varargs = bufferTrivVarargs; class->init = bufferTrivInit; class->finish = bufferTrivFinish; class->attach = bufferTrivAttach; @@ -1278,7 +1272,7 @@ Bool SegBufCheck(SegBuf segbuf) /* segBufInit -- SegBuf init method */ -static Res segBufInit (Buffer buffer, Pool pool, va_list args) +static Res segBufInit(Buffer buffer, Pool pool, ArgList args) { BufferClass super; SegBuf segbuf; @@ -1490,16 +1484,31 @@ DEFINE_CLASS(SegBufClass, class) /* RankBufClass -- support for the RankBufClass subclass */ +/* rankBufVarargs -- parse obsolete varargs into keywords */ + +static void rankBufVarargs(ArgStruct args[], va_list varargs) +{ + args[0].key = MPS_KEY_RANK; + args[0].val.rank = va_arg(varargs, Rank); + args[1].key = MPS_KEY_ARGS_END; + AVER(ArgListCheck(args)); +} + + /* rankBufInit -- RankBufClass init method */ -static Res rankBufInit (Buffer buffer, Pool pool, va_list args) +static Res rankBufInit(Buffer buffer, Pool pool, ArgList args) { - Rank rank = va_arg(args, Rank); + Rank rank; BufferClass super; Res res; + ArgStruct arg; AVERT(Buffer, buffer); AVERT(Pool, pool); + AVER(ArgListCheck(args)); + ArgRequire(&arg, args, MPS_KEY_RANK); + rank = arg.val.rank; AVER(RankCheck(rank)); /* Initialize the superclass fields first via next-method call */ @@ -1528,6 +1537,7 @@ DEFINE_CLASS(RankBufClass, class) { INHERIT_CLASS(class, SegBufClass); class->name = "RANKBUF"; + class->varargs = rankBufVarargs; class->init = rankBufInit; } diff --git a/mps/code/mpm.h b/mps/code/mpm.h index 52d2478017f..93390a3b2bd 100644 --- a/mps/code/mpm.h +++ b/mps/code/mpm.h @@ -708,9 +708,7 @@ extern Addr (SegLimit)(Seg seg); /* Buffer Interface -- see */ extern Res BufferCreate(Buffer *bufferReturn, BufferClass class, - Pool pool, Bool isMutator, ...); -extern Res BufferCreateV(Buffer *bufferReturn, BufferClass class, - Pool pool, Bool isMutator, va_list args); + Pool pool, Bool isMutator, ArgList args); extern void BufferDestroy(Buffer buffer); extern Bool BufferCheck(Buffer buffer); extern Bool SegBufCheck(SegBuf segbuf); diff --git a/mps/code/mpmst.h b/mps/code/mpmst.h index 98e421ad823..6df155a80df 100644 --- a/mps/code/mpmst.h +++ b/mps/code/mpmst.h @@ -331,6 +331,7 @@ typedef struct BufferClassStruct { ProtocolClassStruct protocol; const char *name; /* class name string */ size_t size; /* size of outer structure */ + BufferVarargsMethod varargs; /* parse obsolete varargs */ BufferInitMethod init; /* initialize the buffer */ BufferFinishMethod finish; /* finish the buffer */ BufferAttachMethod attach; /* attach the buffer */ diff --git a/mps/code/mpmtypes.h b/mps/code/mpmtypes.h index d7ced482b17..8dfe310ea70 100644 --- a/mps/code/mpmtypes.h +++ b/mps/code/mpmtypes.h @@ -167,7 +167,8 @@ typedef Res (*SegSplitMethod)(Seg seg, Seg segHi, /* Buffer*Method -- see */ -typedef Res (*BufferInitMethod)(Buffer buffer, Pool pool, va_list args); +typedef void (*BufferVarargsMethod)(ArgStruct args[], va_list varargs); +typedef Res (*BufferInitMethod)(Buffer buffer, Pool pool, ArgList args); typedef void (*BufferFinishMethod)(Buffer buffer); typedef void (*BufferAttachMethod)(Buffer buffer, Addr base, Addr limit, Addr init, Size size); diff --git a/mps/code/mps.h b/mps/code/mps.h index 588caced9cb..4373c1861e7 100644 --- a/mps/code/mps.h +++ b/mps/code/mps.h @@ -113,6 +113,7 @@ typedef struct mps_arg_s { mps_align_t align; mps_word_t count; void *p; + mps_rank_t rank; } val; } mps_arg_s; @@ -126,6 +127,8 @@ extern const struct mps_key_s _mps_key_format; #define MPS_KEY_FORMAT (&_mps_key_format) extern const struct mps_key_s _mps_key_chain; #define MPS_KEY_CHAIN (&_mps_key_chain) +extern const struct mps_key_s _mps_key_rank; +#define MPS_KEY_RANK (&_mps_key_rank) extern const struct mps_key_s _mps_key_extend_by; #define MPS_KEY_EXTEND_BY (&_mps_key_extend_by) @@ -418,6 +421,7 @@ extern void mps_free(mps_pool_t, mps_addr_t, size_t); extern mps_res_t mps_ap_create(mps_ap_t *, mps_pool_t, ...); extern mps_res_t mps_ap_create_v(mps_ap_t *, mps_pool_t, va_list); +extern mps_res_t mps_ap_create_k(mps_ap_t *, mps_pool_t, mps_arg_s []); extern void mps_ap_destroy(mps_ap_t); extern mps_res_t (mps_reserve)(mps_addr_t *, mps_ap_t, size_t); diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c index cde869c935a..121131c67a2 100644 --- a/mps/code/mpsi.c +++ b/mps/code/mpsi.c @@ -318,9 +318,12 @@ mps_bool_t mps_arena_step(mps_arena_t arena, mps_res_t mps_arena_create(mps_arena_t *mps_arena_o, mps_arena_class_t mps_arena_class, ...) { + mps_res_t res; va_list varargs; va_start(varargs, mps_arena_class); - return mps_arena_create_v(mps_arena_o, mps_arena_class, varargs); + res = mps_arena_create_v(mps_arena_o, mps_arena_class, varargs); + va_end(varargs); + return res; } @@ -333,7 +336,6 @@ mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o, mps_arg_s args[MPS_ARGS_MAX]; AVERT(ArenaClass, arena_class); arena_class->varargs(args, varargs); - va_end(varargs); return mps_arena_create_args(mps_arena_o, arena_class, args); } @@ -621,9 +623,12 @@ void mps_fmt_destroy(mps_fmt_t format) mps_res_t mps_pool_create(mps_pool_t *mps_pool_o, mps_arena_t arena, mps_class_t mps_class, ...) { + mps_res_t res; va_list varargs; va_start(varargs, mps_class); - return mps_pool_create_v(mps_pool_o, arena, mps_class, varargs); + res = mps_pool_create_v(mps_pool_o, arena, mps_class, varargs); + va_end(varargs); + return res; } mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, mps_arena_t arena, @@ -632,7 +637,6 @@ mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, mps_arena_t arena, mps_arg_s args[MPS_ARGS_MAX]; AVERT(PoolClass, class); class->varargs(args, varargs); - va_end(varargs); return mps_pool_create_k(mps_pool_o, arena, class, args); } @@ -740,40 +744,43 @@ void mps_free(mps_pool_t pool, mps_addr_t p, size_t size) mps_res_t mps_ap_create(mps_ap_t *mps_ap_o, mps_pool_t pool, ...) { - Arena arena; - Buffer buf; - BufferClass bufclass; - Res res; - va_list args; - - AVER(mps_ap_o != NULL); - AVER(TESTT(Pool, pool)); - arena = PoolArena(pool); - - ArenaEnter(arena); - - AVERT(Pool, pool); - - va_start(args, pool); - bufclass = PoolDefaultBufferClass(pool); - res = BufferCreateV(&buf, bufclass, pool, TRUE, args); - va_end(args); - - ArenaLeave(arena); - - if (res != ResOK) - return res; - *mps_ap_o = BufferAP(buf); - return MPS_RES_OK; + mps_res_t res; + va_list varargs; + va_start(varargs, pool); + res = mps_ap_create_v(mps_ap_o, pool, varargs); + va_end(varargs); + return res; } /* mps_ap_create_v -- create an allocation point, with varargs */ mps_res_t mps_ap_create_v(mps_ap_t *mps_ap_o, mps_pool_t pool, - va_list args) + va_list varargs) { Arena arena; + BufferClass bufclass; + mps_arg_s args[MPS_ARGS_MAX]; + + AVER(mps_ap_o != NULL); + AVER(TESTT(Pool, pool)); + arena = PoolArena(pool); + + ArenaEnter(arena); + AVERT(Pool, pool); + bufclass = PoolDefaultBufferClass(pool); + bufclass->varargs(args, varargs); + ArenaLeave(arena); + + return mps_ap_create_k(mps_ap_o, pool, args); +} + +/* mps_ap_create_k -- create an allocation point, with keyword args */ + +mps_res_t mps_ap_create_k(mps_ap_t *mps_ap_o, + mps_pool_t pool, + mps_arg_s args[]) { + Arena arena; Buffer buf; BufferClass bufclass; Res res; @@ -787,12 +794,13 @@ mps_res_t mps_ap_create_v(mps_ap_t *mps_ap_o, mps_pool_t pool, AVERT(Pool, pool); bufclass = PoolDefaultBufferClass(pool); - res = BufferCreateV(&buf, bufclass, pool, TRUE, args); + res = BufferCreate(&buf, bufclass, pool, TRUE, args); ArenaLeave(arena); if (res != ResOK) return res; + *mps_ap_o = BufferAP(buf); return MPS_RES_OK; } diff --git a/mps/code/pool.c b/mps/code/pool.c index ff31b09a8af..bab44c83c7f 100644 --- a/mps/code/pool.c +++ b/mps/code/pool.c @@ -110,6 +110,7 @@ Bool PoolCheck(Pool pool) ARG_DEFINE_KEY(format, Format); ARG_DEFINE_KEY(chain, Chain); +ARG_DEFINE_KEY(rank, Rank); ARG_DEFINE_KEY(extend_by, Size); ARG_DEFINE_KEY(min_size, Size); ARG_DEFINE_KEY(mean_size, Size); diff --git a/mps/code/poolamc.c b/mps/code/poolamc.c index 6ec1c63137b..59c4453c4ff 100644 --- a/mps/code/poolamc.c +++ b/mps/code/poolamc.c @@ -611,7 +611,7 @@ static void amcBufSetGen(Buffer buffer, amcGen gen) /* AMCBufInit -- Initialize an amcBuf */ -static Res AMCBufInit(Buffer buffer, Pool pool, va_list args) +static Res AMCBufInit(Buffer buffer, Pool pool, ArgList args) { AMC amc; amcBuf amcbuf; @@ -696,7 +696,7 @@ static Res amcGenCreate(amcGen *genReturn, AMC amc, Serial genNr) goto failControlAlloc; gen = (amcGen)p; - res = BufferCreate(&buffer, EnsureamcBufClass(), pool, FALSE); + res = BufferCreate(&buffer, EnsureamcBufClass(), pool, FALSE, argsNone); if(res != ResOK) goto failBufferCreate; diff --git a/mps/code/poolsnc.c b/mps/code/poolsnc.c index 9f999abf9fc..358548b2e07 100644 --- a/mps/code/poolsnc.c +++ b/mps/code/poolsnc.c @@ -127,7 +127,7 @@ static void sncBufferSetTopSeg(Buffer buffer, Seg seg) /* SNCBufInit -- Initialize an SNCBuf */ -static Res SNCBufInit (Buffer buffer, Pool pool, va_list args) +static Res SNCBufInit(Buffer buffer, Pool pool, ArgList args) { SNCBuf sncbuf; Res res;