Browse Source

WeakRef fixes.

Mark Sibly 7 years ago
parent
commit
a8336d55b3
2 changed files with 53 additions and 8 deletions
  1. 50 0
      modules/monkey/native/bbweakref.cpp
  2. 3 8
      modules/monkey/native/bbweakref.h

+ 50 - 0
modules/monkey/native/bbweakref.cpp

@@ -2,3 +2,53 @@
 #include "bbweakref.h"
 #include "bbweakref.h"
 
 
 bbGCWeakRef *bbGC::weakRefs;
 bbGCWeakRef *bbGC::weakRefs;
+
+bbGCWeakRef::bbGCWeakRef( bbObject *target ):target( target ){
+
+	if( !target) return;
+	
+	succ=bbGC::weakRefs;
+	bbGC::weakRefs=this;
+	target->flags|=2;
+}
+
+bbGCWeakRef::~bbGCWeakRef(){
+
+	if( !target ) return;
+	
+	bbAssert( target->flags & 2,"internal bbGCWeakRef error 1" );
+	
+	bbGCWeakRef **pred=&bbGC::weakRefs,*curr;
+	
+	target->flags&=~2;
+
+	while( curr=*pred ){
+		
+		if( curr==this ){
+			
+			*pred=succ;
+			
+			if( target->flags & 2 ) return;
+			
+			while( curr=*pred ){
+				if( curr->target==target ){
+					target->flags|=2;
+					return;
+				}
+				pred=&curr->succ;
+			}
+			return;
+		}
+		
+		if( curr->target==target ) target->flags|=2;
+			
+		pred=&curr->succ;
+	}
+		
+}
+
+bbObject *bbGCWeakRef::getTarget(){
+
+	return target;
+}
+

+ 3 - 8
modules/monkey/native/bbweakref.h

@@ -17,15 +17,10 @@ struct bbGCWeakRef : public bbObject{
 	bbGCWeakRef *succ;	
 	bbGCWeakRef *succ;	
 	bbObject *target;
 	bbObject *target;
 	
 	
-	bbGCWeakRef( bbObject *p ):succ( bbGC::weakRefs ),target( p ){
-		bbGC::weakRefs=this;
-		target->flags|=2;
-	}
-	
-	bbObject *getTarget(){
-		return target;
-	}
+	bbGCWeakRef( bbObject *target );
+	~bbGCWeakRef();
 	
 	
+	bbObject *getTarget();
 };
 };
 
 
 #endif
 #endif