From: Stefan R. <Ste...@gm...> - 2015-07-24 11:32:39
|
Okay, sorry for bothering you. I already found out the reason for all this. When handing a number to a Java-style weakref (or any other non-Jython-aware Java method), Jython implicitly converts it to a Java-Float or Integer object, while tuples and lists are kept PyTuple or PyList. So the Java-style weakref actually points to a distinct object than the Jython-style one. The reason for strings beeing "overpersistent" regarding Java-weakrefs is internation I suppose. Jython hands the interned string to the weakref, but the interned string is immortal anyway, so the weakref is never cleared. Regards Stefan > Gesendet: Sonntag, 19. Juli 2015 um 18:43 Uhr > Von: "Stefan Richthofer" <Ste...@gm...> > An: "Jython Developers" <jyt...@li...> > Betreff: Fw: A cumbersome weakref-observation > > Update: If insert a del-statement, strings are overpersistent for Java > style wekarefs: > > import time > from java.lang import System > from java.lang.ref import WeakReference > import weakref > > l = "test" > wkl = WeakReference(l) > wkr = weakref.ref(l) > print "wkl: "+str(wkl.get()) > print "wkr: "+str(wkr()) > del l > System.gc() > time.sleep(2) > print "wkl2: "+str(wkl.get()) > print "wkr2: "+str(wkr()) > > > ---- > Output is: > wkl: test > wkr: test > wkl2: test > wkr2: None > > However with tuples and lists both variants work fine. > > > > Gesendet: Sonntag, 19. Juli 2015 um 18:06 Uhr > > Von: "Stefan Richthofer" <Ste...@gm...> > > An: "Jython Developers" <jyt...@li...> > > Betreff: A cumbersome weakref-observation > > > > Hello all, I just stumbled over some (seemingly?) strange behavior > > regarding weak references: > > > > import time > > from java.lang import System > > from java.lang.ref import WeakReference > > import weakref > > > > l = 123999.7 > > wkl = WeakReference(l) > > wkr = weakref.ref(l) > > print "wkl: "+str(wkl.get()) > > print "wkr: "+str(wkr()) > > System.gc() > > time.sleep(2) > > print "wkl2: "+str(wkl.get()) > > print "wkr2: "+str(wkr()) > > > > > > ---- > > Output is: > > wkl: 123999.7 > > wkr: 123999.7 > > wkl2: None > > wkr2: 123999.7 > > ---- > > With l = "test" the output is: > > wkl: test > > wkr: test > > wkl2: test > > wkr2: test > > ---- > > "wkl2: None" happens for floats and ints, but not for strings, tuples and lists. > > (These are the ones I tested so far.) > > > > So the Java-style weak reference breaks for number-types, although the referent > > is not gc'ed. Can anyone tell me how this comes? What is special about numbers > > regarding java-style weak references? > > > > I describe this behavior as "cumbersome" rather than a bug, because the official > > weak-ref variant works fine (Why?). Still, there is no obvious reason why the Java-variant > > should not work and I need to understand this issue. Maybe it even points to a subtle > > bug. Looking at the weakref-module code I don't see special treatment of number-types > > so far. What do I overlook? > > > > Thanks in advance! > > > > Stefan |