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) { }
+ }
}
|