diff --git a/mps/code/mpsicv.c b/mps/code/mpsicv.c
index 85e43e65c06..dea398b4097 100644
--- a/mps/code/mpsicv.c
+++ b/mps/code/mpsicv.c
@@ -5,18 +5,12 @@
* Portions copyright (c) 2002 Global Graphics Software.
*/
-#define AUTO_HEADER 1
-
#include "testlib.h"
#include "mpscamc.h"
#include "mpsavm.h"
#include "mpscmv.h"
-
-#if AUTO_HEADER
#include "fmthe.h"
-#endif
#include "fmtdy.h"
-
#include "fmtdytst.h"
#include "mps.h"
#include "mpstd.h"
@@ -44,10 +38,9 @@ static mps_gen_param_s testChain[genCOUNT] = {
static mps_pool_t amcpool;
-
static mps_ap_t ap;
+static size_t ap_headerSIZE = 0;
/* For this ap.... */
-#if AUTO_HEADER
/* Auto_header format
*
* [ auto_header ][===object===]
@@ -57,24 +50,17 @@ static mps_ap_t ap;
*
* Note: pMps < pCli; sizeMps > sizeCli.
*/
-#define PtrMps2Cli(n) ((char*)n + headerSIZE)
-#define PtrCli2Mps(n) ((char*)n - headerSIZE)
-#define SizeMps2Cli(n) (n - headerSIZE)
-#define SizeCli2Mps(n) (n + headerSIZE)
+#define PtrMps2Cli(n) ((char*)n + ap_headerSIZE)
+#define PtrCli2Mps(n) ((char*)n - ap_headerSIZE)
+#define SizeMps2Cli(n) (n - ap_headerSIZE)
+#define SizeCli2Mps(n) (n + ap_headerSIZE)
#define HeaderInit(pMps) do { \
- mps_addr_t pMpsTEMP = (pMps); /* macro hygiene */ \
- ((int*)pMpsTEMP)[0] = realHeader; \
- ((int*)pMpsTEMP)[1] = 0xED0ED; \
+ if(ap_headerSIZE != 0) { \
+ mps_addr_t pMps_MACROCOPY = (pMps); /* macro hygiene */ \
+ ((int*)pMps_MACROCOPY)[0] = realHeader; \
+ ((int*)pMps_MACROCOPY)[1] = 0xED0ED; \
+ } \
} while(0)
-#else
-#include "fmtdy.h"
-#define PtrMps2Cli(n) (n)
-#define PtrCli2Mps(n) (n)
-#define SizeMps2Cli(n) (n)
-#define SizeCli2Mps(n) (n)
-#define HeaderInit(pMps) do { \
- } while(0)
-#endif
static mps_addr_t exactRoots[exactRootsCOUNT];
static mps_addr_t ambigRoots[ambigRootsCOUNT];
@@ -141,17 +127,17 @@ static void alignmentTest(mps_arena_t arena)
static mps_addr_t make(void)
{
- size_t length = rnd() % 20;
- size_t sizeCli = (length+2)*sizeof(mps_word_t);
- size_t sizeMps = SizeCli2Mps(sizeCli);
- mps_addr_t pMps, pCli;
+ size_t length = rnd() % 20;
+ size_t sizeCli = (length+2)*sizeof(mps_word_t);
+ size_t sizeMps = SizeCli2Mps(sizeCli);
+ mps_addr_t pMps, pCli;
mps_res_t res;
do {
MPS_RESERVE_BLOCK(res, pMps, ap, sizeMps);
if (res != MPS_RES_OK) die(res, "MPS_RESERVE_BLOCK");
- HeaderInit(pMps);
- pCli = PtrMps2Cli(pMps);
+ HeaderInit(pMps);
+ pCli = PtrMps2Cli(pMps);
res = dylan_init(pCli, sizeCli, exactRoots, exactRootsCOUNT);
if (res != MPS_RES_OK) die(res, "dylan_init");
} while(!mps_commit(ap, pMps, sizeMps));
@@ -164,17 +150,17 @@ static mps_addr_t make(void)
static mps_addr_t make_with_permit(void)
{
- size_t length = rnd() % 20;
- size_t sizeCli = (length+2)*sizeof(mps_word_t);
- size_t sizeMps = SizeCli2Mps(sizeCli);
- mps_addr_t pMps, pCli;
+ size_t length = rnd() % 20;
+ size_t sizeCli = (length+2)*sizeof(mps_word_t);
+ size_t sizeMps = SizeCli2Mps(sizeCli);
+ mps_addr_t pMps, pCli;
mps_res_t res;
do {
MPS_RESERVE_WITH_RESERVOIR_PERMIT_BLOCK(res, pMps, ap, sizeMps);
if (res != MPS_RES_OK) die(res, "MPS_RESERVE_WITH_RESERVOIR_PERMIT_BLOCK");
HeaderInit(pMps);
- pCli = PtrMps2Cli(pMps);
+ pCli = PtrMps2Cli(pMps);
res = dylan_init(pCli, sizeCli, exactRoots, exactRootsCOUNT);
if (res != MPS_RES_OK) die(res, "dylan_init");
} while(!mps_commit(ap, pMps, sizeMps));
@@ -187,17 +173,17 @@ static mps_addr_t make_with_permit(void)
static mps_addr_t make_no_inline(void)
{
- size_t length = rnd() % 20;
- size_t sizeCli = (length+2)*sizeof(mps_word_t);
- size_t sizeMps = SizeCli2Mps(sizeCli);
- mps_addr_t pMps, pCli;
+ size_t length = rnd() % 20;
+ size_t sizeCli = (length+2)*sizeof(mps_word_t);
+ size_t sizeMps = SizeCli2Mps(sizeCli);
+ mps_addr_t pMps, pCli;
mps_res_t res;
do {
res = (mps_reserve)(&pMps, ap, sizeMps);
if (res != MPS_RES_OK) die(res, "(mps_reserve)");
HeaderInit(pMps);
- pCli = PtrMps2Cli(pMps);
+ pCli = PtrMps2Cli(pMps);
res = dylan_init(pCli, sizeCli, exactRoots, exactRootsCOUNT);
if (res != MPS_RES_OK) die(res, "dylan_init");
} while(!(mps_commit)(ap, pMps, sizeMps));
@@ -340,11 +326,15 @@ static void *test(void *arg, size_t s)
arena = (mps_arena_t)arg;
testlib_unused(s);
-#if AUTO_HEADER
- EnsureHeaderFormat(&format, arena);
-#else
- die(dylan_fmt(&format, arena), "fmt_create");
-#endif
+ if (rnd() & 1) {
+ printf("Using auto_header format.\n");
+ EnsureHeaderFormat(&format, arena);
+ ap_headerSIZE = headerSIZE; /* from fmthe.h */
+ } else {
+ printf("Using normal format (no implicit object header: client pointers point at start of storage).\n");
+ die(dylan_fmt(&format, arena), "fmt_create");
+ ap_headerSIZE = 0;
+ }
die(mps_chain_create(&chain, arena, genCOUNT, testChain), "chain_create");
@@ -457,8 +447,8 @@ static void *test(void *arg, size_t s)
cdie(rampCount > 0 ? res == MPS_RES_OK : res == MPS_RES_FAIL,
"alloc_pattern_end");
if (rampCount > 0) {
- --rampCount;
- }
+ --rampCount;
+ }
break;
case 3:
die(mps_ap_alloc_pattern_reset(ap), "alloc_pattern_reset");
@@ -538,7 +528,7 @@ int main(int argc, char **argv)
/* C. COPYRIGHT AND LICENSE
*
- * Copyright (C) 2001-2002 Ravenbrook Limited .
+ * Copyright (C) 2001-2002, 2008 Ravenbrook Limited .
* All rights reserved. This is an open source license. Contact
* Ravenbrook for commercial licensing options.
*