aboutsummaryrefslogtreecommitdiff
path: root/boehm-gc/tests/test_cpp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boehm-gc/tests/test_cpp.cc')
-rw-r--r--boehm-gc/tests/test_cpp.cc192
1 files changed, 109 insertions, 83 deletions
diff --git a/boehm-gc/tests/test_cpp.cc b/boehm-gc/tests/test_cpp.cc
index 6661e411927..dd11b92791b 100644
--- a/boehm-gc/tests/test_cpp.cc
+++ b/boehm-gc/tests/test_cpp.cc
@@ -1,17 +1,15 @@
/****************************************************************************
Copyright (c) 1994 by Xerox Corporation. All rights reserved.
-
+
THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
-
+
Permission is hereby granted to use or copy this program for any
purpose, provided the above notices are retained on all copies.
Permission to modify the code and to distribute modified code is
granted, provided the above notices are retained, and a notice that
the code was modified is included with the above copyright notice.
****************************************************************************
-Last modified on Mon Jul 10 21:06:03 PDT 1995 by ellis
- modified on December 20, 1994 7:27 pm PST by boehm
usage: test_cpp number-of-iterations
@@ -24,49 +22,70 @@ few minutes to complete.
***************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#undef GC_BUILD
+
#include "gc_cpp.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#define USE_STD_ALLOCATOR
-#ifdef USE_STD_ALLOCATOR
-# include "gc_allocator.h"
-#elif __GNUC__
-# include "new_gc_alloc.h"
+
+#ifndef DONT_USE_STD_ALLOCATOR
+# include "gc_allocator.h"
#else
-# include "gc_alloc.h"
+ /* Note: This works only for ancient STL versions. */
+# include "new_gc_alloc.h"
#endif
+
extern "C" {
-#include "private/gc_priv.h"
+# include "private/gcconfig.h"
+
+# ifndef GC_API_PRIV
+# define GC_API_PRIV GC_API
+# endif
+ GC_API_PRIV void GC_printf(const char * format, ...);
+ /* Use GC private output to reach the same log file. */
+ /* Don't include gc_priv.h, since that may include Windows system */
+ /* header files that don't take kindly to this context. */
}
+
#ifdef MSWIN32
-# include <windows.h>
+# include <windows.h>
#endif
+
#ifdef GC_NAME_CONFLICT
-# define USE_GC UseGC
- struct foo * GC;
+# define USE_GC GC_NS_QUALIFY(UseGC)
+ struct foo * GC;
#else
-# define USE_GC GC
+# define USE_GC GC_NS_QUALIFY(GC)
#endif
-
#define my_assert( e ) \
if (! (e)) { \
- GC_printf1( "Assertion failure in " __FILE__ ", line %d: " #e "\n", \
+ GC_printf( "Assertion failure in " __FILE__ ", line %d: " #e "\n", \
__LINE__ ); \
exit( 1 ); }
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+# define ATTR_UNUSED __attribute__((__unused__))
+#else
+# define ATTR_UNUSED /* empty */
+#endif
class A {public:
/* An uncollectable class. */
A( int iArg ): i( iArg ) {}
void Test( int iArg ) {
- my_assert( i == iArg );}
+ my_assert( i == iArg );}
int i;};
-class B: public gc, public A {public:
+class B: public GC_NS_QUALIFY(gc), public A { public:
/* A collectable class. */
B( int j ): A( j ) {}
@@ -79,7 +98,7 @@ class B: public gc, public A {public:
int B::deleting = 0;
-class C: public gc_cleanup, public A {public:
+class C: public GC_NS_QUALIFY(gc_cleanup), public A { public:
/* A collectable class with cleanup and virtual multiple inheritance. */
C( int levelArg ): A( levelArg ), level( levelArg ) {
@@ -92,7 +111,7 @@ class C: public gc_cleanup, public A {public:
~C() {
this->A::Test( level );
nFreed++;
- my_assert( level == 0 ?
+ my_assert( level == 0 ?
left == 0 && right == 0 :
level == left->level + 1 && level == right->level + 1 );
left = right = 0;
@@ -110,7 +129,7 @@ int C::nFreed = 0;
int C::nAllocated = 0;
-class D: public gc {public:
+class D: public GC_NS_QUALIFY(gc) { public:
/* A collectable class with a static member function to be used as
an explicit clean-up function supplied to ::new. */
@@ -119,10 +138,10 @@ class D: public gc {public:
static void CleanUp( void* obj, void* data ) {
D* self = (D*) obj;
nFreed++;
- my_assert( self->i == (int) (long) data );}
+ my_assert( self->i == (int) (GC_word) data );}
static void Test() {
my_assert( nFreed >= .8 * nAllocated );}
-
+
int i;
static int nFreed;
static int nAllocated;};
@@ -131,7 +150,7 @@ int D::nFreed = 0;
int D::nAllocated = 0;
-class E: public gc_cleanup {public:
+class E: public GC_NS_QUALIFY(gc_cleanup) { public:
/* A collectable class with clean-up for use by F. */
E() {
@@ -141,10 +160,10 @@ class E: public gc_cleanup {public:
static int nFreed;
static int nAllocated;};
-
+
int E::nFreed = 0;
int E::nAllocated = 0;
-
+
class F: public E {public:
/* A collectable class with clean-up, a base with clean-up, and a
@@ -157,104 +176,113 @@ class F: public E {public:
static void Test() {
my_assert( nFreed >= .8 * nAllocated );
my_assert( 2 * nFreed == E::nFreed );}
-
+
E e;
static int nFreed;
static int nAllocated;};
-
+
int F::nFreed = 0;
int F::nAllocated = 0;
-
-long Disguise( void* p ) {
- return ~ (long) p;}
-void* Undisguise( long i ) {
- return (void*) ~ i;}
+GC_word Disguise( void* p ) {
+ return ~ (GC_word) p;}
+void* Undisguise( GC_word i ) {
+ return (void*) ~ i;}
#ifdef MSWIN32
-int APIENTRY WinMain(
- HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int cmdShow )
+int APIENTRY WinMain( HINSTANCE instance ATTR_UNUSED,
+ HINSTANCE prev ATTR_UNUSED, LPSTR cmd, int cmdShow ATTR_UNUSED )
{
- int argc;
+ int argc = 0;
char* argv[ 3 ];
- for (argc = 1; argc < sizeof( argv ) / sizeof( argv[ 0 ] ); argc++) {
+ if (cmd != 0)
+ for (argc = 1; argc < (int)(sizeof(argv) / sizeof(argv[0])); argc++) {
argv[ argc ] = strtok( argc == 1 ? cmd : 0, " \t" );
if (0 == argv[ argc ]) break;}
-
+#elif defined(MACOS)
+ int main() {
+ char* argv_[] = {"test_cpp", "10"}; // MacOS doesn't have a commandline
+ argv = argv_;
+ argc = sizeof(argv_)/sizeof(argv_[0]);
#else
-# ifdef MACOS
- int main() {
-# else
- int main( int argc, char* argv[] ) {
-# endif
+ int main( int argc, char* argv[] ) {
#endif
- GC_INIT();
+ GC_set_all_interior_pointers(1);
+ /* needed due to C++ multiple inheritance used */
+
+ GC_INIT();
-# if defined(MACOS) // MacOS
- char* argv_[] = {"test_cpp", "10"}; // doesn't
- argv = argv_; // have a
- argc = sizeof(argv_)/sizeof(argv_[0]); // commandline
-# endif
int i, iters, n;
-# ifdef USE_STD_ALLOCATOR
+# ifndef DONT_USE_STD_ALLOCATOR
int *x = gc_allocator<int>().allocate(1);
+ int *xio;
+ xio = gc_allocator_ignore_off_page<int>().allocate(1);
+ (void)xio;
int **xptr = traceable_allocator<int *>().allocate(1);
-# else
-# ifdef __GNUC__
- int *x = (int *)gc_alloc::allocate(sizeof(int));
-# else
- int *x = (int *)alloc::allocate(sizeof(int));
-# endif
+# else
+ int *x = (int *)gc_alloc::allocate(sizeof(int));
# endif
*x = 29;
-# ifdef USE_STD_ALLOCATOR
+# ifndef DONT_USE_STD_ALLOCATOR
+ if (!xptr) {
+ fprintf(stderr, "Out of memory!\n");
+ exit(3);
+ }
*xptr = x;
x = 0;
# endif
if (argc != 2 || (0 >= (n = atoi( argv[ 1 ] )))) {
- GC_printf0( "usage: test_cpp number-of-iterations\nAssuming 10 iters\n" );
+ GC_printf( "usage: test_cpp number-of-iterations\nAssuming 10 iters\n" );
n = 10;}
-
+
for (iters = 1; iters <= n; iters++) {
- GC_printf1( "Starting iteration %d\n", iters );
+ GC_printf( "Starting iteration %d\n", iters );
/* Allocate some uncollectable As and disguise their pointers.
Later we'll check to see if the objects are still there. We're
checking to make sure these objects really are uncollectable. */
- long as[ 1000 ];
- long bs[ 1000 ];
+ GC_word as[ 1000 ];
+ GC_word bs[ 1000 ];
for (i = 0; i < 1000; i++) {
- as[ i ] = Disguise( new (NoGC) A( i ) );
- bs[ i ] = Disguise( new (NoGC) B( i ) );}
+ as[ i ] = Disguise( new (GC_NS_QUALIFY(NoGC)) A(i) );
+ bs[ i ] = Disguise( new (GC_NS_QUALIFY(NoGC)) B(i) ); }
/* Allocate a fair number of finalizable Cs, Ds, and Fs.
Later we'll check to make sure they've gone away. */
for (i = 0; i < 1000; i++) {
C* c = new C( 2 );
C c1( 2 ); /* stack allocation should work too */
- D* d = ::new (USE_GC, D::CleanUp, (void*)(long)i) D( i );
- F* f = new F;
+ D* d;
+ F* f;
+ d = ::new (USE_GC, D::CleanUp, (void*)(GC_word)i) D( i );
+ (void)d;
+ f = new F;
+ (void)f;
if (0 == i % 10) delete c;}
/* Allocate a very large number of collectable As and Bs and
drop the references to them immediately, forcing many
collections. */
for (i = 0; i < 1000000; i++) {
- A* a = new (USE_GC) A( i );
- B* b = new B( i );
+ A* a;
+ a = new (USE_GC) A( i );
+ (void)a;
+ B* b;
+ b = new B( i );
+ (void)b;
b = new (USE_GC) B( i );
if (0 == i % 10) {
B::Deleting( 1 );
delete b;
B::Deleting( 0 );}
-# ifdef FINALIZE_ON_DEMAND
- GC_invoke_finalizers();
-# endif
- }
+# ifdef FINALIZE_ON_DEMAND
+ GC_invoke_finalizers();
+# endif
+ }
/* Make sure the uncollectable As and Bs are still there. */
for (i = 0; i < 1000; i++) {
@@ -266,11 +294,10 @@ int APIENTRY WinMain(
B::Deleting( 1 );
delete b;
B::Deleting( 0 );
-# ifdef FINALIZE_ON_DEMAND
- GC_invoke_finalizers();
-# endif
-
- }
+# ifdef FINALIZE_ON_DEMAND
+ GC_invoke_finalizers();
+# endif
+ }
/* Make sure most of the finalizable Cs, Ds, and Fs have
gone away. */
@@ -278,11 +305,10 @@ int APIENTRY WinMain(
D::Test();
F::Test();}
-# ifdef USE_STD_ALLOCATOR
+# ifndef DONT_USE_STD_ALLOCATOR
x = *xptr;
# endif
my_assert (29 == x[0]);
- GC_printf0( "The test appears to have succeeded.\n" );
- return( 0 );}
-
-
+ GC_printf( "The test appears to have succeeded.\n" );
+ return( 0 );
+}