rev 673 - in trunk: pr/test src

SVN User <[email protected]> Mon, 28 Jun 2004 16:01:29 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-28 16:01:26 -0400 (Mon, 28 Jun 2004)
New Revision: 673

Modified:
   trunk/pr/test/test.pr
   trunk/src/builtins-core.c
   trunk/src/lock.c
Log:
weakref callback fixed, garbage collector not collecting in test.pr though

Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr	2004-06-28 08:04:40 UTC (rev 672)
+++ trunk/pr/test/test.pr	2004-06-28 20:01:26 UTC (rev 673)
@@ -1,6 +1,6 @@
 #!/usr/bin/env prothon
 
-x = 6
+x = []
 weakref = WeakRef(x)
 print WeakRef
 print weakref
@@ -10,12 +10,27 @@
 print WeakRef.WRITE
 print WeakRef.DELETE
 
-print weakref.flags()
+print "weakref.flags()", weakref.flags()
 
 def callbk(flgs):
 	if flgs & WeakRef.READ: print 'READ'
 	if flgs & WeakRef.WRITE: print 'WRITE'
 	if flgs & WeakRef.DELETE: print 'DELETE'
+cb = callbk{weakref}
 
-weakref.notify(callbk{weakref}, flags = WeakRef.READ | WeakRef.WRITE | WeakRef.DELETE)
+weakref.notify(cb, flags = WeakRef.READ | WeakRef.WRITE | WeakRef.DELETE)
 
+print "before print read test"
+print x
+
+print 'switching to write and del only'
+
+weakref.notify(cb, flags = WeakRef.WRITE | WeakRef.DELETE)
+print 'after switching to write and del only'
+
+print "before write test"
+x.append!(1)
+
+print "before delete test"
+del x
+Sleep(2.0)

Modified: trunk/src/builtins-core.c
===================================================================
--- trunk/src/builtins-core.c	2004-06-28 08:04:40 UTC (rev 672)
+++ trunk/src/builtins-core.c	2004-06-28 20:01:26 UTC (rev 673)
@@ -1068,7 +1068,9 @@
 	su(i);
 	set_attr(ist, callback_func, SYM(BINDOBJ_), self); if_exc_return NULL;
 	un_su(i);
+	read_unlock(ist, wrp->ref);
 	add_notification(ist, wrp->ref, callback_func, DELETE_NOTIFY);
+	read_lock(ist, wrp->ref);
 	if(immutable_flag) set_immutable(wrp->ref);
 	set_unclonable(self);
 	return OBJ(NONE);
@@ -1102,7 +1104,7 @@
 							  flags, NEW_INT(WRITE_NOTIFY|DELETE_NOTIFY) ) ) { 
 	weak_ref_p wrp = self->data.ptr;
 	obj_p callback_func;
-	int flags, old_flags, new_flags, immutable_flag;
+	int flags, immutable_flag;
 	BIN_CONTENT_CHK(WeakRef);
 	CHECK_TYPE_EXC(parms[1], OBJ(FUNC_PROTO), function);
 	INT_32_PARAM(3, flags);
@@ -1114,38 +1116,37 @@
 	}
 	immutable_flag = is_immutable(wrp->ref);
 	clr_immutable(wrp->ref);
-	old_flags = wrp->notify_flags;
-	new_flags = old_flags | flags;
-	if (flags == 0) {
-		new_flags = DELETE_NOTIFY;
-		del_attr(ist, wrp->ref, sym(ist, "onRead_"));
-		del_attr(ist, wrp->ref, sym(ist, "onReadParam_"));
-		del_attr(ist, wrp->ref, sym(ist, "onWrite_"));
-		del_attr(ist, wrp->ref, sym(ist, "onWriteParam_"));
-		del_attr(ist, wrp->ref, sym(ist, "onDelete_"));
-		del_attr(ist, wrp->ref, sym(ist, "onDeleteParam_"));
-	}
 	read_unlock(ist, self);
 	if (flags & READ_NOTIFY) {
 		set_attr(ist, self, sym(ist, "onRead_"), parms[1]); if_exc_return NULL;
 		if (parms[3] != OBJ(NONE))
 			set_attr(ist, self, sym(ist, "onReadParam_"), parms[3]); if_exc_return NULL;
+	} else {
+		del_attr(ist, wrp->ref, sym(ist, "onRead_"));
+		del_attr(ist, wrp->ref, sym(ist, "onReadParam_"));
 	}
 	if (flags & WRITE_NOTIFY) {
 		set_attr(ist, self, sym(ist, "onWrite_"), parms[1]); if_exc_return NULL;
 		if (parms[3] != OBJ(NONE))
 			set_attr(ist, self, sym(ist, "onWriteParam_"), parms[3]); if_exc_return NULL;
+	} else {
+		del_attr(ist, wrp->ref, sym(ist, "onWrite_"));
+		del_attr(ist, wrp->ref, sym(ist, "onWriteParam_"));
 	}
 	if (flags & DELETE_NOTIFY) {
 		set_attr(ist, self, sym(ist, "onDelete_"), parms[1]); if_exc_return NULL;
 		if (parms[3] != OBJ(NONE))
 			set_attr(ist, self, sym(ist, "onDeleteParam_"), parms[3]); if_exc_return NULL;
+	} else {
+		del_attr(ist, wrp->ref, sym(ist, "onDelete_"));
+		del_attr(ist, wrp->ref, sym(ist, "onDeleteParam_"));
 	}
 	read_lock(ist, self);
-	if (old_flags != new_flags) {
-		wrp->notify_flags = new_flags;
+	flags |= DELETE_NOTIFY;
+	if (wrp->notify_flags != flags) {
+		wrp->notify_flags = flags;
 		callback_func = get_attr(ist, WeakRef_OBJ, sym(ist, "callback_")); if_exc_return NULL;
-		add_notification(ist, wrp->ref, callback_func, new_flags); if_exc_return NULL;
+		add_notification(ist, wrp->ref, callback_func, flags); if_exc_return NULL;
 	}
 	if(immutable_flag)
 		set_immutable(wrp->ref);

Modified: trunk/src/lock.c
===================================================================
--- trunk/src/lock.c	2004-06-28 08:04:40 UTC (rev 672)
+++ trunk/src/lock.c	2004-06-28 20:01:26 UTC (rev 673)
@@ -127,7 +127,6 @@
 	llen = (int) list_len(ist, callback_list);
 	for (i=0; i < llen; i += 2) {
 		if (list_item(ist, callback_list, i+1) == callback_func) {
-			flags |= int2i32t(ist, list_item(ist, callback_list, i));
 			list_item_set(ist, callback_list, i, NEW_INT(flags));
 			goto done;
 		}