From: <pj...@us...> - 2008-07-21 01:43:27
|
Revision: 4977 http://jython.svn.sourceforge.net/jython/?rev=4977&view=rev Author: pjenvey Date: 2008-07-21 01:43:14 +0000 (Mon, 21 Jul 2008) Log Message: ----------- add PyFastSequenceIter (for list and tuple) which calls final seq___finditem__. whereas PySequenceIter calls __finditem__ which may be overridden by subclasses Modified Paths: -------------- trunk/jython/src/org/python/core/PyList.java trunk/jython/src/org/python/core/PySequenceIter.java trunk/jython/src/org/python/core/PyTuple.java Added Paths: ----------- trunk/jython/src/org/python/core/PyFastSequenceIter.java Added: trunk/jython/src/org/python/core/PyFastSequenceIter.java =================================================================== --- trunk/jython/src/org/python/core/PyFastSequenceIter.java (rev 0) +++ trunk/jython/src/org/python/core/PyFastSequenceIter.java 2008-07-21 01:43:14 UTC (rev 4977) @@ -0,0 +1,27 @@ +/* Copyright (c) Jython Developers */ +package org.python.core; + +/** + * Sequence iterator specialized for accessing the underlying sequence directly. + */ +public class PyFastSequenceIter extends PyIterator { + + private PySequence seq; + + private int index = 0; + + public PyFastSequenceIter(PySequence seq) { + this.seq = seq; + } + + public PyObject __iternext__() { + try { + return seq.seq___finditem__(index++); + } catch (PyException exc) { + if (Py.matchException(exc, Py.StopIteration)) { + return null; + } + throw exc; + } + } +} Modified: trunk/jython/src/org/python/core/PyList.java =================================================================== --- trunk/jython/src/org/python/core/PyList.java 2008-07-21 01:38:17 UTC (rev 4976) +++ trunk/jython/src/org/python/core/PyList.java 2008-07-21 01:43:14 UTC (rev 4977) @@ -391,9 +391,13 @@ return seq___nonzero__(); } + public PyObject __iter__() { + return list___iter__(); + } + @ExposedMethod public PyObject list___iter__() { - return seq___iter__(); + return new PyFastSequenceIter(this); } @ExposedMethod(defaults = "null") Modified: trunk/jython/src/org/python/core/PySequenceIter.java =================================================================== --- trunk/jython/src/org/python/core/PySequenceIter.java 2008-07-21 01:38:17 UTC (rev 4976) +++ trunk/jython/src/org/python/core/PySequenceIter.java 2008-07-21 01:43:14 UTC (rev 4977) @@ -1,23 +1,27 @@ +/* Copyright (c) Jython Developers */ package org.python.core; +/** + * General sequence iterator. + */ public class PySequenceIter extends PyIterator { + private PyObject seq; - private int idx; + private int index = 0; + public PySequenceIter(PyObject seq) { this.seq = seq; - this.idx = 0; } public PyObject __iternext__() { try { - return seq.__finditem__(idx++); + return seq.__finditem__(index++); } catch (PyException exc) { - if (Py.matchException(exc, Py.StopIteration)) + if (Py.matchException(exc, Py.StopIteration)) { return null; + } throw exc; } } - } - Modified: trunk/jython/src/org/python/core/PyTuple.java =================================================================== --- trunk/jython/src/org/python/core/PyTuple.java 2008-07-21 01:38:17 UTC (rev 4976) +++ trunk/jython/src/org/python/core/PyTuple.java 2008-07-21 01:43:14 UTC (rev 4977) @@ -191,9 +191,13 @@ return repeat(count); } + public PyObject __iter__() { + return tuple___iter__(); + } + @ExposedMethod public PyObject tuple___iter__() { - return seq___iter__(); + return new PyFastSequenceIter(this); } @ExposedMethod(defaults = "null") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |