From 688b5bf73d7462c8c2fabba7345d689c9aff2f21 Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Thu, 9 May 2013 18:25:53 +0100 Subject: Converting varags on buffer and ap creation into keyword argument lists. Copied from Perforce Change: 181680 ServerID: perforce.ravenbrook.com --- mps/code/buffer.c | 74 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 32 deletions(-) (limited to 'mps/code/buffer.c') 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; } -- cgit v1.2.1