diff --git a/mps/code/finalcv.c b/mps/code/finalcv.c index 6f55e518cd4..1871141bbdf 100644 --- a/mps/code/finalcv.c +++ b/mps/code/finalcv.c @@ -1,7 +1,7 @@ /* finalcv.c: FINALIZATION COVERAGE TEST * * $Id$ - * Copyright (c) 2001-2016 Ravenbrook Limited. See end of file for license. + * Copyright (c) 2001-2018 Ravenbrook Limited. See end of file for license. * Portions copyright (C) 2002 Global Graphics Software. * * DESIGN @@ -143,6 +143,10 @@ static void test(mps_arena_t arena, mps_pool_class_t pool_class) /* store index in vector's slot */ ((mps_word_t *)p)[vectorSLOT] = dylan_int(i); + /* mps_definalize fails when there have been no calls to mps_finalize + yet, or for an address that was not registered for finalization. */ + Insist(mps_definalize(arena, &p) == MPS_RES_FAIL); + die(mps_finalize(arena, &p), "finalize\n"); root[i] = p; state[i] = rootSTATE; } @@ -246,7 +250,7 @@ int main(int argc, char *argv[]) /* C. COPYRIGHT AND LICENSE * - * Copyright (c) 2001-2016 Ravenbrook Limited . + * Copyright (c) 2001-2018 Ravenbrook Limited . * All rights reserved. This is an open source license. Contact * Ravenbrook for commercial licensing options. * diff --git a/mps/test/argerr/155.c b/mps/test/argerr/155.c new file mode 100644 index 00000000000..9f1228b7750 --- /dev/null +++ b/mps/test/argerr/155.c @@ -0,0 +1,31 @@ +/* +TEST_HEADER + id = $Id: //info.ravenbrook.com/project/mps/master/test/argerr/99.c#4 $ + summary = finalize address not managed by the arena + language = c + link = testlib.o +OUTPUT_SPEC + assert = true + assertfile P= global.c + assertcond = PoolOfAddr(&refpool, arena, (Addr)obj) +END_HEADER +*/ + +#include "testlib.h" +#include "mps.h" + +static void test(void) +{ + void *p = &p; + mps_arena_t arena; + cdie(mps_arena_create_k(&arena, mps_arena_class_vm(), mps_args_none), + "create arena"); + mps_finalize(arena, &p); + mps_arena_destroy(arena); +} + +int main(void) +{ + easy_tramp(test); + return 0; +} diff --git a/mps/test/argerr/156.c b/mps/test/argerr/156.c new file mode 100644 index 00000000000..1b9c0e8aae1 --- /dev/null +++ b/mps/test/argerr/156.c @@ -0,0 +1,31 @@ +/* +TEST_HEADER + id = $Id: //info.ravenbrook.com/project/mps/master/test/argerr/99.c#4 $ + summary = definalize address not managed by the arena + language = c + link = testlib.o +OUTPUT_SPEC + assert = true + assertfile P= global.c + assertcond = ArenaHasAddr(arena, (Addr)obj) +END_HEADER +*/ + +#include "testlib.h" +#include "mps.h" + +static void test(void) +{ + void *p = &p; + mps_arena_t arena; + cdie(mps_arena_create_k(&arena, mps_arena_class_vm(), mps_args_none), + "create arena"); + mps_definalize(arena, &p); + mps_arena_destroy(arena); +} + +int main(void) +{ + easy_tramp(test); + return 0; +} diff --git a/mps/test/argerr/157.c b/mps/test/argerr/157.c new file mode 100644 index 00000000000..d08e079c75e --- /dev/null +++ b/mps/test/argerr/157.c @@ -0,0 +1,37 @@ +/* +TEST_HEADER + id = $Id: //info.ravenbrook.com/project/mps/master/test/argerr/99.c#4 $ + summary = finalize address in manually managed pool + language = c + link = testlib.o +OUTPUT_SPEC + assert = true + assertfile P= global.c + assertcond = PoolHasAttr(refpool, AttrGC) +END_HEADER +*/ + +#include "testlib.h" +#include "mps.h" +#include "mpscmvff.h" + +static void test(void) +{ + void *p; + mps_arena_t arena; + mps_pool_t pool; + cdie(mps_arena_create_k(&arena, mps_arena_class_vm(), mps_args_none), + "create arena"); + cdie(mps_pool_create_k(&pool, arena, mps_class_mvff(), mps_args_none), + "create pool"); + cdie(mps_alloc(&p, pool, 16), "alloc"); + mps_finalize(arena, &p); + mps_pool_destroy(pool); + mps_arena_destroy(arena); +} + +int main(void) +{ + easy_tramp(test); + return 0; +}