aboutsummaryrefslogtreecommitdiffstats
path: root/gc/test_cpp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gc/test_cpp.cc')
-rw-r--r--gc/test_cpp.cc265
1 files changed, 0 insertions, 265 deletions
diff --git a/gc/test_cpp.cc b/gc/test_cpp.cc
deleted file mode 100644
index 3160b09..0000000
--- a/gc/test_cpp.cc
+++ /dev/null
@@ -1,265 +0,0 @@
-/****************************************************************************
-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
-
-This program tries to test the specific C++ functionality provided by
-gc_c++.h that isn't tested by the more general test routines of the
-collector.
-
-A recommended value for number-of-iterations is 10, which will take a
-few minutes to complete.
-
-***************************************************************************/
-
-#include "gc_cpp.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifndef __GNUC__
-# include "gc_alloc.h"
-#endif
-extern "C" {
-#include "gc_priv.h"
-}
-#ifdef MSWIN32
-# include <windows.h>
-#endif
-
-
-#define my_assert( e ) \
- if (! (e)) { \
- GC_printf1( "Assertion failure in " __FILE__ ", line %d: " #e "\n", \
- __LINE__ ); \
- exit( 1 ); }
-
-
-class A {public:
- /* An uncollectable class. */
-
- A( int iArg ): i( iArg ) {}
- void Test( int iArg ) {
- my_assert( i == iArg );}
- int i;};
-
-
-class B: public gc, public A {public:
- /* A collectable class. */
-
- B( int j ): A( j ) {}
- ~B() {
- my_assert( deleting );}
- static void Deleting( int on ) {
- deleting = on;}
- static int deleting;};
-
-int B::deleting = 0;
-
-
-class C: public gc_cleanup, public A {public:
- /* A collectable class with cleanup and virtual multiple inheritance. */
-
- C( int levelArg ): A( levelArg ), level( levelArg ) {
- nAllocated++;
- if (level > 0) {
- left = new C( level - 1 );
- right = new C( level - 1 );}
- else {
- left = right = 0;}}
- ~C() {
- this->A::Test( level );
- nFreed++;
- my_assert( level == 0 ?
- left == 0 && right == 0 :
- level == left->level + 1 && level == right->level + 1 );
- left = right = 0;
- level = -123456;}
- static void Test() {
- my_assert( nFreed <= nAllocated && nFreed >= .8 * nAllocated );}
-
- static int nFreed;
- static int nAllocated;
- int level;
- C* left;
- C* right;};
-
-int C::nFreed = 0;
-int C::nAllocated = 0;
-
-
-class D: public gc {public:
- /* A collectable class with a static member function to be used as
- an explicit clean-up function supplied to ::new. */
-
- D( int iArg ): i( iArg ) {
- nAllocated++;}
- static void CleanUp( void* obj, void* data ) {
- D* self = (D*) obj;
- nFreed++;
- my_assert( self->i == (int) (long) data );}
- static void Test() {
- my_assert( nFreed >= .8 * nAllocated );}
-
- int i;
- static int nFreed;
- static int nAllocated;};
-
-int D::nFreed = 0;
-int D::nAllocated = 0;
-
-
-class E: public gc_cleanup {public:
- /* A collectable class with clean-up for use by F. */
-
- E() {
- nAllocated++;}
- ~E() {
- nFreed++;}
-
- 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
- member with clean-up. */
-
- F() {
- nAllocated++;}
- ~F() {
- nFreed++;}
- 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;}
-
-
-#ifdef MSWIN32
-int APIENTRY WinMain(
- HINSTANCE instance, HINSTANCE prev, LPSTR cmd, int cmdShow )
-{
- int argc;
- char* argv[ 3 ];
-
- for (argc = 1; argc < sizeof( argv ) / sizeof( argv[ 0 ] ); argc++) {
- argv[ argc ] = strtok( argc == 1 ? cmd : 0, " \t" );
- if (0 == argv[ argc ]) break;}
-
-#else
-# ifdef MACOS
- int main() {
-# else
- int main( int argc, char* argv[] ) {
-# endif
-#endif
-
-# 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;
-# if !defined(__GNUC__) && !defined(MACOS)
- int *x = (int *)alloc::allocate(sizeof(int));
-
- *x = 29;
- x -= 3;
-# endif
- if (argc != 2 || (0 >= (n = atoi( argv[ 1 ] )))) {
- GC_printf0( "usage: test_cpp number-of-iterations\n" );
- exit( 1 );}
-
- for (iters = 1; iters <= n; iters++) {
- GC_printf1( "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 ];
- for (i = 0; i < 1000; i++) {
- as[ i ] = Disguise( new (NoGC) A( i ) );
- bs[ i ] = Disguise( new (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 (GC, D::CleanUp, (void*) i) D( i );
- F* f = new 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 (GC) A( i );
- B* b = new B( i );
- b = new (GC) B( i );
- if (0 == i % 10) {
- B::Deleting( 1 );
- delete b;
- B::Deleting( 0 );}
-# ifdef FINALIZE_ON_DEMAND
- GC_invoke_finalizers();
-# endif
- }
-
- /* Make sure the uncollectable As and Bs are still there. */
- for (i = 0; i < 1000; i++) {
- A* a = (A*) Undisguise( as[ i ] );
- B* b = (B*) Undisguise( bs[ i ] );
- a->Test( i );
- delete a;
- b->Test( i );
- B::Deleting( 1 );
- delete b;
- B::Deleting( 0 );
-# ifdef FINALIZE_ON_DEMAND
- GC_invoke_finalizers();
-# endif
-
- }
-
- /* Make sure most of the finalizable Cs, Ds, and Fs have
- gone away. */
- C::Test();
- D::Test();
- F::Test();}
-
-# if !defined(__GNUC__) && !defined(MACOS)
- my_assert (29 == x[3]);
-# endif
- GC_printf0( "The test appears to have succeeded.\n" );
- return( 0 );}
-
-