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;
}