diff options
| author | Richard Brooksby | 2013-05-09 18:25:53 +0100 |
|---|---|---|
| committer | Richard Brooksby | 2013-05-09 18:25:53 +0100 |
| commit | 688b5bf73d7462c8c2fabba7345d689c9aff2f21 (patch) | |
| tree | 7bf9792425b1cf20f6760a4a840db19f7153f829 /mps/code/buffer.c | |
| parent | af44d1241f83f6e0dd5a1309d68905cf128bd444 (diff) | |
| download | emacs-688b5bf73d7462c8c2fabba7345d689c9aff2f21.tar.gz emacs-688b5bf73d7462c8c2fabba7345d689c9aff2f21.zip | |
Converting varags on buffer and ap creation into keyword argument lists.
Copied from Perforce
Change: 181680
ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code/buffer.c')
| -rw-r--r-- | mps/code/buffer.c | 74 |
1 files changed, 42 insertions, 32 deletions
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) | |||
| 191 | } | 191 | } |
| 192 | 192 | ||
| 193 | 193 | ||
| 194 | /* BufferInitV -- initialize an allocation buffer */ | 194 | /* BufferInit -- initialize an allocation buffer */ |
| 195 | 195 | ||
| 196 | static Res BufferInitV(Buffer buffer, BufferClass class, | 196 | static Res BufferInit(Buffer buffer, BufferClass class, |
| 197 | Pool pool, Bool isMutator, va_list args) | 197 | Pool pool, Bool isMutator, ArgList args) |
| 198 | { | 198 | { |
| 199 | Arena arena; | 199 | Arena arena; |
| 200 | Res res; | 200 | Res res; |
| @@ -266,24 +266,7 @@ failInit: | |||
| 266 | * See <design/buffer/#method.create>. */ | 266 | * See <design/buffer/#method.create>. */ |
| 267 | 267 | ||
| 268 | Res BufferCreate(Buffer *bufferReturn, BufferClass class, | 268 | Res BufferCreate(Buffer *bufferReturn, BufferClass class, |
| 269 | Pool pool, Bool isMutator, ...) | 269 | Pool pool, Bool isMutator, ArgList args) |
| 270 | { | ||
| 271 | Res res; | ||
| 272 | va_list args; | ||
| 273 | |||
| 274 | va_start(args, isMutator); | ||
| 275 | res = BufferCreateV(bufferReturn, class, pool, isMutator, args); | ||
| 276 | va_end(args); | ||
| 277 | return res; | ||
| 278 | } | ||
| 279 | |||
| 280 | |||
| 281 | /* BufferCreateV -- create an allocation buffer, with varargs | ||
| 282 | * | ||
| 283 | * See <design/buffer/#method.create>. */ | ||
| 284 | |||
| 285 | Res BufferCreateV(Buffer *bufferReturn, BufferClass class, | ||
| 286 | Pool pool, Bool isMutator, va_list args) | ||
| 287 | { | 270 | { |
| 288 | Res res; | 271 | Res res; |
| 289 | Buffer buffer; | 272 | Buffer buffer; |
| @@ -304,7 +287,7 @@ Res BufferCreateV(Buffer *bufferReturn, BufferClass class, | |||
| 304 | buffer = p; | 287 | buffer = p; |
| 305 | 288 | ||
| 306 | /* Initialize the buffer descriptor structure. */ | 289 | /* Initialize the buffer descriptor structure. */ |
| 307 | res = BufferInitV(buffer, class, pool, isMutator, args); | 290 | res = BufferInit(buffer, class, pool, isMutator, args); |
| 308 | if (res != ResOK) | 291 | if (res != ResOK) |
| 309 | goto failInit; | 292 | goto failInit; |
| 310 | 293 | ||
| @@ -1081,11 +1064,20 @@ void BufferRampReset(Buffer buffer) | |||
| 1081 | /* BufferClass -- support for the basic Buffer class */ | 1064 | /* BufferClass -- support for the basic Buffer class */ |
| 1082 | 1065 | ||
| 1083 | 1066 | ||
| 1067 | /* bufferTrivVarargs -- basic buffer varargs method */ | ||
| 1068 | |||
| 1069 | static void bufferTrivVarargs(ArgStruct args[], va_list varargs) { | ||
| 1070 | UNUSED(varargs); | ||
| 1071 | args[0].key = MPS_KEY_ARGS_END; | ||
| 1072 | AVER(ArgListCheck(args)); | ||
| 1073 | } | ||
| 1074 | |||
| 1075 | |||
| 1084 | /* bufferTrivInit -- basic buffer init method */ | 1076 | /* bufferTrivInit -- basic buffer init method */ |
| 1085 | 1077 | ||
| 1086 | static Res bufferTrivInit (Buffer buffer, Pool pool, va_list args) | 1078 | static Res bufferTrivInit(Buffer buffer, Pool pool, ArgList args) |
| 1087 | { | 1079 | { |
| 1088 | /* initialization happens in BufferInitV so checks are safe */ | 1080 | /* initialization happens in BufferInit so checks are safe */ |
| 1089 | AVERT(Buffer, buffer); | 1081 | AVERT(Buffer, buffer); |
| 1090 | AVERT(Pool, pool); | 1082 | AVERT(Pool, pool); |
| 1091 | UNUSED(args); | 1083 | UNUSED(args); |
| @@ -1096,7 +1088,7 @@ static Res bufferTrivInit (Buffer buffer, Pool pool, va_list args) | |||
| 1096 | 1088 | ||
| 1097 | /* bufferTrivFinish -- basic buffer finish method */ | 1089 | /* bufferTrivFinish -- basic buffer finish method */ |
| 1098 | 1090 | ||
| 1099 | static void bufferTrivFinish (Buffer buffer) | 1091 | static void bufferTrivFinish(Buffer buffer) |
| 1100 | { | 1092 | { |
| 1101 | /* No special finish for simple buffers */ | 1093 | /* No special finish for simple buffers */ |
| 1102 | AVERT(Buffer, buffer); | 1094 | AVERT(Buffer, buffer); |
| @@ -1136,7 +1128,7 @@ static void bufferTrivDetach(Buffer buffer) | |||
| 1136 | * .noseg: basic buffers don't support segments, so this method should | 1128 | * .noseg: basic buffers don't support segments, so this method should |
| 1137 | * not be called. */ | 1129 | * not be called. */ |
| 1138 | 1130 | ||
| 1139 | static Seg bufferNoSeg (Buffer buffer) | 1131 | static Seg bufferNoSeg(Buffer buffer) |
| 1140 | { | 1132 | { |
| 1141 | AVERT(Buffer, buffer); | 1133 | AVERT(Buffer, buffer); |
| 1142 | NOTREACHED; /* .noseg */ | 1134 | NOTREACHED; /* .noseg */ |
| @@ -1147,7 +1139,7 @@ static Seg bufferNoSeg (Buffer buffer) | |||
| 1147 | 1139 | ||
| 1148 | /* bufferTrivRankSet -- basic BufferRankSet accessor method */ | 1140 | /* bufferTrivRankSet -- basic BufferRankSet accessor method */ |
| 1149 | 1141 | ||
| 1150 | static RankSet bufferTrivRankSet (Buffer buffer) | 1142 | static RankSet bufferTrivRankSet(Buffer buffer) |
| 1151 | { | 1143 | { |
| 1152 | AVERT(Buffer, buffer); | 1144 | AVERT(Buffer, buffer); |
| 1153 | /* vanilla buffers can only have empty rank set */ | 1145 | /* vanilla buffers can only have empty rank set */ |
| @@ -1160,7 +1152,7 @@ static RankSet bufferTrivRankSet (Buffer buffer) | |||
| 1160 | * .norank: basic buffers don't support ranksets, so this method should | 1152 | * .norank: basic buffers don't support ranksets, so this method should |
| 1161 | * not be called. */ | 1153 | * not be called. */ |
| 1162 | 1154 | ||
| 1163 | static void bufferNoSetRankSet (Buffer buffer, RankSet rankset) | 1155 | static void bufferNoSetRankSet(Buffer buffer, RankSet rankset) |
| 1164 | { | 1156 | { |
| 1165 | AVERT(Buffer, buffer); | 1157 | AVERT(Buffer, buffer); |
| 1166 | AVERT(RankSet, rankset); | 1158 | AVERT(RankSet, rankset); |
| @@ -1173,7 +1165,7 @@ static void bufferNoSetRankSet (Buffer buffer, RankSet rankset) | |||
| 1173 | * .noseg: basic buffers don't support attachment to segments, so this | 1165 | * .noseg: basic buffers don't support attachment to segments, so this |
| 1174 | * method should not be called. */ | 1166 | * method should not be called. */ |
| 1175 | 1167 | ||
| 1176 | static void bufferNoReassignSeg (Buffer buffer, Seg seg) | 1168 | static void bufferNoReassignSeg(Buffer buffer, Seg seg) |
| 1177 | { | 1169 | { |
| 1178 | AVERT(Buffer, buffer); | 1170 | AVERT(Buffer, buffer); |
| 1179 | AVERT(Seg, seg); | 1171 | AVERT(Seg, seg); |
| @@ -1199,6 +1191,7 @@ Bool BufferClassCheck(BufferClass class) | |||
| 1199 | CHECKL(ProtocolClassCheck(&class->protocol)); | 1191 | CHECKL(ProtocolClassCheck(&class->protocol)); |
| 1200 | CHECKL(class->name != NULL); /* Should be <=6 char C identifier */ | 1192 | CHECKL(class->name != NULL); /* Should be <=6 char C identifier */ |
| 1201 | CHECKL(class->size >= sizeof(BufferStruct)); | 1193 | CHECKL(class->size >= sizeof(BufferStruct)); |
| 1194 | CHECKL(FUNCHECK(class->varargs)); | ||
| 1202 | CHECKL(FUNCHECK(class->init)); | 1195 | CHECKL(FUNCHECK(class->init)); |
| 1203 | CHECKL(FUNCHECK(class->finish)); | 1196 | CHECKL(FUNCHECK(class->finish)); |
| 1204 | CHECKL(FUNCHECK(class->attach)); | 1197 | CHECKL(FUNCHECK(class->attach)); |
| @@ -1222,6 +1215,7 @@ DEFINE_CLASS(BufferClass, class) | |||
| 1222 | INHERIT_CLASS(&class->protocol, ProtocolClass); | 1215 | INHERIT_CLASS(&class->protocol, ProtocolClass); |
| 1223 | class->name = "BUFFER"; | 1216 | class->name = "BUFFER"; |
| 1224 | class->size = sizeof(BufferStruct); | 1217 | class->size = sizeof(BufferStruct); |
| 1218 | class->varargs = bufferTrivVarargs; | ||
| 1225 | class->init = bufferTrivInit; | 1219 | class->init = bufferTrivInit; |
| 1226 | class->finish = bufferTrivFinish; | 1220 | class->finish = bufferTrivFinish; |
| 1227 | class->attach = bufferTrivAttach; | 1221 | class->attach = bufferTrivAttach; |
| @@ -1278,7 +1272,7 @@ Bool SegBufCheck(SegBuf segbuf) | |||
| 1278 | 1272 | ||
| 1279 | /* segBufInit -- SegBuf init method */ | 1273 | /* segBufInit -- SegBuf init method */ |
| 1280 | 1274 | ||
| 1281 | static Res segBufInit (Buffer buffer, Pool pool, va_list args) | 1275 | static Res segBufInit(Buffer buffer, Pool pool, ArgList args) |
| 1282 | { | 1276 | { |
| 1283 | BufferClass super; | 1277 | BufferClass super; |
| 1284 | SegBuf segbuf; | 1278 | SegBuf segbuf; |
| @@ -1490,16 +1484,31 @@ DEFINE_CLASS(SegBufClass, class) | |||
| 1490 | /* RankBufClass -- support for the RankBufClass subclass */ | 1484 | /* RankBufClass -- support for the RankBufClass subclass */ |
| 1491 | 1485 | ||
| 1492 | 1486 | ||
| 1487 | /* rankBufVarargs -- parse obsolete varargs into keywords */ | ||
| 1488 | |||
| 1489 | static void rankBufVarargs(ArgStruct args[], va_list varargs) | ||
| 1490 | { | ||
| 1491 | args[0].key = MPS_KEY_RANK; | ||
| 1492 | args[0].val.rank = va_arg(varargs, Rank); | ||
| 1493 | args[1].key = MPS_KEY_ARGS_END; | ||
| 1494 | AVER(ArgListCheck(args)); | ||
| 1495 | } | ||
| 1496 | |||
| 1497 | |||
| 1493 | /* rankBufInit -- RankBufClass init method */ | 1498 | /* rankBufInit -- RankBufClass init method */ |
| 1494 | 1499 | ||
| 1495 | static Res rankBufInit (Buffer buffer, Pool pool, va_list args) | 1500 | static Res rankBufInit(Buffer buffer, Pool pool, ArgList args) |
| 1496 | { | 1501 | { |
| 1497 | Rank rank = va_arg(args, Rank); | 1502 | Rank rank; |
| 1498 | BufferClass super; | 1503 | BufferClass super; |
| 1499 | Res res; | 1504 | Res res; |
| 1505 | ArgStruct arg; | ||
| 1500 | 1506 | ||
| 1501 | AVERT(Buffer, buffer); | 1507 | AVERT(Buffer, buffer); |
| 1502 | AVERT(Pool, pool); | 1508 | AVERT(Pool, pool); |
| 1509 | AVER(ArgListCheck(args)); | ||
| 1510 | ArgRequire(&arg, args, MPS_KEY_RANK); | ||
| 1511 | rank = arg.val.rank; | ||
| 1503 | AVER(RankCheck(rank)); | 1512 | AVER(RankCheck(rank)); |
| 1504 | 1513 | ||
| 1505 | /* Initialize the superclass fields first via next-method call */ | 1514 | /* Initialize the superclass fields first via next-method call */ |
| @@ -1528,6 +1537,7 @@ DEFINE_CLASS(RankBufClass, class) | |||
| 1528 | { | 1537 | { |
| 1529 | INHERIT_CLASS(class, SegBufClass); | 1538 | INHERIT_CLASS(class, SegBufClass); |
| 1530 | class->name = "RANKBUF"; | 1539 | class->name = "RANKBUF"; |
| 1540 | class->varargs = rankBufVarargs; | ||
| 1531 | class->init = rankBufInit; | 1541 | class->init = rankBufInit; |
| 1532 | } | 1542 | } |
| 1533 | 1543 | ||