aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
authorRichard Brooksby2013-05-08 23:00:00 +0100
committerRichard Brooksby2013-05-08 23:00:00 +0100
commitd512863efb817f0d46468f0449ecceb4d9554adf (patch)
treed9077d711adb992ee5d823deef05039121d6714d /mps/code
parent71b7e4f70a710acc666bbdf55502c1ef66c76a09 (diff)
downloademacs-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.c12
-rw-r--r--mps/code/arenacl.c14
-rw-r--r--mps/code/arenavm.c12
-rw-r--r--mps/code/mpmst.h1
-rw-r--r--mps/code/mpmtypes.h3
-rw-r--r--mps/code/mpsi.c28
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
51static 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
184static 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
449static 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
116typedef void (*ArenaVarargsMethod)(ArgStruct args[], va_list varargs);
116typedef Res (*ArenaInitMethod)(Arena *arenaReturn, 117typedef Res (*ArenaInitMethod)(Arena *arenaReturn,
117 ArenaClass class, mps_arg_s args[]); 118 ArenaClass class, ArgList args);
118typedef void (*ArenaFinishMethod)(Arena arena); 119typedef void (*ArenaFinishMethod)(Arena arena);
119typedef Size (*ArenaReservedMethod)(Arena arena); 120typedef Size (*ArenaReservedMethod)(Arena arena);
120typedef void (*ArenaSpareCommitExceededMethod)(Arena arena); 121typedef 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
333mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o, 329mps_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);