From: Finn B. <bc...@us...> - 2002-01-07 20:07:58
|
Update of /cvsroot/jython/jython/org/python/core In directory usw-pr-cvs1:/tmp/cvs-serv9016 Modified Files: PyInstance.java Log Message: Support iteration over java instances. Index: PyInstance.java =================================================================== RCS file: /cvsroot/jython/jython/org/python/core/PyInstance.java,v retrieving revision 2.29 retrieving revision 2.30 diff -C2 -d -r2.29 -r2.30 *** PyInstance.java 2002/01/06 21:19:13 2.29 --- PyInstance.java 2002/01/07 20:07:53 2.30 *************** *** 2,5 **** --- 2,6 ---- package org.python.core; import java.util.Hashtable; + import java.util.StringTokenizer; import java.io.Serializable; *************** *** 602,605 **** --- 603,610 ---- public PyObject __iter__() { + PyObject iter = getCollectionIter(); + if (iter != null) { + return iter; + } PyObject func = __findattr__("__iter__"); if (func != null) *************** *** 623,626 **** --- 628,665 ---- } throw Py.TypeError("instance has no next() method"); + } + + private static CollectionIter[] iterFactories = null; + + private PyObject getCollectionIter() { + if (iterFactories == null) + initializeIterators(); + for (int i = 0; iterFactories[i] != null; i++) { + PyObject iter = iterFactories[i].findCollection(javaProxy); + if (iter != null) + return iter; + } + return null; + } + + private static synchronized void initializeIterators() { + if (iterFactories != null) + return; + String factories = "org.python.core.CollectionIter," + + "org.python.core.CollectionIter2," + + Py.getSystemState().registry.getProperty( + "python.collections", ""); + int i = 0; + StringTokenizer st = new StringTokenizer(factories, ","); + iterFactories = new CollectionIter[st.countTokens() + 1]; + while (st.hasMoreTokens()) { + String s = st.nextToken(); + try { + Class factoryClass = Class.forName(s); + CollectionIter factory = + (CollectionIter)factoryClass.newInstance(); + iterFactories[i++] = factory; + } catch (Throwable t) { } + } } |