Raw File
patch-1
diff -c /home/omega/attardi/posso/cmm/ChangeLog /project/posso/cmm/curr/cmm/ChangeLog
*** /home/omega/attardi/posso/cmm/ChangeLog	Mon Sep 22 10:20:26 1997
--- /project/posso/cmm/curr/cmm/ChangeLog	Wed Aug  6 17:35:44 1997
***************
*** 1,22 ****
- Mon Sep 22 10:19:21 1997  Giuseppe Attardi  <attardi@omega>
- 
- 	* Makefile (test): renamed test5 to test1
- 
- 	* test5.cpp: added new test for reference types
- 
- Wed Sep 17 18:25:01 1997  Giuseppe Attardi  <attardi@laplace>
- 
- 	* cmm.h: added macros CmmRefLoc and CmmRefLocRel to handle
- 	reference types within traverse
- 
- 	* cmm.h (class CmmObject): ID field with unique ID for objects.
- 	Useful for experimentation, is available by defining flag CMM_ID
- 
- Mon Aug 18 11:41:34 1997  Giuseppe Attardi  <attardi@omega>
- 
- 	* cmm.h: moved typedef bool to machine.h
- 	* cmm.h (CmmHeap::scanRoots): arg type is Page (for Watcom)
- 
  Wed Aug  6 11:38:21 1997  Giuseppe Attardi  <attardi@omega>
  
  	* Released version 1.9
--- 1,3 ----
***************
*** 27,34 ****
  	SunOS 5.3 sparc
  	SunOS 4.1.3_U1 sparc
  	Win32 VC++ 4.0 (except testmsw3 with debug)
- 
- 	* tempheap.cpp (scavenge): (int) -> (Word)
  
  	* cmm.cpp (Cmm): ensure max n. of pages will fit in a Page
  
--- 8,13 ----
diff -c /home/omega/attardi/posso/cmm/Copyright /project/posso/cmm/curr/cmm/Copyright
*** /home/omega/attardi/posso/cmm/Copyright	Mon Sep  8 12:17:20 1997
--- /project/posso/cmm/curr/cmm/Copyright	Mon Nov 25 12:32:53 1996
***************
*** 54,57 ****
  	Uttam M. Narsu	<narsu@styx.hks.com>
  	Pietro Iglio	<iglio@di.unipi.it>
  	Hans J. Boehm	<boehm@mti.sgi.com>
- 	Christian Heckler <chh@plato.uni-paderborn.de>
\ No newline at end of file
--- 54,56 ----
diff -c /home/omega/attardi/posso/cmm/Makefile /project/posso/cmm/curr/cmm/Makefile
*** /home/omega/attardi/posso/cmm/Makefile	Mon Sep 22 10:15:51 1997
--- /project/posso/cmm/curr/cmm/Makefile	Fri Aug  1 19:09:44 1997
***************
*** 32,46 ****
  #        ones succeeded and which failed.
  #  "clean"  removes all object code from this directory.
  
! CFLAGS	= -O
  CC	= g++
  
  HFILES = machine.h cmm.h
  
  OBJS = 	cmm.o tempheap.o msw.o memory.o
  
! TESTS = test1 test2 test3 test4 test5 test6 test7 test8 test9 \
! 	testmsw1 testmsw2 testmsw3
  
  all: libCmm.a
  
--- 32,45 ----
  #        ones succeeded and which failed.
  #  "clean"  removes all object code from this directory.
  
! CFLAGS	= -O2
  CC	= g++
  
  HFILES = machine.h cmm.h
  
  OBJS = 	cmm.o tempheap.o msw.o memory.o
  
! TESTS = test2 test3 test4 test5 test6 test7 test8 testmsw1 testmsw2 testmsw3
  
  all: libCmm.a
  
***************
*** 71,78 ****
  msw.o: msw.cpp msw.h $(HFILES)
  	$(CC) $(CFLAGS) -c msw.cpp
  
- test1:	test1.cpp libCmm.a
- 	$(CC) $(CFLAGS) -o test1 test1.cpp libCmm.a
  test2:	test2.cpp libCmm.a
  	$(CC) $(CFLAGS) -o test2 test2.cpp libCmm.a
  test3:	test3.cpp libCmm.a
--- 70,75 ----
***************
*** 87,94 ****
  	$(CC) $(CFLAGS) -o test7 test7.cpp libCmm.a 
  test8:	test8.cpp libCmm.a
  	$(CC) $(CFLAGS) -o test8 test8.cpp libCmm.a 
- test9:	test9.cpp libCmm.a
- 	$(CC) $(CFLAGS) -o test9 test9.cpp libCmm.a 
  testmsw1: testmsw1.c libCmm.a
  	$(CC) $(CFLAGS) -g -o testmsw1 testmsw1.c libCmm.a
  testmsw2: testmsw2.c libCmm.a
--- 84,89 ----
***************
*** 96,99 ****
  testmsw3: testmsw3.cpp libCmm.a
  	$(CC) $(CFLAGS) -o testmsw3 testmsw3.cpp libCmm.a
  clean:
