diff options
| author | Richard Brooksby | 2013-05-08 23:00:00 +0100 |
|---|---|---|
| committer | Richard Brooksby | 2013-05-08 23:00:00 +0100 |
| commit | d512863efb817f0d46468f0449ecceb4d9554adf (patch) | |
| tree | d9077d711adb992ee5d823deef05039121d6714d /mps/code | |
| parent | 71b7e4f70a710acc666bbdf55502c1ef66c76a09 (diff) | |
| download | emacs-d512863efb817f0d46468f0449ecceb4d9554adf.tar.gz emacs-d512863efb817f0d46468f0449ecceb4d9554adf.zip | |
Moving arena varags parsing into arena class method, similar to pools. much simpler. all tests pass.
Copied from Perforce
Change: 181643
ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
| -rw-r--r-- | mps/code/arena.c | 12 | ||||
| -rw-r--r-- | mps/code/arenacl.c | 14 | ||||
| -rw-r--r-- | mps/code/arenavm.c | 12 | ||||
| -rw-r--r-- | mps/code/mpmst.h | 1 | ||||
| -rw-r--r-- | mps/code/mpmtypes.h | 3 | ||||
| -rw-r--r-- | mps/code/mpsi.c | 28 |
6 files changed, 46 insertions, 24 deletions
diff --git a/mps/code/arena.c b/mps/code/arena.c index b8397c4dfc3..e114b675173 100644 --- a/mps/code/arena.c +++ b/mps/code/arena.c | |||
| @@ -46,6 +46,16 @@ static Res ArenaTrivDescribe(Arena arena, mps_lib_FILE *stream) | |||
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | 48 | ||
| 49 | /* ArenaTrivVarargs -- ignore obsolete varargs for future arena classes */ | ||
| 50 | |||
| 51 | static void ArenaTrivVarargs(ArgStruct args[], va_list varargs) | ||
| 52 | { | ||
| 53 | UNUSED(varargs); | ||
| 54 | args[0].key = MPS_KEY_ARGS_END; | ||
| 55 | AVER(ArgListCheck(args)); | ||
| 56 | } | ||
| 57 | |||
| 58 | |||
| 49 | /* AbstractArenaClass -- The abstract arena class definition | 59 | /* AbstractArenaClass -- The abstract arena class definition |
| 50 | * | 60 | * |
| 51 | * .null: Most abstract class methods are set to NULL. See | 61 | * .null: Most abstract class methods are set to NULL. See |
| @@ -59,6 +69,7 @@ DEFINE_CLASS(AbstractArenaClass, class) | |||
| 59 | class->name = "ABSARENA"; | 69 | class->name = "ABSARENA"; |
| 60 | class->size = 0; | 70 | class->size = 0; |
| 61 | class->offset = 0; | 71 | class->offset = 0; |
| 72 | class->varargs = ArenaTrivVarargs; | ||
| 62 | class->init = NULL; | 73 | class->init = NULL; |
| 63 | class->finish = NULL; | 74 | class->finish = NULL; |
| 64 | class->reserved = NULL; | 75 | class->reserved = NULL; |
| @@ -85,6 +96,7 @@ Bool ArenaClassCheck(ArenaClass class) | |||
| 85 | /* greater than the size of the class-specific portion of the */ | 96 | /* greater than the size of the class-specific portion of the */ |
| 86 | /* instance. */ | 97 | /* instance. */ |
| 87 | CHECKL(class->offset <= (size_t)(class->size - sizeof(ArenaStruct))); | 98 | CHECKL(class->offset <= (size_t)(class->size - sizeof(ArenaStruct))); |
| 99 | CHECKL(FUNCHECK(class->varargs)); | ||
| 88 | CHECKL(FUNCHECK(class->init)); | 100 | CHECKL(FUNCHECK(class->init)); |
| 89 | CHECKL(FUNCHECK(class->finish)); | 101 | CHECKL(FUNCHECK(class->finish)); |
| 90 | CHECKL(FUNCHECK(class->reserved)); | 102 | CHECKL(FUNCHECK(class->reserved)); |
diff --git a/mps/code/arenacl.c b/mps/code/arenacl.c index 96a7e93232d..a8627f22497 100644 --- a/mps/code/arenacl.c +++ b/mps/code/arenacl.c | |||
| @@ -179,6 +179,19 @@ static void ClientChunkFinish(Chunk chunk) | |||
| 179 | } | 179 | } |
| 180 | 180 | ||
| 181 | 181 | ||
| 182 | /* ClientArenaVarargs -- parse obsolete varargs */ | ||
| 183 | |||
| 184 | static void ClientArenaVarargs(ArgStruct args[], va_list varargs) | ||
| 185 | { | ||
| 186 | args[0].key = MPS_KEY_ARENA_SIZE; | ||
| 187 | args[0].val.size = va_arg(varargs, Size); | ||
| 188 | args[1].key = MPS_KEY_ARENA_CL_ADDR; | ||
| 189 | args[1].val.addr = va_arg(varargs, Addr); | ||
| 190 | args[2].key = MPS_KEY_ARGS_END; | ||
| 191 | AVER(ArgListCheck(args)); | ||
| 192 | } | ||
| 193 | |||
| 194 | |||
| 182 | /* ClientArenaInit -- create and initialize the client arena | 195 | /* ClientArenaInit -- create and initialize the client arena |
| 183 | * | 196 | * |
| 184 | * .init.memory: Creates the arena structure in the chuck given, and | 197 | * .init.memory: Creates the arena structure in the chuck given, and |
| @@ -474,6 +487,7 @@ DEFINE_ARENA_CLASS(ClientArenaClass, this) | |||
| 474 | this->name = "CL"; | 487 | this->name = "CL"; |
| 475 | this->size = sizeof(ClientArenaStruct); | 488 | this->size = sizeof(ClientArenaStruct); |
| 476 | this->offset = offsetof(ClientArenaStruct, arenaStruct); | 489 | this->offset = offsetof(ClientArenaStruct, arenaStruct); |
| 490 | this->varargs = ClientArenaVarargs; | ||
| 477 | this->init = ClientArenaInit; | 491 | this->init = ClientArenaInit; |
| 478 | this->finish = ClientArenaFinish; | 492 | this->finish = ClientArenaFinish; |
| 479 | this->reserved = ClientArenaReserved; | 493 | this->reserved = ClientArenaReserved; |
diff --git a/mps/code/arenavm.c b/mps/code/arenavm.c index 3bd6e16ecc7..0bb83500f25 100644 --- a/mps/code/arenavm.c +++ b/mps/code/arenavm.c | |||
| @@ -444,6 +444,17 @@ static void VMChunkFinish(Chunk chunk) | |||
| 444 | } | 444 | } |
| 445 | 445 | ||
| 446 | 446 | ||
| 447 | /* VMArenaVarargs -- parse obsolete varargs */ | ||
| 448 | |||
| 449 | static void VMArenaVarargs(ArgStruct args[], va_list varargs) | ||
| 450 | { | ||
| 451 | args[0].key = MPS_KEY_ARENA_SIZE; | ||
| 452 | args[0].val.size = va_arg(varargs, Size); | ||
| 453 | args[1].key = MPS_KEY_ARGS_END; | ||
| 454 | AVER(ArgListCheck(args)); | ||
| 455 | } | ||
| 456 | |||
| 457 | |||
| 447 | /* VMArenaInit -- create and initialize the VM arena | 458 | /* VMArenaInit -- create and initialize the VM arena |
| 448 | * | 459 | * |
| 449 | * .arena.init: Once the arena has been allocated, we call ArenaInit | 460 | * .arena.init: Once the arena has been allocated, we call ArenaInit |
| @@ -1798,6 +1809,7 @@ DEFINE_ARENA_CLASS(VMArenaClass, this) | |||
| 1798 | this->name = "VM"; | 1809 | this->name = "VM"; |
| 1799 | this->size = sizeof(VMArenaStruct); | 1810 | this->size = sizeof(VMArenaStruct); |
| 1800 | this->offset = offsetof(VMArenaStruct, arenaStruct); | 1811 | this->offset = offsetof(VMArenaStruct, arenaStruct); |
| 1812 | this->varargs = VMArenaVarargs; | ||
| 1801 | this->init = VMArenaInit; | 1813 | this->init = VMArenaInit; |
| 1802 | this->finish = VMArenaFinish; | 1814 | this->finish = VMArenaFinish; |
| 1803 | this->reserved = VMArenaReserved; | 1815 | this->reserved = VMArenaReserved; |
diff --git a/mps/code/mpmst.h b/mps/code/mpmst.h index 93eda47809d..1b66ddd3194 100644 --- a/mps/code/mpmst.h +++ b/mps/code/mpmst.h | |||
| @@ -536,6 +536,7 @@ typedef struct mps_arena_class_s { | |||
| 536 | char *name; /* class name string */ | 536 | char *name; /* class name string */ |
| 537 | size_t size; /* size of outer structure */ | 537 | size_t size; /* size of outer structure */ |
| 538 | size_t offset; /* offset of generic struct in outer struct */ | 538 | size_t offset; /* offset of generic struct in outer struct */ |
| 539 | ArenaVarargsMethod varargs; | ||
| 539 | ArenaInitMethod init; | 540 | ArenaInitMethod init; |
| 540 | ArenaFinishMethod finish; | 541 | ArenaFinishMethod finish; |
| 541 | ArenaReservedMethod reserved; | 542 | ArenaReservedMethod reserved; |
diff --git a/mps/code/mpmtypes.h b/mps/code/mpmtypes.h index 587dd3dbb76..e74dcefae67 100644 --- a/mps/code/mpmtypes.h +++ b/mps/code/mpmtypes.h | |||
| @@ -113,8 +113,9 @@ typedef struct StackContextStruct *StackContext; | |||
| 113 | 113 | ||
| 114 | /* Arena*Method -- see <code/mpmst.h#ArenaClassStruct> */ | 114 | /* Arena*Method -- see <code/mpmst.h#ArenaClassStruct> */ |
| 115 | 115 | ||
| 116 | typedef void (*ArenaVarargsMethod)(ArgStruct args[], va_list varargs); | ||
| 116 | typedef Res (*ArenaInitMethod)(Arena *arenaReturn, | 117 | typedef Res (*ArenaInitMethod)(Arena *arenaReturn, |
| 117 | ArenaClass class, mps_arg_s args[]); | 118 | ArenaClass class, ArgList args); |
| 118 | typedef void (*ArenaFinishMethod)(Arena arena); | 119 | typedef void (*ArenaFinishMethod)(Arena arena); |
| 119 | typedef Size (*ArenaReservedMethod)(Arena arena); | 120 | typedef Size (*ArenaReservedMethod)(Arena arena); |
| 120 | typedef void (*ArenaSpareCommitExceededMethod)(Arena arena); | 121 | typedef void (*ArenaSpareCommitExceededMethod)(Arena arena); |
diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c index 2efa608389d..08797c6e46a 100644 --- a/mps/code/mpsi.c +++ b/mps/code/mpsi.c | |||
| @@ -324,35 +324,16 @@ mps_res_t mps_arena_create(mps_arena_t *mps_arena_o, | |||
| 324 | } | 324 | } |
| 325 | 325 | ||
| 326 | 326 | ||
| 327 | /* mps_arena_create_v -- create an arena object | 327 | /* mps_arena_create_v -- create an arena object */ |
| 328 | * | ||
| 329 | * TODO: Decode deprecated varargs. This code can be removed when varargs | ||
| 330 | * support is dropped. | ||
| 331 | */ | ||
| 332 | 328 | ||
| 333 | mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o, | 329 | mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o, |
| 334 | mps_arena_class_t arena_class, | 330 | mps_arena_class_t arena_class, |
| 335 | va_list varargs) | 331 | va_list varargs) |
| 336 | { | 332 | { |
| 337 | mps_arg_s args[3]; | 333 | mps_arg_s args[16]; /* FIXME: Have a maximum in config.h */ |
| 338 | 334 | AVERT(ArenaClass, arena_class); | |
| 339 | /* Decode deprecated varargs. */ | 335 | arena_class->varargs(args, varargs); |
| 340 | if (arena_class == mps_arena_class_cl()) { | ||
| 341 | args[0].key = MPS_KEY_ARENA_SIZE; | ||
| 342 | args[0].val.size = va_arg(varargs, Size); | ||
| 343 | args[1].key = MPS_KEY_ARENA_CL_ADDR; | ||
| 344 | args[1].val.addr = va_arg(varargs, Addr); | ||
| 345 | args[2].key = MPS_KEY_ARGS_END; | ||
| 346 | } else if (arena_class == mps_arena_class_vm()) { | ||
| 347 | args[0].key = MPS_KEY_ARENA_SIZE; | ||
| 348 | args[0].val.size = va_arg(varargs, Size); | ||
| 349 | args[1].key = MPS_KEY_ARGS_END; | ||
| 350 | } else { | ||
| 351 | /* TODO: Could take args list for forward compatibility. */ | ||
| 352 | args[0].key = MPS_KEY_ARGS_END; | ||
| 353 | } | ||
| 354 | va_end(varargs); | 336 | va_end(varargs); |
| 355 | |||
| 356 | return mps_arena_create_args(mps_arena_o, arena_class, args); | 337 | return mps_arena_create_args(mps_arena_o, arena_class, args); |
| 357 | } | 338 | } |
| 358 | 339 | ||
| @@ -654,6 +635,7 @@ mps_res_t mps_pool_create_v(mps_pool_t *mps_pool_o, mps_arena_t arena, | |||
| 654 | mps_class_t class, va_list varargs) | 635 | mps_class_t class, va_list varargs) |
| 655 | { | 636 | { |
| 656 | mps_arg_s args[16]; /* FIXME: Have a maximum in config.h */ | 637 | mps_arg_s args[16]; /* FIXME: Have a maximum in config.h */ |
| 638 | AVERT(PoolClass, class); | ||
| 657 | class->varargs(args, varargs); | 639 | class->varargs(args, varargs); |
| 658 | va_end(varargs); | 640 | va_end(varargs); |
| 659 | return mps_pool_create_k(mps_pool_o, arena, class, args); | 641 | return mps_pool_create_k(mps_pool_o, arena, class, args); |