diff options
| author | Richard Brooksby | 2013-05-02 17:55:07 +0100 |
|---|---|---|
| committer | Richard Brooksby | 2013-05-02 17:55:07 +0100 |
| commit | 1bc62b27ef66fc2fea1d4d83648ea0176708d83e (patch) | |
| tree | c941ecbf6f5e461a73c2f4fe486220129d0b8b5a /mps/code | |
| parent | 8d00f8dbefd79df749527f66315b445bf1c94070 (diff) | |
| download | emacs-1bc62b27ef66fc2fea1d4d83648ea0176708d83e.tar.gz emacs-1bc62b27ef66fc2fea1d4d83648ea0176708d83e.zip | |
First draft of keyword arguments. mainly checking in in order to try working with git fusion on this branch.
Copied from Perforce
Change: 181538
ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code')
| -rw-r--r-- | mps/code/arena.c | 5 | ||||
| -rw-r--r-- | mps/code/arenacl.c | 31 | ||||
| -rw-r--r-- | mps/code/arenacv.c | 2 | ||||
| -rw-r--r-- | mps/code/arenavm.c | 19 | ||||
| -rw-r--r-- | mps/code/arg.c | 126 | ||||
| -rw-r--r-- | mps/code/mpm.h | 12 | ||||
| -rw-r--r-- | mps/code/mpmtypes.h | 7 | ||||
| -rw-r--r-- | mps/code/mps.c | 1 | ||||
| -rw-r--r-- | mps/code/mps.h | 33 | ||||
| -rw-r--r-- | mps/code/mps.xcodeproj/project.pbxproj | 4 | ||||
| -rw-r--r-- | mps/code/mpsacl.h | 3 | ||||
| -rw-r--r-- | mps/code/mpsi.c | 43 | ||||
| -rw-r--r-- | mps/code/vmix.c | 7 |
13 files changed, 271 insertions, 22 deletions
diff --git a/mps/code/arena.c b/mps/code/arena.c index 1273502968d..904ed0701ac 100644 --- a/mps/code/arena.c +++ b/mps/code/arena.c | |||
| @@ -205,15 +205,16 @@ failGlobalsInit: | |||
| 205 | } | 205 | } |
| 206 | 206 | ||
| 207 | 207 | ||
| 208 | /* ArenaCreateV -- create the arena and call initializers */ | 208 | /* ArenaCreate -- create the arena and call initializers */ |
| 209 | 209 | ||
| 210 | Res ArenaCreateV(Arena *arenaReturn, ArenaClass class, va_list args) | 210 | Res ArenaCreate(Arena *arenaReturn, ArenaClass class, ArgList args) |
| 211 | { | 211 | { |
| 212 | Arena arena; | 212 | Arena arena; |
| 213 | Res res; | 213 | Res res; |
| 214 | 214 | ||
| 215 | AVER(arenaReturn != NULL); | 215 | AVER(arenaReturn != NULL); |
| 216 | AVERT(ArenaClass, class); | 216 | AVERT(ArenaClass, class); |
| 217 | AVER(ArgListCheck(args)); | ||
| 217 | 218 | ||
| 218 | /* We must initialise the event subsystem very early, because event logging | 219 | /* We must initialise the event subsystem very early, because event logging |
| 219 | will start as soon as anything interesting happens and expect to write | 220 | will start as soon as anything interesting happens and expect to write |
diff --git a/mps/code/arenacl.c b/mps/code/arenacl.c index d76a6d9a485..bfe640bfc05 100644 --- a/mps/code/arenacl.c +++ b/mps/code/arenacl.c | |||
| @@ -186,8 +186,7 @@ static void ClientChunkFinish(Chunk chunk) | |||
| 186 | * .arena.init: Once the arena has been allocated, we call ArenaInit | 186 | * .arena.init: Once the arena has been allocated, we call ArenaInit |
| 187 | * to do the generic part of init. | 187 | * to do the generic part of init. |
| 188 | */ | 188 | */ |
| 189 | static Res ClientArenaInit(Arena *arenaReturn, ArenaClass class, | 189 | static Res ClientArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args) |
| 190 | va_list args) | ||
| 191 | { | 190 | { |
| 192 | Arena arena; | 191 | Arena arena; |
| 193 | ClientArena clientArena; | 192 | ClientArena clientArena; |
| @@ -196,11 +195,32 @@ static Res ClientArenaInit(Arena *arenaReturn, ArenaClass class, | |||
| 196 | Addr base, limit, chunkBase; | 195 | Addr base, limit, chunkBase; |
| 197 | Res res; | 196 | Res res; |
| 198 | Chunk chunk; | 197 | Chunk chunk; |
| 199 | 198 | mps_arg_s arg; | |
| 200 | size = va_arg(args, Size); | 199 | |
| 201 | base = va_arg(args, Addr); | ||
| 202 | AVER(arenaReturn != NULL); | 200 | AVER(arenaReturn != NULL); |
| 203 | AVER((ArenaClass)mps_arena_class_cl() == class); | 201 | AVER((ArenaClass)mps_arena_class_cl() == class); |
| 202 | AVER(ArgListCheck(args)); | ||
| 203 | |||
| 204 | if (ArgPick(&arg, args, MPS_KEY_ARENA_SIZE)) { | ||
| 205 | size = arg.val.size; | ||
| 206 | if (ArgPick(&arg, args, MPS_KEY_ARENA_CL_ADDR)) | ||
| 207 | base = arg.val.addr; | ||
| 208 | else { | ||
| 209 | res = ResPARAM; | ||
| 210 | goto failParam; | ||
| 211 | } | ||
| 212 | } else if (ArgPick(&arg, args, MPS_KEY_VARARGS)) { | ||
| 213 | if (ArgPick(&arg, args, MPS_KEY_ARENA_CL_ADDR)) { | ||
| 214 | res = ResPARAM; | ||
| 215 | goto failParam; | ||
| 216 | } | ||
| 217 | size = va_arg(arg.val.varargs, Size); | ||
| 218 | base = va_arg(arg.val.varargs, Addr); | ||
| 219 | } else { | ||
| 220 | res = ResPARAM; | ||
| 221 | goto failParam; | ||
| 222 | } | ||
| 223 | |||
| 204 | AVER(base != (Addr)0); | 224 | AVER(base != (Addr)0); |
| 205 | 225 | ||
| 206 | clArenaSize = SizeAlignUp(sizeof(ClientArenaStruct), MPS_PF_ALIGN); | 226 | clArenaSize = SizeAlignUp(sizeof(ClientArenaStruct), MPS_PF_ALIGN); |
| @@ -243,6 +263,7 @@ static Res ClientArenaInit(Arena *arenaReturn, ArenaClass class, | |||
| 243 | 263 | ||
| 244 | failChunkCreate: | 264 | failChunkCreate: |
| 245 | ArenaFinish(arena); | 265 | ArenaFinish(arena); |
| 266 | failParam: | ||
| 246 | return res; | 267 | return res; |
| 247 | } | 268 | } |
| 248 | 269 | ||
diff --git a/mps/code/arenacv.c b/mps/code/arenacv.c index 5055cf421a6..7228ea80ee7 100644 --- a/mps/code/arenacv.c +++ b/mps/code/arenacv.c | |||
| @@ -340,7 +340,7 @@ static void testPageTable(ArenaClass class, ...) | |||
| 340 | va_list args; | 340 | va_list args; |
| 341 | 341 | ||
| 342 | va_start(args, class); | 342 | va_start(args, class); |
| 343 | die(ArenaCreateV(&arena, class, args), "ArenaCreate"); | 343 | die(ArenaCreate(&arena, class, args), "ArenaCreate"); |
| 344 | va_end(args); | 344 | va_end(args); |
| 345 | 345 | ||
| 346 | die(PoolCreate(&pool, arena, PoolClassMV(), | 346 | die(PoolCreate(&pool, arena, PoolClassMV(), |
diff --git a/mps/code/arenavm.c b/mps/code/arenavm.c index ca2188c04b1..b0c2d732dc1 100644 --- a/mps/code/arenavm.c +++ b/mps/code/arenavm.c | |||
| @@ -445,7 +445,7 @@ static void VMChunkFinish(Chunk chunk) | |||
| 445 | * .arena.init: Once the arena has been allocated, we call ArenaInit | 445 | * .arena.init: Once the arena has been allocated, we call ArenaInit |
| 446 | * to do the generic part of init. | 446 | * to do the generic part of init. |
| 447 | */ | 447 | */ |
| 448 | static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, va_list args) | 448 | static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, ArgList args) |
| 449 | { | 449 | { |
| 450 | Size userSize; /* size requested by user */ | 450 | Size userSize; /* size requested by user */ |
| 451 | Size chunkSize; /* size actually created */ | 451 | Size chunkSize; /* size actually created */ |
| @@ -456,15 +456,26 @@ static Res VMArenaInit(Arena *arenaReturn, ArenaClass class, va_list args) | |||
| 456 | Index gen; | 456 | Index gen; |
| 457 | VM arenaVM; | 457 | VM arenaVM; |
| 458 | Chunk chunk; | 458 | Chunk chunk; |
| 459 | 459 | mps_arg_s arg; | |
| 460 | userSize = va_arg(args, Size); | 460 | |
| 461 | AVER(arenaReturn != NULL); | 461 | AVER(arenaReturn != NULL); |
| 462 | AVER(class == VMArenaClassGet() || class == VMNZArenaClassGet()); | 462 | AVER(class == VMArenaClassGet() || class == VMNZArenaClassGet()); |
| 463 | AVER(ArgListCheck(args)); | ||
| 464 | |||
| 465 | if (ArgPick(&arg, args, MPS_KEY_ARENA_SIZE)) | ||
| 466 | userSize = arg.val.size; | ||
| 467 | else if (ArgPick(&arg, args, MPS_KEY_VARARGS)) | ||
| 468 | userSize = va_arg(arg.val.varargs, Size); | ||
| 469 | else { | ||
| 470 | res = ResPARAM; | ||
| 471 | goto failVMCreate; | ||
| 472 | } | ||
| 473 | |||
| 463 | AVER(userSize > 0); | 474 | AVER(userSize > 0); |
| 464 | 475 | ||
| 465 | /* Create a VM to hold the arena and map it. */ | 476 | /* Create a VM to hold the arena and map it. */ |
| 466 | vmArenaSize = SizeAlignUp(sizeof(VMArenaStruct), MPS_PF_ALIGN); | 477 | vmArenaSize = SizeAlignUp(sizeof(VMArenaStruct), MPS_PF_ALIGN); |
| 467 | res = VMCreate(&arenaVM, vmArenaSize); | 478 | res = VMCreate(&arenaVM, vmArenaSize, args); |
| 468 | if (res != ResOK) | 479 | if (res != ResOK) |
| 469 | goto failVMCreate; | 480 | goto failVMCreate; |
| 470 | res = VMMap(arenaVM, VMBase(arenaVM), VMLimit(arenaVM)); | 481 | res = VMMap(arenaVM, VMBase(arenaVM), VMLimit(arenaVM)); |
diff --git a/mps/code/arg.c b/mps/code/arg.c new file mode 100644 index 00000000000..425bbf6c496 --- /dev/null +++ b/mps/code/arg.c | |||
| @@ -0,0 +1,126 @@ | |||
| 1 | /* arg.c: ARGUMENT LISTS | ||
| 2 | * | ||
| 3 | * $Id: //info.ravenbrook.com/project/mps/custom/cet/main/code/bt.c#1 $ | ||
| 4 | * Copyright (c) 2013 Ravenbrook Limited. See end of file for license. | ||
| 5 | */ | ||
| 6 | |||
| 7 | #include "config.h" | ||
| 8 | #include "check.h" | ||
| 9 | #include "mpm.h" | ||
| 10 | |||
| 11 | SRCID(arg, "$Id$"); | ||
| 12 | |||
| 13 | #define KeySig ((Sig)0x519CE333) /* SIGnature KEYyy */ | ||
| 14 | typedef struct mps_key_s { | ||
| 15 | Sig sig; | ||
| 16 | const char *name; | ||
| 17 | Bool (*check)(Arg arg); | ||
| 18 | } KeyStruct; | ||
| 19 | |||
| 20 | |||
| 21 | static Bool ArgCheckCant(Arg arg) { | ||
| 22 | UNUSED(arg); | ||
| 23 | return TRUE; | ||
| 24 | } | ||
| 25 | |||
| 26 | const KeyStruct _mps_key_varargs = {KeySig, "VARARGS", ArgCheckCant}; | ||
| 27 | |||
| 28 | |||
| 29 | /* KeyCheck -- check the validity of an argument key */ | ||
| 30 | |||
| 31 | Bool KeyCheck(Key key) | ||
| 32 | { | ||
| 33 | CHECKS(Key, key); | ||
| 34 | CHECKL(key->name != NULL); | ||
| 35 | CHECKL(FUNCHECK(key->check)); | ||
| 36 | return TRUE; | ||
| 37 | } | ||
| 38 | |||
| 39 | |||
| 40 | Bool ArgCheck(Arg arg) | ||
| 41 | { | ||
| 42 | CHECKL(arg != NULL); | ||
| 43 | CHECKD(Key, arg->key); | ||
| 44 | CHECKL(arg->key->check(arg)); | ||
| 45 | return TRUE; | ||
| 46 | } | ||
| 47 | |||
| 48 | |||
| 49 | /* ArgCheck -- check the validity of an argument list */ | ||
| 50 | |||
| 51 | Bool ArgListCheck(ArgList args) | ||
| 52 | { | ||
| 53 | Index i; | ||
| 54 | CHECKL(args != NULL); | ||
| 55 | /* FIXME: Maximum plausible length? */ | ||
| 56 | for (i = 0; args[i].key != MPS_KEY_ARGS_END; ++i) | ||
| 57 | CHECKL(ArgCheck(&args[i])); | ||
| 58 | return TRUE; | ||
| 59 | } | ||
| 60 | |||
| 61 | |||
| 62 | Bool ArgPick(mps_arg_s *argOut, mps_arg_s args[], Key key) { | ||
| 63 | Index i; | ||
| 64 | |||
| 65 | AVER(argOut != NULL); | ||
| 66 | AVERT(Arg, args); | ||
| 67 | AVERT(Key, key); | ||
| 68 | |||
| 69 | for (i = 0; args[i].key != MPS_KEY_ARGS_END; ++i) | ||
| 70 | if (args[i].key == key) | ||
| 71 | goto found; | ||
| 72 | return FALSE; | ||
| 73 | |||
| 74 | found: | ||
| 75 | *argOut = args[i]; | ||
| 76 | for(;;) { | ||
| 77 | args[i] = args[i + 1]; | ||
| 78 | if (args[i].key == MPS_KEY_ARGS_END) | ||
| 79 | break; | ||
| 80 | ++i; | ||
| 81 | } | ||
| 82 | |||
| 83 | return TRUE; | ||
| 84 | } | ||
| 85 | |||
| 86 | |||
| 87 | /* C. COPYRIGHT AND LICENSE | ||
| 88 | * | ||
| 89 | * Copyright (C) 2001-2002 Ravenbrook Limited <http://www.ravenbrook.com/>. | ||
| 90 | * All rights reserved. This is an open source license. Contact | ||
| 91 | * Ravenbrook for commercial licensing options. | ||
| 92 | * | ||
| 93 | * Redistribution and use in source and binary forms, with or without | ||
| 94 | * modification, are permitted provided that the following conditions are | ||
| 95 | * met: | ||
| 96 | * | ||
| 97 | * 1. Redistributions of source code must retain the above copyright | ||
| 98 | * notice, this list of conditions and the following disclaimer. | ||
| 99 | * | ||
| 100 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 101 | * notice, this list of conditions and the following disclaimer in the | ||
| 102 | * documentation and/or other materials provided with the distribution. | ||
| 103 | * | ||
| 104 | * 3. Redistributions in any form must be accompanied by information on how | ||
| 105 | * to obtain complete source code for this software and any accompanying | ||
| 106 | * software that uses this software. The source code must either be | ||
| 107 | * included in the distribution or be available for no more than the cost | ||
| 108 | * of distribution plus a nominal fee, and must be freely redistributable | ||
| 109 | * under reasonable conditions. For an executable file, complete source | ||
| 110 | * code means the source code for all modules it contains. It does not | ||
| 111 | * include source code for modules or files that typically accompany the | ||
| 112 | * major components of the operating system on which the executable file | ||
| 113 | * runs. | ||
| 114 | * | ||
| 115 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | ||
| 116 | * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||
| 117 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR | ||
| 118 | * PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE | ||
| 119 | * COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 120 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 121 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
| 122 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
| 123 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| 124 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
| 125 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 126 | */ | ||
diff --git a/mps/code/mpm.h b/mps/code/mpm.h index 049cbf65343..98e35b54189 100644 --- a/mps/code/mpm.h +++ b/mps/code/mpm.h | |||
| @@ -130,6 +130,14 @@ extern int (AddrComp)(Addr a, Addr b, Size size); | |||
| 130 | extern Bool ResIsAllocFailure(Res res); | 130 | extern Bool ResIsAllocFailure(Res res); |
| 131 | 131 | ||
| 132 | 132 | ||
| 133 | /* Argument Lists */ | ||
| 134 | |||
| 135 | extern Bool KeyCheck(Key key); | ||
| 136 | extern Bool ArgCheck(Arg arg); | ||
| 137 | extern Bool ArgListCheck(ArgList args); | ||
| 138 | extern Bool ArgPick(ArgStruct *argOut, ArgList args, Key key); | ||
| 139 | |||
| 140 | |||
| 133 | /* Logs and Powers | 141 | /* Logs and Powers |
| 134 | * | 142 | * |
| 135 | * SizeIsP2 returns TRUE if and only if size is a non-negative integer | 143 | * SizeIsP2 returns TRUE if and only if size is a non-negative integer |
| @@ -485,7 +493,7 @@ extern AbstractArenaClass AbstractArenaClassGet(void); | |||
| 485 | extern Bool ArenaClassCheck(ArenaClass class); | 493 | extern Bool ArenaClassCheck(ArenaClass class); |
| 486 | 494 | ||
| 487 | extern Bool ArenaCheck(Arena arena); | 495 | extern Bool ArenaCheck(Arena arena); |
| 488 | extern Res ArenaCreateV(Arena *arenaReturn, ArenaClass class, va_list args); | 496 | extern Res ArenaCreate(Arena *arenaReturn, ArenaClass class, mps_arg_s args[]); |
| 489 | extern void ArenaDestroy(Arena arena); | 497 | extern void ArenaDestroy(Arena arena); |
| 490 | extern Res ArenaInit(Arena arena, ArenaClass class); | 498 | extern Res ArenaInit(Arena arena, ArenaClass class); |
| 491 | extern void ArenaFinish(Arena arena); | 499 | extern void ArenaFinish(Arena arena); |
| @@ -966,7 +974,7 @@ extern Res RootsIterate(Globals arena, RootIterateFn f, void *p); | |||
| 966 | 974 | ||
| 967 | extern Align VMAlign(VM vm); | 975 | extern Align VMAlign(VM vm); |
| 968 | extern Bool VMCheck(VM vm); | 976 | extern Bool VMCheck(VM vm); |
| 969 | extern Res VMCreate(VM *VMReturn, Size size); | 977 | extern Res VMCreate(VM *VMReturn, Size size, mps_arg_s args[]); |
| 970 | extern void VMDestroy(VM vm); | 978 | extern void VMDestroy(VM vm); |
| 971 | extern Addr VMBase(VM vm); | 979 | extern Addr VMBase(VM vm); |
| 972 | extern Addr VMLimit(VM vm); | 980 | extern Addr VMLimit(VM vm); |
diff --git a/mps/code/mpmtypes.h b/mps/code/mpmtypes.h index f7cf9a023ea..8df2e91dbb0 100644 --- a/mps/code/mpmtypes.h +++ b/mps/code/mpmtypes.h | |||
| @@ -44,6 +44,11 @@ typedef void *Pointer; /* <design/type/#pointer> */ | |||
| 44 | typedef Word Clock; /* processor time */ | 44 | typedef Word Clock; /* processor time */ |
| 45 | typedef MPS_T_ULONGEST ULongest; /* <design/type/#ulongest> */ | 45 | typedef MPS_T_ULONGEST ULongest; /* <design/type/#ulongest> */ |
| 46 | 46 | ||
| 47 | typedef mps_arg_s ArgStruct; | ||
| 48 | typedef mps_arg_s *Arg; | ||
| 49 | typedef mps_arg_s *ArgList; | ||
| 50 | typedef mps_key_t Key; | ||
| 51 | |||
| 47 | typedef Word RefSet; /* design.mps.refset */ | 52 | typedef Word RefSet; /* design.mps.refset */ |
| 48 | typedef Word ZoneSet; /* design.mps.refset */ | 53 | typedef Word ZoneSet; /* design.mps.refset */ |
| 49 | typedef unsigned Rank; | 54 | typedef unsigned Rank; |
| @@ -109,7 +114,7 @@ typedef struct StackContextStruct *StackContext; | |||
| 109 | /* Arena*Method -- see <code/mpmst.h#ArenaClassStruct> */ | 114 | /* Arena*Method -- see <code/mpmst.h#ArenaClassStruct> */ |
| 110 | 115 | ||
| 111 | typedef Res (*ArenaInitMethod)(Arena *arenaReturn, | 116 | typedef Res (*ArenaInitMethod)(Arena *arenaReturn, |
| 112 | ArenaClass class, va_list args); | 117 | ArenaClass class, mps_arg_s args[]); |
| 113 | typedef void (*ArenaFinishMethod)(Arena arena); | 118 | typedef void (*ArenaFinishMethod)(Arena arena); |
| 114 | typedef Size (*ArenaReservedMethod)(Arena arena); | 119 | typedef Size (*ArenaReservedMethod)(Arena arena); |
| 115 | typedef void (*ArenaSpareCommitExceededMethod)(Arena arena); | 120 | typedef void (*ArenaSpareCommitExceededMethod)(Arena arena); |
diff --git a/mps/code/mps.c b/mps/code/mps.c index 1d1d93100d0..99cf42d5a33 100644 --- a/mps/code/mps.c +++ b/mps/code/mps.c | |||
| @@ -70,6 +70,7 @@ | |||
| 70 | #include "ss.c" | 70 | #include "ss.c" |
| 71 | #include "version.c" | 71 | #include "version.c" |
| 72 | #include "table.c" | 72 | #include "table.c" |
| 73 | #include "arg.c" | ||
| 73 | 74 | ||
| 74 | /* Additional pool classes */ | 75 | /* Additional pool classes */ |
| 75 | 76 | ||
diff --git a/mps/code/mps.h b/mps/code/mps.h index 0c2cc9dbd53..0b450da9f5b 100644 --- a/mps/code/mps.h +++ b/mps/code/mps.h | |||
| @@ -62,6 +62,7 @@ typedef struct mps_alloc_pattern_s | |||
| 62 | *mps_alloc_pattern_t; /* allocation patterns */ | 62 | *mps_alloc_pattern_t; /* allocation patterns */ |
| 63 | typedef struct mps_frame_s | 63 | typedef struct mps_frame_s |
| 64 | *mps_frame_t; /* allocation frames */ | 64 | *mps_frame_t; /* allocation frames */ |
| 65 | typedef const struct mps_key_s *mps_key_t; /* argument key */ | ||
| 65 | 66 | ||
| 66 | /* Concrete Types */ | 67 | /* Concrete Types */ |
| 67 | 68 | ||
| @@ -91,6 +92,36 @@ enum { | |||
| 91 | MPS_RES_PARAM /* illegal user parameter value */ | 92 | MPS_RES_PARAM /* illegal user parameter value */ |
| 92 | }; | 93 | }; |
| 93 | 94 | ||
| 95 | /* Keyword argument lists */ | ||
| 96 | |||
| 97 | typedef struct mps_arg_s { | ||
| 98 | mps_key_t key; | ||
| 99 | union { | ||
| 100 | mps_bool_t b; | ||
| 101 | char c; | ||
| 102 | const char *string; | ||
| 103 | int i; | ||
| 104 | unsigned u; | ||
| 105 | long l; | ||
| 106 | unsigned long ul; | ||
| 107 | size_t size; | ||
| 108 | va_list varargs; | ||
| 109 | mps_addr_t addr; | ||
| 110 | } val; | ||
| 111 | } mps_arg_s; | ||
| 112 | |||
| 113 | #define MPS_KEY_ARGS_END NULL | ||
| 114 | |||
| 115 | /* FIXME: This shouldn't be here */ | ||
| 116 | extern const struct mps_key_s _mps_key_vmw3_top_down; | ||
| 117 | #define MPS_KEY_VMW3_TOP_DOWN (&_mps_key_vmw3_top_down) | ||
| 118 | |||
| 119 | extern const struct mps_key_s _mps_key_varargs; | ||
| 120 | #define MPS_KEY_VARARGS (&_mps_key_varargs) | ||
| 121 | extern const struct mps_key_s _mps_key_arena_size; | ||
| 122 | #define MPS_KEY_ARENA_SIZE (&_mps_key_arena_size) | ||
| 123 | |||
| 124 | |||
| 94 | /* <a id="message.types"> Keep in sync with | 125 | /* <a id="message.types"> Keep in sync with |
| 95 | * <code/mpmtypes.h#message.types> */ | 126 | * <code/mpmtypes.h#message.types> */ |
| 96 | /* Not meant to be used by clients, they should use the macros below. */ | 127 | /* Not meant to be used by clients, they should use the macros below. */ |
| @@ -272,6 +303,8 @@ extern mps_bool_t mps_arena_step(mps_arena_t, double, double); | |||
| 272 | 303 | ||
| 273 | extern mps_res_t mps_arena_create(mps_arena_t *, mps_arena_class_t, ...); | 304 | extern mps_res_t mps_arena_create(mps_arena_t *, mps_arena_class_t, ...); |
| 274 | extern mps_res_t mps_arena_create_v(mps_arena_t *, mps_arena_class_t, va_list); | 305 | extern mps_res_t mps_arena_create_v(mps_arena_t *, mps_arena_class_t, va_list); |
| 306 | extern mps_res_t mps_arena_create_args(mps_arena_t *, mps_arena_class_t, | ||
| 307 | mps_arg_s []); | ||
| 275 | extern void mps_arena_destroy(mps_arena_t); | 308 | extern void mps_arena_destroy(mps_arena_t); |
| 276 | 309 | ||
| 277 | extern size_t mps_arena_reserved(mps_arena_t); | 310 | extern size_t mps_arena_reserved(mps_arena_t); |
diff --git a/mps/code/mps.xcodeproj/project.pbxproj b/mps/code/mps.xcodeproj/project.pbxproj index 375124a990f..134e873becc 100644 --- a/mps/code/mps.xcodeproj/project.pbxproj +++ b/mps/code/mps.xcodeproj/project.pbxproj | |||
| @@ -182,6 +182,7 @@ | |||
| 182 | 3124CAFB156BE82000753214 /* testlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 31EEAC9E156AB73400714D05 /* testlib.c */; }; | 182 | 3124CAFB156BE82000753214 /* testlib.c in Sources */ = {isa = PBXBuildFile; fileRef = 31EEAC9E156AB73400714D05 /* testlib.c */; }; |
| 183 | 3124CAFC156BE82900753214 /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; }; | 183 | 3124CAFC156BE82900753214 /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; }; |
| 184 | 3150AE53156ABA2500A6E22A /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; }; | 184 | 3150AE53156ABA2500A6E22A /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; }; |
| 185 | 317B3C2B1731830100F9A469 /* arg.c in Sources */ = {isa = PBXBuildFile; fileRef = 317B3C2A1731830100F9A469 /* arg.c */; }; | ||
| 185 | 31A47BA4156C1E130039B1C2 /* mps.c in Sources */ = {isa = PBXBuildFile; fileRef = 31A47BA3156C1E130039B1C2 /* mps.c */; }; | 186 | 31A47BA4156C1E130039B1C2 /* mps.c in Sources */ = {isa = PBXBuildFile; fileRef = 31A47BA3156C1E130039B1C2 /* mps.c */; }; |
| 186 | 31D60007156D3C6200337B26 /* segsmss.c in Sources */ = {isa = PBXBuildFile; fileRef = 31D60006156D3C5F00337B26 /* segsmss.c */; }; | 187 | 31D60007156D3C6200337B26 /* segsmss.c in Sources */ = {isa = PBXBuildFile; fileRef = 31D60006156D3C5F00337B26 /* segsmss.c */; }; |
| 187 | 31D60008156D3C7400337B26 /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; }; | 188 | 31D60008156D3C7400337B26 /* libmps.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 31EEABFB156AAF9D00714D05 /* libmps.a */; }; |
| @@ -1049,6 +1050,7 @@ | |||
| 1049 | 3124CAE4156BE6D500753214 /* fmthe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fmthe.c; sourceTree = "<group>"; }; | 1050 | 3124CAE4156BE6D500753214 /* fmthe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fmthe.c; sourceTree = "<group>"; }; |
| 1050 | 3124CAEB156BE7F300753214 /* amcss */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = amcss; sourceTree = BUILT_PRODUCTS_DIR; }; | 1051 | 3124CAEB156BE7F300753214 /* amcss */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = amcss; sourceTree = BUILT_PRODUCTS_DIR; }; |
| 1051 | 3124CAF5156BE81100753214 /* amcss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = amcss.c; sourceTree = "<group>"; }; | 1052 | 3124CAF5156BE81100753214 /* amcss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = amcss.c; sourceTree = "<group>"; }; |
| 1053 | 317B3C2A1731830100F9A469 /* arg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = arg.c; sourceTree = "<group>"; }; | ||
| 1052 | 31A47BA3156C1E130039B1C2 /* mps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mps.c; sourceTree = "<group>"; }; | 1054 | 31A47BA3156C1E130039B1C2 /* mps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mps.c; sourceTree = "<group>"; }; |
| 1053 | 31A47BA5156C1E5E0039B1C2 /* ssixi3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ssixi3.c; sourceTree = "<group>"; }; | 1055 | 31A47BA5156C1E5E0039B1C2 /* ssixi3.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ssixi3.c; sourceTree = "<group>"; }; |
| 1054 | 31D60006156D3C5F00337B26 /* segsmss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = segsmss.c; sourceTree = "<group>"; }; | 1056 | 31D60006156D3C5F00337B26 /* segsmss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = segsmss.c; sourceTree = "<group>"; }; |
| @@ -1568,6 +1570,7 @@ | |||
| 1568 | 31EEAC05156AB27B00714D05 /* arena.c */, | 1570 | 31EEAC05156AB27B00714D05 /* arena.c */, |
| 1569 | 31EEAC06156AB27B00714D05 /* arenacl.c */, | 1571 | 31EEAC06156AB27B00714D05 /* arenacl.c */, |
| 1570 | 31EEAC03156AB23A00714D05 /* arenavm.c */, | 1572 | 31EEAC03156AB23A00714D05 /* arenavm.c */, |
| 1573 | 317B3C2A1731830100F9A469 /* arg.c */, | ||
| 1571 | 31EEAC3F156AB32500714D05 /* boot.c */, | 1574 | 31EEAC3F156AB32500714D05 /* boot.c */, |
| 1572 | 31EEAC27156AB2F200714D05 /* bt.c */, | 1575 | 31EEAC27156AB2F200714D05 /* bt.c */, |
| 1573 | 31EEAC19156AB2B200714D05 /* buffer.c */, | 1576 | 31EEAC19156AB2B200714D05 /* buffer.c */, |
| @@ -2690,6 +2693,7 @@ | |||
| 2690 | buildActionMask = 2147483647; | 2693 | buildActionMask = 2147483647; |
| 2691 | files = ( | 2694 | files = ( |
| 2692 | 31A47BA4156C1E130039B1C2 /* mps.c in Sources */, | 2695 | 31A47BA4156C1E130039B1C2 /* mps.c in Sources */, |
| 2696 | 317B3C2B1731830100F9A469 /* arg.c in Sources */, | ||
| 2693 | ); | 2697 | ); |
| 2694 | runOnlyForDeploymentPostprocessing = 0; | 2698 | runOnlyForDeploymentPostprocessing = 0; |
| 2695 | }; | 2699 | }; |
diff --git a/mps/code/mpsacl.h b/mps/code/mpsacl.h index 62a8952ba83..ec7a21c027a 100644 --- a/mps/code/mpsacl.h +++ b/mps/code/mpsacl.h | |||
| @@ -9,6 +9,9 @@ | |||
| 9 | 9 | ||
| 10 | #include "mps.h" | 10 | #include "mps.h" |
| 11 | 11 | ||
| 12 | /* Client arena base address argument */ | ||
| 13 | extern const struct mps_key_s _mps_key_arena_cl_addr; | ||
| 14 | #define MPS_KEY_ARENA_CL_ADDR (&_mps_key_arena_cl_addr) | ||
| 12 | 15 | ||
| 13 | extern mps_arena_class_t mps_arena_class_cl(void); | 16 | extern mps_arena_class_t mps_arena_class_cl(void); |
| 14 | 17 | ||
diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c index 435b4fbc0c6..15f44a24ff1 100644 --- a/mps/code/mpsi.c +++ b/mps/code/mpsi.c | |||
| @@ -52,6 +52,10 @@ | |||
| 52 | #include "sac.h" | 52 | #include "sac.h" |
| 53 | #include "chain.h" | 53 | #include "chain.h" |
| 54 | 54 | ||
| 55 | #include <stdarg.h> | ||
| 56 | #include <string.h> | ||
| 57 | |||
| 58 | |||
| 55 | SRCID(mpsi, "$Id$"); | 59 | SRCID(mpsi, "$Id$"); |
| 56 | 60 | ||
| 57 | 61 | ||
| @@ -311,11 +315,14 @@ mps_res_t mps_arena_create(mps_arena_t *mps_arena_o, | |||
| 311 | mps_arena_class_t mps_arena_class, ...) | 315 | mps_arena_class_t mps_arena_class, ...) |
| 312 | { | 316 | { |
| 313 | mps_res_t res; | 317 | mps_res_t res; |
| 314 | va_list args; | 318 | mps_arg_s args[2]; |
| 319 | |||
| 320 | args[0].key = MPS_KEY_VARARGS; | ||
| 321 | va_start(args[0].val.varargs, mps_arena_class); | ||
| 322 | args[1].key = MPS_KEY_ARGS_END; | ||
| 323 | res = mps_arena_create_args(mps_arena_o, mps_arena_class, args); | ||
| 324 | va_end(args[0].val.varargs); | ||
| 315 | 325 | ||
| 316 | va_start(args, mps_arena_class); | ||
| 317 | res = mps_arena_create_v(mps_arena_o, mps_arena_class, args); | ||
| 318 | va_end(args); | ||
| 319 | return res; | 326 | return res; |
| 320 | } | 327 | } |
| 321 | 328 | ||
| @@ -323,7 +330,25 @@ mps_res_t mps_arena_create(mps_arena_t *mps_arena_o, | |||
| 323 | /* mps_arena_create_v -- create an arena object */ | 330 | /* mps_arena_create_v -- create an arena object */ |
| 324 | 331 | ||
| 325 | mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o, | 332 | mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o, |
| 326 | mps_arena_class_t arena_class, va_list args) | 333 | mps_arena_class_t arena_class, |
| 334 | va_list varargs) | ||
| 335 | { | ||
| 336 | mps_arg_s args[2]; | ||
| 337 | |||
| 338 | args[0].key = MPS_KEY_VARARGS; | ||
| 339 | /* FIXME: va_copy not available in C89 */ | ||
| 340 | memcpy(&args[0].val.varargs, &varargs, sizeof(va_list)); | ||
| 341 | args[1].key = MPS_KEY_ARGS_END; | ||
| 342 | |||
| 343 | return mps_arena_create_args(mps_arena_o, arena_class, args); | ||
| 344 | } | ||
| 345 | |||
| 346 | |||
| 347 | /* mps_arena_create_arg -- create an arena object */ | ||
| 348 | |||
| 349 | mps_res_t mps_arena_create_args(mps_arena_t *mps_arena_o, | ||
| 350 | mps_arena_class_t arena_class, | ||
| 351 | mps_arg_s mps_args[]) | ||
| 327 | { | 352 | { |
| 328 | Arena arena; | 353 | Arena arena; |
| 329 | Res res; | 354 | Res res; |
| @@ -334,15 +359,21 @@ mps_res_t mps_arena_create_v(mps_arena_t *mps_arena_o, | |||
| 334 | 359 | ||
| 335 | AVER(mps_arena_o != NULL); | 360 | AVER(mps_arena_o != NULL); |
| 336 | 361 | ||
| 337 | res = ArenaCreateV(&arena, arena_class, args); | 362 | res = ArenaCreate(&arena, arena_class, mps_args); |
| 338 | if (res != ResOK) | 363 | if (res != ResOK) |
| 339 | return res; | 364 | return res; |
| 340 | 365 | ||
| 366 | /* FIXME: Consider doing this | ||
| 367 | if (args[0].key != MPS_KEY_ARGS_END) | ||
| 368 | return MPS_RES_PARAM; | ||
| 369 | */ | ||
| 370 | |||
| 341 | ArenaLeave(arena); | 371 | ArenaLeave(arena); |
| 342 | *mps_arena_o = (mps_arena_t)arena; | 372 | *mps_arena_o = (mps_arena_t)arena; |
| 343 | return MPS_RES_OK; | 373 | return MPS_RES_OK; |
| 344 | } | 374 | } |
| 345 | 375 | ||
| 376 | |||
| 346 | /* mps_arena_destroy -- destroy an arena object */ | 377 | /* mps_arena_destroy -- destroy an arena object */ |
| 347 | 378 | ||
| 348 | void mps_arena_destroy(mps_arena_t arena) | 379 | void mps_arena_destroy(mps_arena_t arena) |
diff --git a/mps/code/vmix.c b/mps/code/vmix.c index bc26b647dc8..f5b8aa681b3 100644 --- a/mps/code/vmix.c +++ b/mps/code/vmix.c | |||
| @@ -98,9 +98,12 @@ Bool VMCheck(VM vm) | |||
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | 100 | ||
| 101 | Res VM | ||
| 102 | |||
| 103 | |||
| 101 | /* VMCreate -- reserve some virtual address space, and create a VM structure */ | 104 | /* VMCreate -- reserve some virtual address space, and create a VM structure */ |
| 102 | 105 | ||
| 103 | Res VMCreate(VM *vmReturn, Size size) | 106 | Res VMCreate(VM *vmReturn, Size size, mps_arg_s args[]) |
| 104 | { | 107 | { |
| 105 | Align align; | 108 | Align align; |
| 106 | VM vm; | 109 | VM vm; |
| @@ -109,6 +112,8 @@ Res VMCreate(VM *vmReturn, Size size) | |||
| 109 | Res res; | 112 | Res res; |
| 110 | 113 | ||
| 111 | AVER(vmReturn != NULL); | 114 | AVER(vmReturn != NULL); |
| 115 | AVERT(Arg, args); | ||
| 116 | UNUSED(args); | ||
| 112 | 117 | ||
| 113 | /* Find out the page size from the OS */ | 118 | /* Find out the page size from the OS */ |
| 114 | pagesize = getpagesize(); | 119 | pagesize = getpagesize(); |