! 	/bin/rm -rf *.o libCmm.a $(TESTS) tests.out
--- 91,94 ----
  testmsw3: testmsw3.cpp libCmm.a
  	$(CC) $(CFLAGS) -o testmsw3 testmsw3.cpp libCmm.a
  clean:
! 	/bin/rm -rf *.o $(TESTS) libCmm.a
diff -c /home/omega/attardi/posso/cmm/Makefile.schema /project/posso/cmm/curr/cmm/Makefile.schema
*** /home/omega/attardi/posso/cmm/Makefile.schema	Mon Sep 22 10:14:53 1997
--- /project/posso/cmm/curr/cmm/Makefile.schema	Tue Feb 25 18:30:50 1997
***************
*** 14,21 ****
  
  OBJS = 	cmm.o tempheap.o msw.o memory.o
  
! TESTS = test1 test2 test3 test4 test5 test6 test7 test8 test9 \
! 	testmsw1 testmsw2 testmsw3
  
  all: libCmm.a
  
--- 14,20 ----
  
  OBJS = 	cmm.o tempheap.o msw.o memory.o
  
! TESTS = test2 test3 test4 test5 test6 test7 test8 testmsw1 testmsw2 testmsw3
  
  all: libCmm.a
  
***************
*** 46,74 ****
  	sed -e s:'"CMM .*"':\\\"CMM `date +%D`\\\": cmm.cpp > tmp.cpp
  	mv tmp.cpp cmm.cpp
  
- 
- test1:	test1.cpp libCmm.a
- 	${CPP} -o test1 ${CFLAGS} test1.cpp libCmm.a 
  test2:	test2.cpp libCmm.a
  	${CPP} -o test2 ${CFLAGS} test2.cpp libCmm.a
  test3:	test3.cpp libCmm.a
  	${CPP} -o test3 ${CFLAGS} test3.cpp libCmm.a
  test4:	test4.cpp libCmm.a
  	${CPP} -o test4 ${CFLAGS} test4.cpp libCmm.a 
  test5:	test5.cpp libCmm.a
  	${CPP} -o test5 ${CFLAGS} test5.cpp libCmm.a 
  test6:	test6.cpp libCmm.a
  	${CPP} -o test6 ${CFLAGS} test6.cpp libCmm.a 
  test7:	test7.cpp libCmm.a
  	${CPP} -o test7 ${CFLAGS} test7.cpp libCmm.a 
  test8:	test8.cpp libCmm.a
  	${CPP} -o test8 ${CFLAGS} test8.cpp libCmm.a 
! test9:	test9.cpp libCmm.a
! 	${CPP} -o test9 ${CFLAGS} test9.cpp libCmm.a 
  testmsw1: testmsw1.c libCmm.a
  	${CPP} -g -o testmsw1 ${CFLAGS} testmsw1.c libCmm.a
  testmsw2: testmsw2.c libCmm.a
  	${CPP} -g -o testmsw2 ${CFLAGS} testmsw2.c libCmm.a
  testmsw3: testmsw3.cpp libCmm.a
  	${CPP} ${OPTS} -o testmsw3 ${CFLAGS} testmsw3.cpp libCmm.a
  
--- 45,77 ----
  	sed -e s:'"CMM .*"':\\\"CMM `date +%D`\\\": cmm.cpp > tmp.cpp
  	mv tmp.cpp cmm.cpp
  
  test2:	test2.cpp libCmm.a
  	${CPP} -o test2 ${CFLAGS} test2.cpp libCmm.a
+ 
  test3:	test3.cpp libCmm.a
  	${CPP} -o test3 ${CFLAGS} test3.cpp libCmm.a
+ 
  test4:	test4.cpp libCmm.a
  	${CPP} -o test4 ${CFLAGS} test4.cpp libCmm.a 
+ 
  test5:	test5.cpp libCmm.a
  	${CPP} -o test5 ${CFLAGS} test5.cpp libCmm.a 
+ 
  test6:	test6.cpp libCmm.a
  	${CPP} -o test6 ${CFLAGS} test6.cpp libCmm.a 
+ 
  test7:	test7.cpp libCmm.a
  	${CPP} -o test7 ${CFLAGS} test7.cpp libCmm.a 
+ 
  test8:	test8.cpp libCmm.a
  	${CPP} -o test8 ${CFLAGS} test8.cpp libCmm.a 
! 
  testmsw1: testmsw1.c libCmm.a
  	${CPP} -g -o testmsw1 ${CFLAGS} testmsw1.c libCmm.a
+ 
  testmsw2: testmsw2.c libCmm.a
  	${CPP} -g -o testmsw2 ${CFLAGS} testmsw2.c libCmm.a
+ 
  testmsw3: testmsw3.cpp libCmm.a
  	${CPP} ${OPTS} -o testmsw3 ${CFLAGS} testmsw3.cpp libCmm.a
  
Only in /home/omega/attardi/posso/cmm: Parallel
diff -c /home/omega/attardi/posso/cmm/cmm.cpp /project/posso/cmm/curr/cmm/cmm.cpp
*** /home/omega/attardi/posso/cmm/cmm.cpp	Wed Sep 24 11:24:44 1997
--- /project/posso/cmm/curr/cmm/cmm.cpp	Wed Aug  6 17:33:40 1997
***************
*** 54,60 ****
  
  /* Version tag */
  
! char*  Cmm::version = "CMM 1.9a";
  
  /*---------------------------------------------------------------------------*
   *
--- 54,60 ----
  
  /* Version tag */
  
! char*  Cmm::version = "CMM 1.9";
  
  /*---------------------------------------------------------------------------*
   *
***************
*** 232,252 ****
    verbose |= newVerbose;
  }
  
! /*---------------------------------------------------------------------------*/
! 
! int const CmmLocOffsets[] =
! {0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
!  22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,
!  46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
!  70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,
!  94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112};
! 
! /*---------------------------------------------------------------------------*
   * Freespace objects have a tag of 0.
   * Pad objects for double alignment have a tag of 1.
   * CmmObjects have a tag of 2.
   * The header for a one-word double alignment pad is kept in doublepad.
!  *---------------------------------------------------------------------------*/
  
  #define OBJECT_TAG 2
  #if HEADER_SIZE
--- 232,243 ----
    verbose |= newVerbose;
  }
  
! /*
   * Freespace objects have a tag of 0.
   * Pad objects for double alignment have a tag of 1.
   * CmmObjects have a tag of 2.
   * The header for a one-word double alignment pad is kept in doublepad.
!  */
  
  #define OBJECT_TAG 2
  #if HEADER_SIZE
***************
*** 560,586 ****
  }
  
  /*---------------------------------------------------------------------------*
-  * Object ID
-  *
-  * IDs are used to keep track of objects even after they are moved by
-  * the collector.
-  *---------------------------------------------------------------------------*/
- 
- #ifdef CMM_ID
- /* with ID_INC=20000000, stats gets corrupted after 158 collection
-    (in bjork70 on Solaris).
-    Apparently the 40MB block is allocated at 0x2447b20-0x4a6d520, and heap
-    expansion reaches 0x4b6d400 and incorporates it. Pages from here are
-    used by the default heap.
-    */
- #define ID_INC 60000000
- Byte *stats = NULL;
- int objectIDs = 0;
- int objectIDmax = 0;
- int ncollect = 0;
- #endif
- 
- /*---------------------------------------------------------------------------*
   * -- CmmInit
   *
   * The heap is allocated and the appropriate data structures are initialized
--- 551,556 ----
***************
*** 608,623 ****
    char  *heap;
    Page  i;
  
- #ifdef CMM_ID
-   /*
-    * create stats here so as not to interfere with heap.
-    * Allocate dynamically to avoid extra work for CmmExamineStaticArea.
-    */
-   objectIDmax = ID_INC;
-   stats = ::new char[objectIDmax];
-   bzero(stats, objectIDmax);
- #endif CMM_ID
- 
    /* Log actual heap parameters if from environment or logging */
    if ((environmentValue("CMM_MINHEAP", Cmm::minHeap)
         | environmentValue("CMM_MAXHEAP", Cmm::maxHeap)
--- 578,583 ----
***************
*** 1056,1061 ****
--- 1016,1022 ----
  static void newlineIfLogging();
  static void logRoot(GCP);
  
+ 
  /*---------------------------------------------------------------------------*
   * -- DefaultHeap::move
   *
***************
*** 1073,1081 ****
  GCP
  DefaultHeap::move(GCP cp)
  {
- #ifdef CMM_ID
-   int ID;
- #endif
    int  page = GCPtoPage(cp);	/* Page number */
    GCP  np;			/* Pointer to the new object */
  # if HEADER_SIZE
--- 1034,1039 ----
***************
*** 1152,1177 ****
  # ifdef MARKING
    MARK(np);
  # endif
- #ifdef CMM_ID
-   {
-     ID = ((CmmObject*)np)->ID;
-     if (ID >= objectIDmax)
-       {
- 	int newMax = objectIDmax + ID_INC;
- 	newMax = MAX(newMax, ID+1);
- 	Byte *newStats = ::new char[newMax];
- 	bzero(newStats, newMax);
- 	if (stats)
- 	  {
- 	    bcopy(stats, newStats, objectIDmax);
- 	    ::delete stats;
- 	  }
- 	stats = newStats;
- 	objectIDmax = newMax;
-       }
-     stats[ID]++;
-   }
- #endif
    return(np);
  }
  
--- 1110,1115 ----
***************
*** 1287,1296 ****
    nextSpace = STABLESPACE;
    usedPages = stablePages;	// start counting in StableSpace
  
- #ifdef CMM_ID
-   ncollect++;
- #endif
- 
  # if !HEADER_SIZE || defined(MARKING)
    /* Clear the liveMap bitmap */
    bzero((char*)&liveMap[WORD_INDEX(firstHeapPage * bytesPerPage)],
--- 1225,1230 ----
***************
*** 1351,1373 ****
       collected heap for possible pointers */
    WHEN_VERBOSE (CMM_ROOTLOG, fprintf(stderr, "stack roots:\n"));
  
    void CmmExamineStaticArea(GCP, GCP);
  
    /* ensure flushing of register caches	*/
!   {
!     jmp_buf regs;
!     if (_setjmp(regs) == 0) _longjmp(regs, 1);
!   }
  
    /* Examine the stack:		*/
-   GCP fp;			/* Pointer for checking the stack.
- 				 * Don't move this earlier or on Solaris it
- 				 * will crash when using -g.
- 				 */
  # ifdef STACK_GROWS_DOWNWARD
!   for (fp = (GCP)(&fp+1); fp < (GCP)stackBottom; fp++)
  # else
!     for (fp = (GCP)(&fp-1); fp > (GCP)stackBottom; fp--)
  # endif
        {
  	WHEN_VERBOSE (CMM_ROOTLOG, logRoot(fp));
--- 1285,1302 ----
       collected heap for possible pointers */
    WHEN_VERBOSE (CMM_ROOTLOG, fprintf(stderr, "stack roots:\n"));
  
+   GCP fp;			/* Pointer for checking the stack */
    void CmmExamineStaticArea(GCP, GCP);
  
    /* ensure flushing of register caches	*/
!   jmp_buf regs;
!   if (_setjmp(regs) == 0) _longjmp(regs, 1);
  
    /* Examine the stack:		*/
  # ifdef STACK_GROWS_DOWNWARD
!   for (fp = (GCP)regs; fp < (GCP)stackBottom; fp++)
  # else
!     for (fp = (GCP)regs + sizeof(regs); fp > (GCP)stackBottom; fp--)
  # endif
        {
  	WHEN_VERBOSE (CMM_ROOTLOG, logRoot(fp));
***************
*** 1793,1801 ****
      firstFreeWord = NULL;
    }
    ALLOC_SETUP(object, size);
- #ifdef CMM_ID
-   ((CmmObject *)object)->ID = objectIDs++;
- #endif
    return(object);
  }
  
--- 1722,1727 ----
***************
*** 1845,1855 ****
    GCP object = heap->alloc(size);
  
    // To avoid problems in GC after new but during constructor
! #ifdef CMM_ID
!   *(object+1) = *((GCP)aCmmObject+1);
! #else
!   *object = *(GCP)aCmmObject;
! #endif
    return (void *)object;
  }
  
--- 1771,1778 ----
    GCP object = heap->alloc(size);
  
    // To avoid problems in GC after new but during constructor
!   *object = *((GCP)aCmmObject);
! 
    return (void *)object;
  }
  
***************
*** 1876,1886 ****
    GCP object = heap->alloc(size + extraSize);
  
    // To avoid problems in GC after new() but during constructor
! #ifdef CMM_ID
!   *(object+1) = *((GCP)aCmmVarObject+1);
! #else
!   *object = *(GCP)aCmmVarObject;
! #endif
  
    return (void *)object;
  }
--- 1799,1805 ----
    GCP object = heap->alloc(size + extraSize);
  
    // To avoid problems in GC after new() but during constructor
!   *object = *((GCP)aCmmVarObject);
  
    return (void *)object;
  }
diff -c /home/omega/attardi/posso/cmm/cmm.h /project/posso/cmm/curr/cmm/cmm.h
*** /home/omega/attardi/posso/cmm/cmm.h	Wed Sep 17 15:15:05 1997
--- /project/posso/cmm/curr/cmm/cmm.h	Sat Aug  2 13:30:58 1997
***************
*** 53,71 ****
         the method C::traverse must contain scavenge(&x);
  
     (b) for a class containing an instance of a collected object, say
!        class C { CmmClass x; }, the method C::traverse must contain
         x.traverse();
  
     (c) for a class derived from another collected class, say
!        class C: CmmClass {...}, the method C::traverse must contain
!        CmmClass::traverse();
  
!    (d) for a class containing a reference, say class C { type &x; },
!        the method C::traverse must contain scavenge(CmmRefLoc(C, x));
! 
!    (e) for a class deriving from a virtual base class, say class
!        C: virtual CmmClass {...}, the method C::traverse must contain
!        scavenge(VirtualBase(CmmClass));
  
     For example,
  
--- 53,68 ----
         the method C::traverse must contain scavenge(&x);
  
     (b) for a class containing an instance of a collected object, say
!        class C { GcClass x; }, the method C::traverse must contain
         x.traverse();
  
     (c) for a class derived from another collected class, say
!        class C: GcClass {...}, the method C::traverse must contain
!        GcClass::traverse();
  
!    (d) for a class deriving from a virtual base class, say class
!        C: virtual GcClass {...}, the method C::traverse must contain
!        scavenge(VirtualBase(GcClass));
  
     For example,
  
***************
*** 304,309 ****
--- 301,312 ----
  #include "machine.h"
  #include "msw.h"
  
+ #ifdef _WIN32
+ typedef int	bool;
+ #define false	0
+ #define true	1
+ #endif
+ 
  /*---------------------------------------------------------------------------*
   *
   * -- Enable CMM features or verbosity
***************
*** 348,369 ****
  
  /*---------------------------------------------------------------------------*
   *
!  * Support for rule (d) above.
!  *
!  *---------------------------------------------------------------------------*/
! 
! /* this involves runtime calculation */
! extern int const CmmLocOffsets[];
! 
! #define CmmRefLoc(T, ref) \
!   ((GcObject **)((Word)this + sizeof(GCP) * (int)(&((T*)CmmLocOffsets)->ref)))
! 
! /* this is resolved at compile time */
! #define CmmRefLocRel(field, offset)	((GcObject **)(&field + offset))
! 
! /*---------------------------------------------------------------------------*
!  *
!  * Support for rule (e) above. Compiler dependent.
   *
   *---------------------------------------------------------------------------*/
  
--- 351,357 ----
  
  /*---------------------------------------------------------------------------*
   *
!  * Support for rule (d) above. Compiler dependent.
   *
   *---------------------------------------------------------------------------*/
  
***************
*** 598,604 ****
  
    virtual GCP   alloc(Word) = 0;
    virtual void  reclaim(GCP) {};
