org.python.core.PyCallIter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython-slim Show documentation
Show all versions of jython-slim Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
package org.python.core;
public class PyCallIter extends PyIterator {
//note: Already implements Traverseproc, inheriting it from PyIterator
private PyObject callable;
private PyObject sentinel;
public PyCallIter(PyObject callable, PyObject sentinel) {
if (!callable.isCallable()) {
throw Py.TypeError("iter(v, w): v must be callable");
}
this.callable = callable;
this.sentinel = sentinel;
}
public PyObject __iternext__() {
if (callable == null) {
return null;
}
PyObject result;
try {
result = callable.__call__();
} catch (PyException exc) {
if (exc.match(Py.StopIteration)) {
callable = null;
stopException = exc;
return null;
}
throw exc;
}
if (result._eq(sentinel).__nonzero__()) {
callable = null;
return null;
}
return result;
}
/* Traverseproc implementation */
@Override
public int traverse(Visitproc visit, Object arg) {
int retValue = super.traverse(visit, arg);
if (retValue != 0) {
return retValue;
}
if (callable != null) {
retValue = visit.visit(callable, arg);
if (retValue != 0) {
return retValue;
}
}
return sentinel != null ? visit.visit(sentinel, arg) : 0;
}
@Override
public boolean refersDirectlyTo(PyObject ob) {
return ob != null && (ob == callable || ob == sentinel || super.refersDirectlyTo(ob));
}
}