Update of /cvsroot/jython/jython/org/python/core In directory sc8-pr-cvs1:/tmp/cvs-serv1908/org/python/core Modified Files: PyFunction.java PyBeanEventProperty.java PyReflectedField.java PyFile.java PyClass.java PyBeanProperty.java PyTraceback.java PyMethod.java PyJavaClass.java PyInstance.java PyObject.java PyReflectedConstructor.java PyReflectedFunction.java __builtin__.java PyModule.java PyBeanEvent.java PyJavaPackage.java PyTableCode.java Py.java Added Files: IdImpl1.java IdImpl2.java IdImpl.java Log Message: Eventually implemented correct id(.). This should assure the correctness e.g. of pickle and copy.deepcopy. [notice that cPickle was unaffected] In the long run at least copy should use directly an identity mapping instead of id() [this should be discussed with Python-Dev together with the idea of deprecating/stear away from id() in favor of offering (weak) identity mappings to users when a mapping is what is needed]. So this change will be less important, still as long as Python has a id(.) semantics is better implemented correctly. ids are still useful for tracebility/debugging. Converted string reprs (toString results) to call Py.idstr(.) instead of directly "at "+Py.id(.) which was implemented simply as System.identityHashCode. The final form of the results of Py.idstr(.) is undecided. On a less serious note: >>> class A: pass ... >>> id(A()) 1 >>> A() <__main__.A instance 2> >>> yes the new ids look funny. --- NEW FILE: IdImpl1.java --- package org.python.core; public class IdImpl1 extends IdImpl { public long id(PyObject o) { if (o instanceof PyJavaInstance) { return System.identityHashCode(((PyJavaInstance)o).javaProxy); } else { return System.identityHashCode(o); } } public String idstr(PyObject o) { return Long.toString(id(o)); } public long java_obj_id(Object o) { return System.identityHashCode(o); } } --- NEW FILE: IdImpl2.java --- package org.python.core; import java.lang.ref.WeakReference; import java.lang.ref.ReferenceQueue; import java.util.HashMap; public class IdImpl2 extends IdImpl { public static class WeakIdentityMap { private ReferenceQueue refqueue = new ReferenceQueue(); private HashMap hashmap = new HashMap(); private void cleanup() { Object k; while ((k = refqueue.poll()) != null) { hashmap.remove(k); } } private class WeakIdKey extends WeakReference { private int hashcode; WeakIdKey(Object obj) { super(obj,refqueue); hashcode = System.identityHashCode(obj); } public int hashCode() { return hashcode; } public boolean equals(Object other) { Object obj = this.get(); if (obj != null) { return obj == ((WeakIdKey)other).get(); } else { return this == other; } } } public int _internal_map_size() { return hashmap.size(); } public void put(Object key,Object val) { cleanup(); hashmap.put(new WeakIdKey(key),val); } public Object get(Object key) { cleanup(); return hashmap.get(new WeakIdKey(key)); } public void remove(Object key) { cleanup(); hashmap.remove(new WeakIdKey(key)); } } private WeakIdentityMap id_map = new WeakIdentityMap(); private long sequential_id = 0; public long id(PyObject o) { if (o instanceof PyJavaInstance) { return java_obj_id(((PyJavaInstance)o).javaProxy); } else { return java_obj_id(o); } } // XXX maybe should display both this id and identityHashCode // XXX preserve the old "at ###" style? public String idstr(PyObject o) { return Long.toString(id(o)); } public synchronized long java_obj_id(Object o) { Long cand = (Long)id_map.get(o); if (cand == null) { sequential_id++; long new_id = sequential_id; id_map.put(o,new Long(new_id)); return new_id; } return cand.longValue(); } } --- NEW FILE: IdImpl.java --- package org.python.core; public abstract class IdImpl { public static IdImpl getInstance() { if (System.getProperty("java.version").compareTo("1.2")>=0) { try { return (IdImpl)Class.forName("org.python.core.IdImpl2").newInstance(); } catch(Throwable e) { return null; } } else { return new IdImpl1(); } } public abstract long id(PyObject o); public abstract String idstr(PyObject o); // o should not be an instance of a subclass of PyObject public abstract long java_obj_id(Object o); } Index: PyFunction.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyFunction.java,v retrieving revision 2.15 retrieving revision 2.16 diff -C2 -d -r2.15 -r2.16 *** PyFunction.java 26 May 2002 20:37:28 -0000 2.15 --- PyFunction.java 6 Aug 2003 11:46:25 -0000 2.16 *************** *** 190,194 **** } public String toString() { ! return "<function "+__name__+" at "+hashCode()+">"; } } --- 190,194 ---- } public String toString() { ! return "<function "+__name__+" "+Py.idstr(this)+">"; } } Index: PyBeanEventProperty.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyBeanEventProperty.java,v retrieving revision 2.6 retrieving revision 2.7 diff -C2 -d -r2.6 -r2.7 *** PyBeanEventProperty.java 28 Oct 2001 17:13:43 -0000 2.6 --- PyBeanEventProperty.java 6 Aug 2003 11:46:26 -0000 2.7 *************** *** 129,133 **** public String toString() { return "<beanEventProperty "+__name__+" for event "+ ! eventClass.toString()+" at "+hashCode()+">"; } } --- 129,133 ---- public String toString() { return "<beanEventProperty "+__name__+" for event "+ ! eventClass.toString()+" "+Py.idstr(this)+">"; } } Index: PyReflectedField.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyReflectedField.java,v retrieving revision 2.4 retrieving revision 2.5 diff -C2 -d -r2.4 -r2.5 *** PyReflectedField.java 28 Oct 2001 17:13:43 -0000 2.4 --- PyReflectedField.java 6 Aug 2003 11:46:26 -0000 2.5 *************** *** 57,61 **** public String toString() { ! return "<reflected field "+field.toString()+" at "+Py.id(this)+">"; } } --- 57,61 ---- public String toString() { ! return "<reflected field "+field.toString()+" "+Py.idstr(this)+">"; } } Index: PyFile.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyFile.java,v retrieving revision 2.28 retrieving revision 2.29 diff -C2 -d -r2.28 -r2.29 *** PyFile.java 1 Nov 2002 14:57:49 -0000 2.28 --- PyFile.java 6 Aug 2003 11:46:26 -0000 2.29 *************** *** 947,952 **** public String toString() { ! return "<file " + name + ", mode " + mode + " at " + ! Py.id(this) + ">"; } --- 947,952 ---- public String toString() { ! return "<file " + name + ", mode " + mode + " " + ! Py.idstr(this) + ">"; } Index: PyClass.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyClass.java,v retrieving revision 2.29 retrieving revision 2.30 diff -C2 -d -r2.29 -r2.30 *** PyClass.java 6 Jan 2002 21:19:13 -0000 2.29 --- PyClass.java 6 Aug 2003 11:46:26 -0000 2.30 *************** *** 293,297 **** else smod = ((PyString)mod).toString(); ! return "<class "+smod+"."+__name__+" at "+Py.id(this)+">"; } } --- 293,297 ---- else smod = ((PyString)mod).toString(); ! return "<class "+smod+"."+__name__+" "+Py.idstr(this)+">"; } } Index: PyBeanProperty.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyBeanProperty.java,v retrieving revision 2.4 retrieving revision 2.5 diff -C2 -d -r2.4 -r2.5 *** PyBeanProperty.java 28 Oct 2001 17:13:43 -0000 2.4 --- PyBeanProperty.java 6 Aug 2003 11:46:26 -0000 2.5 *************** *** 88,93 **** typeName = myType.getName(); } ! return "<beanProperty "+__name__+" type: "+typeName+" at "+ ! Py.id(this)+">"; } } --- 88,93 ---- typeName = myType.getName(); } ! return "<beanProperty "+__name__+" type: "+typeName+" "+ ! Py.idstr(this)+">"; } } Index: PyTraceback.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyTraceback.java,v retrieving revision 2.4 retrieving revision 2.5 diff -C2 -d -r2.4 -r2.5 *** PyTraceback.java 28 Oct 2001 17:13:43 -0000 2.4 --- PyTraceback.java 6 Aug 2003 11:46:26 -0000 2.5 *************** *** 56,60 **** public String toString() { ! return "<traceback object at " + hashCode() + ">"; } } --- 56,60 ---- public String toString() { ! return "<traceback object at " + " "+Py.idstr(this) + ">"; } } Index: PyMethod.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyMethod.java,v retrieving revision 2.15 retrieving revision 2.16 diff -C2 -d -r2.15 -r2.16 *** PyMethod.java 28 Oct 2001 17:13:43 -0000 2.15 --- PyMethod.java 6 Aug 2003 11:46:26 -0000 2.16 *************** *** 125,131 **** PyMethod mother = (PyMethod)other; if (im_self != mother.im_self) ! return Py.id(im_self) < Py.id(mother.im_self) ? -1 : 1; if (im_func != mother.im_func) ! return Py.id(im_func) < Py.id(mother.im_func) ? -1 : 1; return 0; } --- 125,133 ---- PyMethod mother = (PyMethod)other; if (im_self != mother.im_self) ! return System.identityHashCode(im_self) < ! System.identityHashCode(mother.im_self) ? -1 : 1; if (im_func != mother.im_func) ! return System.identityHashCode(im_func) < ! System.identityHashCode(mother.im_func) ? -1 : 1; return 0; } *************** *** 147,151 **** return "<method " + classname + "." + __name__ + " of " + im_self.__class__.__name__ + ! " instance at " + Py.id(im_self) + ">"; } } --- 149,153 ---- return "<method " + classname + "." + __name__ + " of " + im_self.__class__.__name__ + ! " instance " + Py.idstr(im_self) + ">"; } } Index: PyJavaClass.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyJavaClass.java,v retrieving revision 2.41 retrieving revision 2.42 diff -C2 -d -r2.41 -r2.42 *** PyJavaClass.java 6 Nov 2002 14:53:47 -0000 2.41 --- PyJavaClass.java 6 Aug 2003 11:46:26 -0000 2.42 *************** *** 860,864 **** public String toString() { ! return "<jclass "+__name__+" at "+Py.id(this)+">"; } } --- 860,864 ---- public String toString() { ! return "<jclass "+__name__+" "+Py.idstr(this)+">"; } } Index: PyInstance.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyInstance.java,v retrieving revision 2.32 retrieving revision 2.33 diff -C2 -d -r2.32 -r2.33 *** PyInstance.java 6 Nov 2002 08:16:46 -0000 2.32 --- PyInstance.java 6 Aug 2003 11:46:26 -0000 2.33 *************** *** 386,390 **** } return new PyString("<"+smod+__class__.__name__+ ! " instance at "+Py.id(this)+">"); } --- 386,390 ---- } return new PyString("<"+smod+__class__.__name__+ ! " instance "+Py.idstr(this)+">"); } Index: PyObject.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyObject.java,v retrieving revision 2.29 retrieving revision 2.30 diff -C2 -d -r2.29 -r2.30 *** PyObject.java 9 Apr 2003 13:51:14 -0000 2.29 --- PyObject.java 6 Aug 2003 11:46:26 -0000 2.30 *************** *** 162,166 **** public int hashCode() { ! return Py.id(this); } --- 162,166 ---- public int hashCode() { ! return System.identityHashCode(this); } *************** *** 1058,1066 **** if (itmp == 0) ! return Py.id(this) < Py.id(o2_in) ? -1 : 1; if (itmp != -2) return itmp; ! return ! Py.id(this.__class__) < Py.id(o2_in.__class__) ? -1 : 1; } --- 1058,1067 ---- if (itmp == 0) ! return System.identityHashCode(this) < ! System.identityHashCode(o2_in) ? -1 : 1; if (itmp != -2) return itmp; ! return System.identityHashCode(this.__class__) < ! System.identityHashCode(o2_in.__class__) ? -1 : 1; } Index: PyReflectedConstructor.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyReflectedConstructor.java,v retrieving revision 2.9 retrieving revision 2.10 diff -C2 -d -r2.9 -r2.10 *** PyReflectedConstructor.java 28 Oct 2001 17:13:43 -0000 2.9 --- PyReflectedConstructor.java 6 Aug 2003 11:46:26 -0000 2.10 *************** *** 166,170 **** public String toString() { //printArgs(); ! return "<java constructor "+__name__+" at "+Py.id(this)+">"; } } --- 166,170 ---- public String toString() { //printArgs(); ! return "<java constructor "+__name__+" "+Py.idstr(this)+">"; } } Index: PyReflectedFunction.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyReflectedFunction.java,v retrieving revision 2.9 retrieving revision 2.10 diff -C2 -d -r2.9 -r2.10 *** PyReflectedFunction.java 28 Oct 2001 17:13:43 -0000 2.9 --- PyReflectedFunction.java 6 Aug 2003 11:46:26 -0000 2.10 *************** *** 335,339 **** public String toString() { //printArgs(); ! return "<java function "+__name__+" at "+Py.id(this)+">"; } } --- 335,339 ---- public String toString() { //printArgs(); ! return "<java function "+__name__+" "+Py.idstr(this)+">"; } } Index: __builtin__.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/__builtin__.java,v retrieving revision 2.56 retrieving revision 2.57 diff -C2 -d -r2.56 -r2.57 *** __builtin__.java 18 May 2003 22:32:54 -0000 2.56 --- __builtin__.java 6 Aug 2003 11:46:26 -0000 2.57 *************** *** 405,409 **** } ! public static int id(PyObject o) { return Py.id(o); } --- 405,409 ---- } ! public static long id(PyObject o) { return Py.id(o); } Index: PyModule.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyModule.java,v retrieving revision 2.14 retrieving revision 2.15 diff -C2 -d -r2.14 -r2.15 *** PyModule.java 27 Nov 2001 13:51:37 -0000 2.14 --- PyModule.java 6 Aug 2003 11:46:26 -0000 2.15 *************** *** 79,84 **** public String toString() { ! return "<module "+__dict__.__finditem__("__name__")+" at "+ ! Py.id(this)+">"; } --- 79,84 ---- public String toString() { ! return "<module "+__dict__.__finditem__("__name__")+" "+ ! Py.idstr(this)+">"; } Index: PyBeanEvent.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyBeanEvent.java,v retrieving revision 2.2 retrieving revision 2.3 diff -C2 -d -r2.2 -r2.3 *** PyBeanEvent.java 28 Oct 2001 17:13:43 -0000 2.2 --- PyBeanEvent.java 6 Aug 2003 11:46:26 -0000 2.3 *************** *** 38,42 **** public String toString() { return "<beanEvent "+__name__+" for event "+ ! eventClass.toString()+" at "+hashCode()+">"; } } --- 38,42 ---- public String toString() { return "<beanEvent "+__name__+" for event "+ ! eventClass.toString()+" "+Py.idstr(this)+">"; } } Index: PyJavaPackage.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyJavaPackage.java,v retrieving revision 2.17 retrieving revision 2.18 diff -C2 -d -r2.17 -r2.18 *** PyJavaPackage.java 21 Dec 2001 00:18:12 -0000 2.17 --- PyJavaPackage.java 6 Aug 2003 11:46:26 -0000 2.18 *************** *** 175,179 **** public String toString() { ! return "<java package "+__name__+" at "+Py.id(this)+">"; } } --- 175,179 ---- public String toString() { ! return "<java package "+__name__+" "+Py.idstr(this)+">"; } } Index: PyTableCode.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyTableCode.java,v retrieving revision 2.21 retrieving revision 2.22 diff -C2 -d -r2.21 -r2.22 *** PyTableCode.java 18 May 2003 22:32:54 -0000 2.21 --- PyTableCode.java 6 Aug 2003 11:46:26 -0000 2.22 *************** *** 428,432 **** public String toString() { ! return "<code object " + co_name + " at " + hashCode() + ", file \"" + co_filename + "\", line " + co_firstlineno + ">"; --- 428,432 ---- public String toString() { ! return "<code object " + co_name + " "+Py.idstr(this) + ", file \"" + co_filename + "\", line " + co_firstlineno + ">"; Index: Py.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/Py.java,v retrieving revision 2.69 retrieving revision 2.70 diff -C2 -d -r2.69 -r2.70 *** Py.java 18 May 2003 22:34:41 -0000 2.69 --- Py.java 6 Aug 2003 11:46:26 -0000 2.70 *************** *** 1691,1702 **** } ! public static int id(PyObject o) { ! if (o instanceof PyJavaInstance) { ! return System.identityHashCode(((PyJavaInstance)o).javaProxy); ! } else { ! return System.identityHashCode(o); ! } ! } public static String safeRepr(PyObject o) { return o.safeRepr(); --- 1691,1708 ---- } ! private static IdImpl idimpl = IdImpl.getInstance(); + public static long id(PyObject o) { + return idimpl.id(o); + } + + public static String idstr(PyObject o) { + return idimpl.idstr(o); + } + + public static long java_obj_id(Object o) { + return idimpl.java_obj_id(o); + } + public static String safeRepr(PyObject o) { return o.safeRepr(); |