From b6300a3af4fe8935d83d8d3aee159e142c9ca221 Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Tue, 6 Nov 2012 12:16:46 +0000 Subject: [PATCH] Avoid type pun. Copied from Perforce Change: 180364 ServerID: perforce.ravenbrook.com --- mps/example/scheme/scheme-advanced.c | 4 +++- mps/example/scheme/scheme.c | 8 ++++++-- mps/manual/source/guide/advanced.rst | 4 +++- mps/manual/source/guide/lang.rst | 7 +++++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/mps/example/scheme/scheme-advanced.c b/mps/example/scheme/scheme-advanced.c index f9b621de3be..2d61189970d 100644 --- a/mps/example/scheme/scheme-advanced.c +++ b/mps/example/scheme/scheme-advanced.c @@ -4136,6 +4136,7 @@ static void *start(void *p, size_t s) size_t i; volatile obj_t env, op_env, obj; jmp_buf jb; + mps_addr_t ref; mps_res_t res; mps_root_t globals_root; @@ -4148,8 +4149,9 @@ static void *start(void *p, size_t s) we must also ensure that 'symtab' is valid before registration (in this case, by setting it to NULL). See topic/root. */ symtab = NULL; + ref = &symtab; res = mps_root_create_table(&symtab_root, arena, mps_rank_exact(), 0, - (mps_addr_t *)&symtab, 1); + ref, 1); if(res != MPS_RES_OK) error("Couldn't register symtab root"); /* The symbol table is strong-key weak-value. */ diff --git a/mps/example/scheme/scheme.c b/mps/example/scheme/scheme.c index 69a3089700a..30a1b30061d 100644 --- a/mps/example/scheme/scheme.c +++ b/mps/example/scheme/scheme.c @@ -755,6 +755,7 @@ static void rehash(void) { unsigned old_symtab_size = symtab_size; mps_root_t old_symtab_root = symtab_root; unsigned i; + mps_addr_t ref; mps_res_t res; symtab_size *= 2; @@ -770,8 +771,9 @@ static void rehash(void) { across from the old symbol table. The MPS might be moving objects in memory at any time, and will arrange that both copies are updated atomically to the mutator (this interpreter). */ + ref = symtab; res = mps_root_create_table(&symtab_root, arena, mps_rank_exact(), 0, - (mps_addr_t *)symtab, symtab_size); + ref, symtab_size); if(res != MPS_RES_OK) error("Couldn't register new symtab root"); for(i = 0; i < old_symtab_size; ++i) @@ -4048,6 +4050,7 @@ static void *start(void *p, size_t s) size_t i; volatile obj_t env, op_env, obj; jmp_buf jb; + mps_addr_t ref; mps_res_t res; mps_root_t globals_root; @@ -4064,8 +4067,9 @@ static void *start(void *p, size_t s) pointers -- NULL in this case. Random values look like false references into MPS memory and cause undefined behaviour (most likely assertion failures). See topic/root. */ + ref = symtab; res = mps_root_create_table(&symtab_root, arena, mps_rank_exact(), 0, - (mps_addr_t *)symtab, symtab_size); + ref, symtab_size); if(res != MPS_RES_OK) error("Couldn't register symtab root"); error_handler = &jb; diff --git a/mps/manual/source/guide/advanced.rst b/mps/manual/source/guide/advanced.rst index 46e5eaf2ecb..46ccdf5768e 100644 --- a/mps/manual/source/guide/advanced.rst +++ b/mps/manual/source/guide/advanced.rst @@ -818,9 +818,11 @@ The symbol table now becomes a very simple :term:`root`, that only has to be registered once (not :ref:`every time it is rehashed `, as previously):: + mps_addr_t ref; symtab = NULL; + ref = &symtab; res = mps_root_create_table(&symtab_root, arena, mps_rank_exact(), 0, - (mps_addr_t *)&symtab, 1); + ref, 1); if(res != MPS_RES_OK) error("Couldn't register symtab root"); symtab = make_table(16, string_hash, string_equalp, 0, 1); diff --git a/mps/manual/source/guide/lang.rst b/mps/manual/source/guide/lang.rst index 89b414c5564..d95f826ba5a 100644 --- a/mps/manual/source/guide/lang.rst +++ b/mps/manual/source/guide/lang.rst @@ -896,8 +896,9 @@ function, :c:func:`mps_root_create_table`, for registering it:: /* ... */ + mps_addr_t ref = symtab; res = mps_root_create_table(&symtab_root, arena, mps_rank_exact(), 0, - (mps_addr_t *)symtab, symtab_size); + ref, symtab_size); if (res != MPS_RES_OK) error("Couldn't register new symtab root"); .. _guide-lang-roots-rehash: @@ -910,6 +911,7 @@ changes size:: unsigned old_symtab_size = symtab_size; mps_root_t old_symtab_root = symtab_root; unsigned i; + mps_addr_t ref; mps_res_t res; symtab_size *= 2; @@ -920,8 +922,9 @@ changes size:: for (i = 0; i < symtab_size; ++i) symtab[i] = NULL; + ref = symtab; res = mps_root_create_table(&symtab_root, arena, mps_rank_exact(), 0, - (mps_addr_t *)symtab, symtab_size); + ref, symtab_size); if (res != MPS_RES_OK) error("Couldn't register new symtab root"); for (i = 0; i < old_symtab_size; ++i)