From: <zy...@us...> - 2009-02-14 19:17:07
|
Revision: 6030 http://jython.svn.sourceforge.net/jython/?rev=6030&view=rev Author: zyasoft Date: 2009-02-14 19:17:04 +0000 (Sat, 14 Feb 2009) Log Message: ----------- Fixed UNPACK_SEQUENCE so that ValueError is raised if too few/too many values to unpack. Modified Paths: -------------- branches/pbcvm/src/org/python/core/PyBytecode.java Modified: branches/pbcvm/src/org/python/core/PyBytecode.java =================================================================== --- branches/pbcvm/src/org/python/core/PyBytecode.java 2009-02-14 11:58:48 UTC (rev 6029) +++ branches/pbcvm/src/org/python/core/PyBytecode.java 2009-02-14 19:17:04 UTC (rev 6030) @@ -734,22 +734,10 @@ f.dellocal(co_names[oparg]); break; - case Opcode.UNPACK_SEQUENCE: { - PyObject v = stack.pop(); - int i = 0; - PyObject items[] = new PyObject[oparg]; - for (PyObject item : v.asIterable()) { - items[i++] = item; - if (i > oparg) { - break; - } - } - for (i = i - 1; i >= 0; i--) { - stack.push(items[i]); - } + case Opcode.UNPACK_SEQUENCE: + unpack_iterable(oparg, stack); break; - } - + case Opcode.STORE_ATTR: { PyObject obj = stack.pop(); PyObject v = stack.pop(); @@ -1319,6 +1307,26 @@ stack.push(callable._callextra(args, keywords, starargs, kwargs)); } + private static void unpack_iterable(int oparg, PyStack stack) { + PyObject v = stack.pop(); + int i = oparg; + PyObject items[] = new PyObject[oparg]; + for (PyObject item : v.asIterable()) { + if (i <= 0) { + throw Py.ValueError("too many values to unpack"); + } + i--; + items[i] = item; + } + if (i > 0) { + throw Py.ValueError(String.format("need more than %d value%s to unpack", + i, i == 1 ? "" : "s")); + } + for (i = 0; i < oparg; i++) { + stack.push(items[i]); + } + } + // XXX - perhaps add support for max stack size (presumably from co_stacksize) // and capacity hints private class PyStack { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |