浏览代码

Some gc fixes for arrays + gc cleanups.

Mark Sibly 8 年之前
父节点
当前提交
e1e175987a
共有 4 个文件被更改,包括 87 次插入75 次删除
  1. 16 0
      modules/monkey/native/bbarray.h
  2. 10 14
      modules/monkey/native/bbgc.cpp
  3. 0 57
      modules/monkey/native/bbgc.h
  4. 61 4
      modules/monkey/native/bbobject.h

+ 16 - 0
modules/monkey/native/bbarray.h

@@ -40,6 +40,13 @@ template<class T,int D> struct bbArray{
 
 	bbArray(){
 	}
+	
+	bbArray( const bbArray &t ){
+	
+		bbGC::enqueue( t._rep );
+		
+		_rep=t._rep;
+	}
 		
 	template<class...Args> explicit bbArray( Args...args ){
 		
@@ -93,6 +100,15 @@ template<class T,int D> struct bbArray{
 			
 		return _rep ? (q ? _rep->_sizes[q]/_rep->_sizes[q-1] : _rep->_sizes[0]) : 0;
 	}
+	
+	bbArray &operator=( const bbArray &t ){
+	
+		bbGC::enqueue( t._rep );
+		
+		_rep=t._rep;
+		
+		return *this;
+	}
 		
 	T &operator[]( int index ){
 		bbDebugAssert( index>=0 && index<length(),"Array index out of range" );

+ 10 - 14
modules/monkey/native/bbgc.cpp

@@ -105,15 +105,23 @@ namespace bbGC{
 	void destroy( bbGCNode *p ){
 	
 		if( p->flags & 1 ){
+			
 			//Run finalizer
-			//printf( "Running finalizer\n" );fflush( stdout );
+			//printf( "finalizing: %s %p\n",p->typeName(),p );fflush( stdout );
+			
 			++suspended;
+			
 			p->state=unmarkedBit;
+			
 			p->gcFinalize();
+			
 			if( p->state==markedBit ) bbRuntimeError( "Object resurrected in finalizer" );
+				
 			--suspended;
 		}
 		
+		//printf( "destroying: %s %p\n",p->typeName(),p );fflush( stdout );
+		
 #if BBGC_DEBUG
 //		printf( "destroying: %s %p\n",p->typeName(),p );
 		p->state=3;
@@ -214,13 +222,12 @@ namespace bbGC{
 			
 			markedBytes+=mallocSize( p );
 			
-//			printf( "marking %s\n",p->typeName() );fflush( stdout );
-			
 			p->gcMark();
 		}
 	}
 
 	void sweep(){
+	
 		markRetained();
 		
 		markFibers();
@@ -281,12 +288,6 @@ namespace bbGC{
 	
 		size=(size+sizeof(size_t)+7)&~7;
 		
-		if( debug && size==40 ){
-			debug=false;
-			bbDB::stop();
-			bbDB::stopped();
-		}
-		
 		memused+=size;
 		
 		if( size<256 && pools[size>>3] ){
@@ -295,9 +296,6 @@ namespace bbGC{
 			allocedBytes+=size;
 			size_t *q=(size_t*)p;
 			*q++=size;
-			
-//			if( debug ){ printf( "bbGC::malloc %p size=%i\n",q,size );fflush( stdout ); }
-		
 			return q;
 		}
 		
@@ -339,8 +337,6 @@ namespace bbGC{
 		size_t *q=(size_t*)p;
 		*q++=size;
 
-//		if( debug ){ printf( "bbGC::malloc %p size=%i\n",q,size );fflush( stdout ); }
-		
 		return q;
 	}
 	

+ 0 - 57
modules/monkey/native/bbgc.h

@@ -215,64 +215,7 @@ namespace bbGC{
 	}
 }
 
-template<class T> struct bbGCVar{
-
-	public:
-	
-	T *_ptr;
-	
-	void enqueue(){
-		bbGC::enqueue( dynamic_cast<bbGCNode*>( _ptr ) );
-	}
-	
-	bbGCVar():_ptr( nullptr ){
-	}
-	
-	bbGCVar( T *p ):_ptr( p ){
-		enqueue();
-	}
-	
-	bbGCVar( const bbGCVar &p ):_ptr( p._ptr ){
-		enqueue();
-	}
-	
-	bbGCVar &operator=( T *p ){
-		_ptr=p;
-		enqueue();
-		return *this;
-	}
-	
-	bbGCVar &operator=( const bbGCVar &p ){
-		_ptr=p._ptr;
-		enqueue();
-		return *this;
-	}
-	void discard(){
-		_ptr=nullptr;
-	}
-	
-	T *get()const{
-		return _ptr;
-	}
-	
-	T *operator->()const{
-		return _ptr;
-	}
-	
-	operator T*()const{
-		return _ptr;
-	}
-	
-	T **operator&(){
-		return &_ptr;
-	}
-};
-
 template<class T> void bbGCMark( T const& ){
 }
 
-template<class T> void bbGCMark( const bbGCVar<T> &v ){
-	bbGCMark( v._ptr );
-}
-
 #endif

+ 61 - 4
modules/monkey/native/bbobject.h

@@ -58,10 +58,6 @@ template<class T,class R=typename T::bb_object_type> void bbGCMark( T *p ){
 	bbGC::enqueue( dynamic_cast<bbObject*>( p ) );
 }
 
-template<class T,class C> T bb_object_cast( const bbGCVar<C> &p ){
-	return dynamic_cast<T>( p._ptr );
-}
-
 template<class T,class C> T bb_object_cast( C *p ){
 	return dynamic_cast<T>( p );
 }
@@ -94,4 +90,65 @@ inline bbString bbDBValue( bbObject **p ){
 	return bbDBObjectValue( *p );
 }
 
+template<class T> struct bbGCVar{
+
+	public:
+	
+	T *_ptr;
+	
+	void enqueue(){
+		bbGC::enqueue( dynamic_cast<bbGCNode*>( _ptr ) );
+	}
+	
+	bbGCVar():_ptr( nullptr ){
+	}
+	
+	bbGCVar( T *p ):_ptr( p ){
+		enqueue();
+	}
+	
+	bbGCVar( const bbGCVar &p ):_ptr( p._ptr ){
+		enqueue();
+	}
+	
+	bbGCVar &operator=( T *p ){
+		_ptr=p;
+		enqueue();
+		return *this;
+	}
+	
+	bbGCVar &operator=( const bbGCVar &p ){
+		_ptr=p._ptr;
+		enqueue();
+		return *this;
+	}
+	void discard(){
+		_ptr=nullptr;
+	}
+	
+	T *get()const{
+		return _ptr;
+	}
+	
+	T *operator->()const{
+		return _ptr;
+	}
+	
+	operator T*()const{
+		return _ptr;
+	}
+	
+	T **operator&(){
+		return &_ptr;
+	}
+};
+
+template<class T,class C> T bb_object_cast( const bbGCVar<C> &v ){
+	return dynamic_cast<T>( v._ptr );
+}
+
+template<class T> void bbGCMark( const bbGCVar<T> &v ){
+	bbGCMark( v._ptr );
+}
+
 #endif