!   virtual void  scanRoots(Page) {};
  
    virtual void collect()
      {
--- 586,592 ----
  
    virtual GCP   alloc(Word) = 0;
    virtual void  reclaim(GCP) {};
!   virtual void  scanRoots(int) {};
  
    virtual void collect()
      {
***************
*** 663,669 ****
    GCP alloc(Word);
    void reclaim(GCP) {}		// Bartlett's delete does nothing.
    void collect();		// the default garbarge collector
!   void scavenge(CmmObject **);
    GCP  getPages(int);
  
    int usedPages;		// pages in actual use
--- 651,657 ----
    GCP alloc(Word);
    void reclaim(GCP) {}		// Bartlett's delete does nothing.
    void collect();		// the default garbarge collector
!   void scavenge(CmmObject **ptr);
    GCP  getPages(int);
  
    int usedPages;		// pages in actual use
***************
*** 691,713 ****
  
  class MarkAndSweep : public CmmHeap
  {
   public:
  
    MarkAndSweep();
!   inline GCP 	alloc(Word size){ return (GCP) mswAlloc(size); }
!   inline void	reclaim(GCP p)	{ mswFree(p); }
!   inline void	collect()	{ mswCollect(); }
!   inline void*	realloc(void * p, Word size)	{ return mswRealloc(p, size); }
!   inline void*	calloc(Word n, Word size)	{ return mswCalloc(n, size); }
! 
!   inline void	checkHeap()	{ mswCheckHeap(1); }
!   inline void	showInfo()	{ mswShowInfo(); }
! 
!   void		tempHeapStart()	{ mswTempHeapStart(); }
!   void		tempHeapEnd()	{ mswTempHeapEnd(); }
!   void		tempHeapFree()	{ mswTempHeapFree(); }
  
-   void		scanRoots(Page page);
  };
  
  /*---------------------------------------------------------------------------*
--- 679,706 ----
  
  class MarkAndSweep : public CmmHeap
  {
+ 
   public:
  
    MarkAndSweep();
!   inline GCP 		alloc	(Word size)
!   					       { return (GCP) mswAlloc(size); }
!   inline void 		reclaim	(GCP p)        { mswFree(p); }
!   inline void 		collect	()	       { mswCollect(); }
!   inline void*		realloc (void * p, Word size)
!                               { return mswRealloc(p, size); }
!   inline void*		calloc  (Word n, Word size)
!   			      { return mswCalloc(n, size); }
! 
!   inline void		checkHeap()		{ mswCheckHeap(1); }
!   inline void		showInfo()		{ mswShowInfo(); }
! 
!   void			tempHeapStart ()	{ mswTempHeapStart(); }
!   void			tempHeapEnd   ()	{ mswTempHeapEnd(); }
!   void			tempHeapFree  ()	{ mswTempHeapFree(); }
! 
!   void			scanRoots(Page page);
  
  };
  
  /*---------------------------------------------------------------------------*
***************
*** 716,722 ****
   *
   *---------------------------------------------------------------------------*/
  
- #define CMM_ID
  class CmmObject
  {
  public:
--- 709,714 ----
***************
*** 737,742 ****
--- 729,735 ----
  
  #ifdef MARKING
    inline void mark() { MARK(this); }
+ 
    inline bool marked() { return (MARKED(this)); }
  #endif
  
***************
*** 769,778 ****
    void* operator new[](size_t size, CmmHeap* = Cmm::heap);
    void  operator delete[](void*);
  #endif
- 
- #ifdef CMM_ID
-   int ID;
- #endif
  };
  
  /*---------------------------------------------------------------------------*
--- 762,767 ----
***************
*** 829,836 ****
  };
  
  /*---------------------------------------------------------------------------*/
! inline void
! CmmHeap::visit(CmmObject* ptr)
  {
  #ifdef MARKING
    if (!ptr->marked())
--- 818,826 ----
  };
  
  /*---------------------------------------------------------------------------*/
! 
! inline void CmmHeap::
! visit(CmmObject* ptr)
  {
  #ifdef MARKING
    if (!ptr->marked())
Common subdirectories: /home/omega/attardi/posso/cmm/doc and /project/posso/cmm/curr/cmm/doc
diff -c /home/omega/attardi/posso/cmm/machine.h /project/posso/cmm/curr/cmm/machine.h
*** /home/omega/attardi/posso/cmm/machine.h	Mon Sep  8 12:13:27 1997
--- /project/posso/cmm/curr/cmm/machine.h	Mon Jul 28 19:56:20 1997
***************
*** 49,60 ****
  typedef Ptr *		GCP;	/* Pointer to a garbage collected object */
  typedef unsigned	Page;	/* Page number */
  
- #ifdef _WIN32
- typedef int	bool;		/* Watcom C++ 11.0 complains */
- #define false	0
- #define true	1
- #endif
- 
  /*---------------------------------------------------------------------------*
   * -- Compatibility
   *---------------------------------------------------------------------------*/
--- 49,54 ----
diff -c /home/omega/attardi/posso/cmm/msw.cpp /project/posso/cmm/curr/cmm/msw.cpp
*** /home/omega/attardi/posso/cmm/msw.cpp	Wed Sep 24 11:22:31 1997
--- /project/posso/cmm/curr/cmm/msw.cpp	Sun Aug  3 21:29:12 1997
***************
*** 921,927 ****
  	if (pageInfo == PAGE_Fixed)
  		return page->objSize;
  	else
! 		return (page->nPages * bytesPerPage) - FirstObjOffset +1;
  }
  
  /*---------------------------------------------------------------------------*
--- 921,927 ----
  	if (pageInfo == PAGE_Fixed)
  		return page->objSize;
  	else
! 		return (page->nPages * bytesPerPage) - FirstObjOffset -1;
  }
  
  /*---------------------------------------------------------------------------*
***************
*** 951,978 ****
  	else {
  		newPtr = (Ptr)mswAlloc(size);
  		/* If obj is opaque, then keep it opaque */
! 
!                 Byte isOpaque;
!                 PageHeader oldHead;
! 
!                 if (realSize < MaxFixedSize)
!                   isOpaque = (*((Ptr)p-2) == OpaqueMask);
!                 else {
! 		  PageHeader oldHead = (PageHeader) ROUND_DOWN(p,
!                                                                bytesPerPage);
!                   isOpaque = (Byte) oldHead->isOpaque;
!                 }
! 
! 		if (size < MaxFixedSize) {
! 			if (isOpaque)
!                           *(newPtr-2) = OpaqueMask;
!                 }
  		else {
  		  PageHeader newHead = (PageHeader) ROUND_DOWN(newPtr,
  							       bytesPerPage);
! 		  newHead->isOpaque = isOpaque;
  		}
- 
  		memcpy(newPtr, p, realSize);
  		mswFree(p);
  		return newPtr;
--- 951,965 ----
  	else {
  		newPtr = (Ptr)mswAlloc(size);
  		/* If obj is opaque, then keep it opaque */
! 		if (size < MaxFixedSize)
! 			*(newPtr-2) = *((Ptr)p-2);
  		else {
  		  PageHeader newHead = (PageHeader) ROUND_DOWN(newPtr,
  							       bytesPerPage);
! 		  PageHeader oldHead = (PageHeader) ROUND_DOWN(p,
! 							       bytesPerPage);
! 		  newHead->isOpaque = oldHead->isOpaque;
  		}
  		memcpy(newPtr, p, realSize);
  		mswFree(p);
  		return newPtr;
***************
*** 2102,2108 ****
  
  /*---------------------------------------------------------------------------*
   *
!  * -- MarkAndSweep::scanRoots(Page page)
   *
   * Promotes pages referred by any allocated object inside "page".
   * (Should be) Used by DefaultHeap to identify pointers from MarkAndSweep
--- 2089,2095 ----
  
  /*---------------------------------------------------------------------------*
   *
!  * -- MarkAndSweep::scanRoots(int page)
   *
   * Promotes pages referred by any allocated object inside "page".
   * (Should be) Used by DefaultHeap to identify pointers from MarkAndSweep
diff -c /home/omega/attardi/posso/cmm/tempheap.cpp /project/posso/cmm/curr/cmm/tempheap.cpp
*** /home/omega/attardi/posso/cmm/tempheap.cpp	Mon Sep  8 12:10:01 1997
--- /project/posso/cmm/curr/cmm/tempheap.cpp	Wed Aug  6 19:45:46 1997
***************
*** 208,218 ****
  void
  TempHeap::scavenge(CmmObject **ptr)
  {
!   GCP pp = (GCP)*ptr;
    if (OUTSIDE_HEAPS(GCPtoPage(pp)))
      return;
  
!   CmmObject *oldPtr = (CmmObject *)basePointer(pp);
    int offset = (Word)pp - (Word)oldPtr;
  
    if (!inside(oldPtr))
--- 208,218 ----
  void
  TempHeap::scavenge(CmmObject **ptr)
  {
!   Word pp = (GCP)*ptr;
    if (OUTSIDE_HEAPS(GCPtoPage(pp)))
      return;
  
!   CmmObject *oldPtr = basePointer(pp);
    int offset = (Word)pp - (Word)oldPtr;
  
    if (!inside(oldPtr))
Only in /home/omega/attardi/posso/cmm: test1.cpp
diff -c /home/omega/attardi/posso/cmm/test5.cpp /project/posso/cmm/curr/cmm/test5.cpp
*** /home/omega/attardi/posso/cmm/test5.cpp	Wed Sep 17 18:14:44 1997
--- /project/posso/cmm/curr/cmm/test5.cpp	Mon Jul 28 21:22:06 1997
***************
*** 1,64 ****
! #include "cmm.h"
! #include <stream.h>
  
! /*
!  * Tests use of reference types in objects.
!  *
!  */
  
! #define SIZE 1000
  
! class cell : public CmmObject 
  {
! public:
!   char  c;			// just to check alignment problems
!   cell  &car;
!   cell  &cdr;
    int  value;
-   cell();
    cell(cell *initcar, cell *initcdr, int initvalue);
    void traverse();
  };
  
  void cell::traverse()  
  {
    CmmHeap *heap = Cmm::heap;
!   heap->scavenge(CmmRefLoc(cell, car));
!   heap->scavenge(CmmRefLoc(cell, cdr));
  }
  
  cell::cell(cell *initcar, cell *initcdr, int initvalue)
-   : car(*initcar), cdr(*initcdr), value(initvalue)
  {
  }
  
  void
! visitTree(cell *zp)
  {
!   cell *tp = zp;
!   while (tp != NULL)  
      {
        printf("%x: %d  ", tp, tp->value);
!       tp = &tp->cdr;
      }
    printf("\n");
    tp = zp;
!   while (tp != NULL)  
      {
        printf("%x: %d  ", tp, tp->value);
!       tp = &tp->car;
      }
    printf("\n");
  }
  
  void
! listTest1()
  {
    int  i, j;
!   cell *lp = NULL, *zp;
    
    printf("List test 1\n");
!   for (i = 0; i <= SIZE; i++)  
      {
        if  (i % 50 == 0)
  	{ printf("."); fflush(stdout); }
--- 1,102 ----
! /* Test program for CMM */
! 
! /* Externals */
  
! #include <stdio.h>
! #include <stdlib.h>
! #include "cmm.h"
  
! #define	VECT_SIZE	1000
  
! struct  cell : CmmObject 
  {
!   cell  *car;
!   cell  *cdr;
    int  value;
    cell(cell *initcar, cell *initcdr, int initvalue);
    void traverse();
  };
  
+ typedef  cell* CP;
+ 
  void cell::traverse()  
  {
    CmmHeap *heap = Cmm::heap;
!   heap->scavenge((CmmObject **)&car);
!   heap->scavenge((CmmObject **)&cdr);
  }
  
+ 
  cell::cell(cell *initcar, cell *initcdr, int initvalue)
  {
+   car = initcar;
+   cdr = initcdr;
+   value = initvalue;
  }
  
+ struct vector : CmmObject 
+ {
+   vector  *car;
+   vector  *cdr;
+   int  value1;
+   char bytes[VECT_SIZE];
+   int  value2;
+   vector(vector* x, vector* y, int v1, int v2);
+   void traverse();
+ };
+ 
+ typedef  vector* VP;
+ 
+ void vector::traverse()
+ {
+   CmmHeap *heap = Cmm::heap;
+   heap->scavenge((CmmObject **)&car);
+   heap->scavenge((CmmObject **)&cdr);
+ }
+ 
+ vector::vector(vector* x, vector* y, int v1, int v2)  
+ {
+   car = x;
+   cdr = y;
+   value1 = v1;
+   value2 = v2;
+ }
+ 
+ /* Test program */
+ 
+ int  init_global = 2,
+ array_global[VECT_SIZE];
+ 
  void
! printtree(CP zp)
  {
!   CP  tp;
! 
!   tp = zp;
!   while  (tp != NULL)  
      {
        printf("%x: %d  ", tp, tp->value);
!       tp = tp->cdr;
      }
    printf("\n");
    tp = zp;
!   while  (tp != NULL)  
      {
        printf("%x: %d  ", tp, tp->value);
!       tp = tp->car;
      }
    printf("\n");
  }
  
  void
! listtest1()
  {
    int  i, j;
!   CP  lp, zp;
    
    printf("List test 1\n");
!   lp = NULL;
!   for (i = 0; i <= VECT_SIZE ; i++)  
      {
        if  (i % 50 == 0)
  	{ printf("."); fflush(stdout); }
***************
*** 69,86 ****
        for (j = i; j >= 0 ; j--)  
  	{
  	  if ((zp == NULL) || (zp->value != j))
! 	    printf("LP is damaged at j = %d\n", j);
! 	  zp = &zp->cdr;
  	}
      }
    printf("\n");		   
  }
  
! cell *
! treeTest()
  {
    int  i;
!   cell  *tp, *zp;
  
    printf("Tree test\n");
    tp = new cell(NULL, NULL, 0);
--- 107,150 ----
        for (j = i; j >= 0 ; j--)  
  	{
  	  if ((zp == NULL) || (zp->value != j))
! 	    printf("LP is not a good list when j = %d\n", j);
! 	  zp = zp->cdr;
  	}
      }
    printf("\n");		   
  }
  
! void
! vectortest()
! {
!   int  i, j;
!   VP  lp, zp;
!   
!   printf("Vector test\n");
!   lp = NULL;
!   for (i = 0; i <= 100 ; i++)  
!     {
!       if  (i % 10 == 0)
! 	{ printf("."); fflush(stdout); }
!       zp = new vector(NULL, lp, i, i);
!       lp = zp;
!       Cmm::heap->collect();
!       zp = lp;
!       for (j = i; j >= 0 ; j--)
! 	{
! 	  if ((zp == NULL) || (zp->value1 != j)  ||  (zp->value2 != j))
! 	    printf("LP is not a good list when j = %d\n", j);
! 	  zp = zp->cdr;
! 	}
!     }
!   printf("\n");		   
! }
! 
! CP
! treetest()
  {
    int  i;
!   CP  tp, zp;
  
    printf("Tree test\n");
    tp = new cell(NULL, NULL, 0);
***************
*** 92,106 ****
    Cmm::heap->collect();
    zp = new cell(tp, tp, 6);
    Cmm::heap->collect();
!   visitTree(zp);
    return(zp);
  }
  
  void
! listTest2()
  {
!   int  i, j, length = 1000, repeat = 100;
!   cell  *lp = NULL, *zp;
  
    printf("List Test 2\n");
    for (i = 0; i < repeat; i++)  
--- 156,170 ----
    Cmm::heap->collect();
    zp = new cell(tp, tp, 6);
    Cmm::heap->collect();
!   printtree(zp);
    return(zp);
  }
  
  void
! listtest2()
  {
!   int  i, j, length = 10000, repeat = 1000;
!   CP  lp, zp;
  
    printf("List Test 2\n");
    for (i = 0; i < repeat; i++)  
***************
*** 108,113 ****
--- 172,178 ----
        if  (i % 50 == 0)
  	{ printf("."); fflush(stdout); }
        /* Build the list */
+       lp = NULL;
        for  (j = 0; j < length; j++)  
  	{
  	  zp = new cell(NULL, lp, j);
***************
*** 119,144 ****
  	{
  	  if ((zp == NULL) || (zp->value != j))
  	    printf("LP is not a good list when j = %d\n", j);
! 	  zp = &zp->cdr;
  	}
      }
    printf("\n");		   
  }
  
! cell *gp = NULL;		/* A global pointer */
  
  void
  main()
  {
    /* List construction test */
!   listTest1();
  
    /* Tree construction test */
!   gp = treeTest();
  
!   /* 100 1000 node lists */
!   listTest2();
  
    /* Check that tree is still there */
!   visitTree(gp);
  }
--- 184,212 ----
  	{
  	  if ((zp == NULL) || (zp->value != j))
  	    printf("LP is not a good list when j = %d\n", j);
! 	  zp = zp->cdr;
  	}
      }
    printf("\n");		   
  }
  
! CP  gp;		/* A global pointer */
  
  void
  main()
  {
    /* List construction test */
!   listtest1();
! 
!   /* List of vectors > 1 page */
!   vectortest();
  
    /* Tree construction test */
!   gp = treetest();
  
!   /* 1000 10000 node lists */
!   listtest2();
  
    /* Check that tree is still there */
!   printtree(gp);
  }
diff -c /home/omega/attardi/posso/cmm/test7.cpp /project/posso/cmm/curr/cmm/test7.cpp
*** /home/omega/attardi/posso/cmm/test7.cpp	Mon Sep  8 12:11:08 1997
--- /project/posso/cmm/curr/cmm/test7.cpp	Mon Jul 28 21:22:45 1997
***************
*** 1,6 ****
  
  /*
!  * Test for CmmArray (requires GNU C++)
   */
  
  #include "cmm.h"
--- 1,6 ----
  
  /*
!  * Test for CmmArray
   */
  
  #include "cmm.h"
back to top