From: <pj...@us...> - 2008-08-09 06:17:46
|
Revision: 5116 http://jython.svn.sourceforge.net/jython/?rev=5116&view=rev Author: pjenvey Date: 2008-08-09 06:17:43 +0000 (Sat, 09 Aug 2008) Log Message: ----------- o re-integrate list_tests workaround and use stock 2.5 seq_tests o fix list.index handling of long start values and slice assignment of strings o raise MemoryErrors as per seq_tests.test_bigrepeat Modified Paths: -------------- branches/asm/Lib/test/list_tests.py branches/asm/src/org/python/core/PyList.java branches/asm/src/org/python/core/PyTuple.java Removed Paths: ------------- branches/asm/Lib/test/seq_tests.py Modified: branches/asm/Lib/test/list_tests.py =================================================================== --- branches/asm/Lib/test/list_tests.py 2008-08-09 06:12:17 UTC (rev 5115) +++ branches/asm/Lib/test/list_tests.py 2008-08-09 06:17:43 UTC (rev 5116) @@ -461,7 +461,11 @@ u += "eggs" self.assertEqual(u, self.type2test("spameggs")) - self.assertRaises(TypeError, u.__iadd__, None) + if not test_support.is_jython: + self.assertRaises(TypeError, u.__iadd__, None) + else: + import operator + self.assertRaises(TypeError, operator.__iadd__, u, None) def test_imul(self): u = self.type2test([0, 1]) @@ -512,7 +516,8 @@ a[::2] = tuple(range(5)) self.assertEqual(a, self.type2test([0, 1, 1, 3, 2, 5, 3, 7, 4, 9])) - def test_constructor_exception_handling(self): + # XXX: CPython specific, PyList doesn't len() during init + def _test_constructor_exception_handling(self): # Bug #1242657 class F(object): def __iter__(self): Deleted: branches/asm/Lib/test/seq_tests.py =================================================================== --- branches/asm/Lib/test/seq_tests.py 2008-08-09 06:12:17 UTC (rev 5115) +++ branches/asm/Lib/test/seq_tests.py 2008-08-09 06:17:43 UTC (rev 5116) @@ -1,207 +0,0 @@ -# From Python 2.4.4 -""" -Tests common to tuple, list and UserList.UserList -""" - -import unittest -from test import test_support - -class CommonTest(unittest.TestCase): - # The type to be tested - type2test = None - - def test_constructors(self): - l0 = [] - l1 = [0] - l2 = [0, 1] - - u = self.type2test() - u0 = self.type2test(l0) - u1 = self.type2test(l1) - u2 = self.type2test(l2) - - uu = self.type2test(u) - uu0 = self.type2test(u0) - uu1 = self.type2test(u1) - uu2 = self.type2test(u2) - - v = self.type2test(tuple(u)) - class OtherSeq: - def __init__(self, initseq): - self.__data = initseq - def __len__(self): - return len(self.__data) - def __getitem__(self, i): - return self.__data[i] - s = OtherSeq(u0) - v0 = self.type2test(s) - self.assertEqual(len(v0), len(s)) - - s = "this is also a sequence" - vv = self.type2test(s) - self.assertEqual(len(vv), len(s)) - - def test_truth(self): - self.assert_(not self.type2test()) - self.assert_(self.type2test([42])) - - def test_getitem(self): - u = self.type2test([0, 1, 2, 3, 4]) - for i in xrange(len(u)): - self.assertEqual(u[i], i) - self.assertEqual(u[long(i)], i) - for i in xrange(-len(u), -1): - self.assertEqual(u[i], len(u)+i) - self.assertEqual(u[long(i)], len(u)+i) - self.assertRaises(IndexError, u.__getitem__, -len(u)-1) - self.assertRaises(IndexError, u.__getitem__, len(u)) - self.assertRaises(ValueError, u.__getitem__, slice(0,10,0)) - - u = self.type2test() - self.assertRaises(IndexError, u.__getitem__, 0) - self.assertRaises(IndexError, u.__getitem__, -1) - - self.assertRaises(TypeError, u.__getitem__) - - a = self.type2test([10, 11]) - self.assertEqual(a[0], 10) - self.assertEqual(a[1], 11) - self.assertEqual(a[-2], 10) - self.assertEqual(a[-1], 11) - self.assertRaises(IndexError, a.__getitem__, -3) - self.assertRaises(IndexError, a.__getitem__, 3) - - def test_getslice(self): - l = [0, 1, 2, 3, 4] - u = self.type2test(l) - - self.assertEqual(u[0:0], self.type2test()) - self.assertEqual(u[1:2], self.type2test([1])) - self.assertEqual(u[-2:-1], self.type2test([3])) - self.assertEqual(u[-1000:1000], u) - self.assertEqual(u[1000:-1000], self.type2test([])) - self.assertEqual(u[:], u) - self.assertEqual(u[1:None], self.type2test([1, 2, 3, 4])) - self.assertEqual(u[None:3], self.type2test([0, 1, 2])) - - # Extended slices - self.assertEqual(u[::], u) - self.assertEqual(u[::2], self.type2test([0, 2, 4])) - self.assertEqual(u[1::2], self.type2test([1, 3])) - self.assertEqual(u[::-1], self.type2test([4, 3, 2, 1, 0])) - self.assertEqual(u[::-2], self.type2test([4, 2, 0])) - self.assertEqual(u[3::-2], self.type2test([3, 1])) - self.assertEqual(u[3:3:-2], self.type2test([])) - self.assertEqual(u[3:2:-2], self.type2test([3])) - self.assertEqual(u[3:1:-2], self.type2test([3])) - self.assertEqual(u[3:0:-2], self.type2test([3, 1])) - self.assertEqual(u[::-100], self.type2test([4])) - self.assertEqual(u[100:-100:], self.type2test([])) - self.assertEqual(u[-100:100:], u) - self.assertEqual(u[100:-100:-1], u[::-1]) - self.assertEqual(u[-100:100:-1], self.type2test([])) - self.assertEqual(u[-100L:100L:2L], self.type2test([0, 2, 4])) - - # Test extreme cases with long ints - a = self.type2test([0,1,2,3,4]) - self.assertEqual(a[ -pow(2,128L): 3 ], self.type2test([0,1,2])) - self.assertEqual(a[ 3: pow(2,145L) ], self.type2test([3,4])) - - self.assertRaises(TypeError, u.__getslice__) - - def test_contains(self): - u = self.type2test([0, 1, 2]) - for i in u: - self.assert_(i in u) - for i in min(u)-1, max(u)+1: - self.assert_(i not in u) - - self.assertRaises(TypeError, u.__contains__) - - def test_len(self): - self.assertEqual(len(self.type2test()), 0) - self.assertEqual(len(self.type2test([])), 0) - self.assertEqual(len(self.type2test([0])), 1) - self.assertEqual(len(self.type2test([0, 1, 2])), 3) - - def test_minmax(self): - u = self.type2test([0, 1, 2]) - self.assertEqual(min(u), 0) - self.assertEqual(max(u), 2) - - def test_addmul(self): - u1 = self.type2test([0]) - u2 = self.type2test([0, 1]) - self.assertEqual(u1, u1 + self.type2test()) - self.assertEqual(u1, self.type2test() + u1) - self.assertEqual(u1 + self.type2test([1]), u2) - self.assertEqual(self.type2test([-1]) + u1, self.type2test([-1, 0])) - self.assertEqual(self.type2test(), u2*0) - self.assertEqual(self.type2test(), 0*u2) - self.assertEqual(self.type2test(), u2*0L) - self.assertEqual(self.type2test(), 0L*u2) - self.assertEqual(u2, u2*1) - self.assertEqual(u2, 1*u2) - self.assertEqual(u2, u2*1L) - self.assertEqual(u2, 1L*u2) - self.assertEqual(u2+u2, u2*2) - self.assertEqual(u2+u2, 2*u2) - self.assertEqual(u2+u2, u2*2L) - self.assertEqual(u2+u2, 2L*u2) - self.assertEqual(u2+u2+u2, u2*3) - self.assertEqual(u2+u2+u2, 3*u2) - - class subclass(self.type2test): - pass - u3 = subclass([0, 1]) - self.assertEqual(u3, u3*1) - self.assert_(u3 is not u3*1) - - def test_iadd(self): - u = self.type2test([0, 1]) - u += self.type2test() - self.assertEqual(u, self.type2test([0, 1])) - u += self.type2test([2, 3]) - self.assertEqual(u, self.type2test([0, 1, 2, 3])) - u += self.type2test([4, 5]) - self.assertEqual(u, self.type2test([0, 1, 2, 3, 4, 5])) - - u = self.type2test("spam") - u += self.type2test("eggs") - self.assertEqual(u, self.type2test("spameggs")) - - def test_imul(self): - u = self.type2test([0, 1]) - u *= 3 - self.assertEqual(u, self.type2test([0, 1, 0, 1, 0, 1])) - - def test_getitemoverwriteiter(self): - # Verify that __getitem__ overrides are not recognized by __iter__ - class T(self.type2test): - def __getitem__(self, key): - return str(key) + '!!!' - self.assertEqual(iter(T((1,2))).next(), 1) - - def test_repeat(self): - for m in xrange(4): - s = tuple(range(m)) - for n in xrange(-3, 5): - self.assertEqual(self.type2test(s*n), self.type2test(s)*n) - self.assertEqual(self.type2test(s)*(-4), self.type2test([])) - self.assertEqual(id(s), id(s*1)) - - def test_subscript(self): - a = self.type2test([10, 11]) - self.assertEqual(a.__getitem__(0L), 10) - self.assertEqual(a.__getitem__(1L), 11) - self.assertEqual(a.__getitem__(-2L), 10) - self.assertEqual(a.__getitem__(-1L), 11) - self.assertRaises(IndexError, a.__getitem__, -3) - self.assertRaises(IndexError, a.__getitem__, 3) - self.assertEqual(a.__getitem__(slice(0,1)), self.type2test([10])) - self.assertEqual(a.__getitem__(slice(1,2)), self.type2test([11])) - self.assertEqual(a.__getitem__(slice(0,2)), self.type2test([10, 11])) - self.assertEqual(a.__getitem__(slice(0,3)), self.type2test([10, 11])) - self.assertEqual(a.__getitem__(slice(3,5)), self.type2test([])) - self.assertRaises(ValueError, a.__getitem__, slice(0, 10, 0)) - self.assertRaises(TypeError, a.__getitem__, 'x') Modified: branches/asm/src/org/python/core/PyList.java =================================================================== --- branches/asm/src/org/python/core/PyList.java 2008-08-09 06:12:17 UTC (rev 5115) +++ branches/asm/src/org/python/core/PyList.java 2008-08-09 06:17:43 UTC (rev 5116) @@ -153,20 +153,17 @@ if(step == 1) { PyObject[] otherArray; PyObject[] array = getArray(); - if(value instanceof PySequenceList) { - PySequenceList seqList = (PySequenceList) value; - otherArray = seqList.getArray(); - if(otherArray == array) { - otherArray = otherArray.clone(); - } - list.replaceSubArray(start, stop, otherArray, 0, seqList.size()); + + int n = value.__len__(); + if (value instanceof PySequenceList) { + otherArray = ((PySequenceList)value).getArray(); } else { - int n = value.__len__(); - list.ensureCapacity(start + n); - for(int i = 0; i < n; i++) { - list.add(i + start, value.pyget(i)); - } + otherArray = Py.unpackSequence(value, value.__len__()); } + if (otherArray == array) { + otherArray = otherArray.clone(); + } + list.replaceSubArray(start, stop, otherArray, 0, n); } else if(step > 1) { int n = value.__len__(); for(int i = 0, j = 0; i < n; i++, j += step) { @@ -213,15 +210,21 @@ } protected PyObject repeat(int count) { - if(count < 0) { + if (count < 0) { count = 0; } - int l = size(); - PyObject[] newList = new PyObject[l * count]; + int size = size(); + int newSize = size * count; + if (count != 0 && newSize / count != size) { + throw Py.MemoryError(""); + } + + PyObject[] array = getArray(); + PyObject[] newArray = new PyObject[newSize]; for(int i = 0; i < count; i++) { - System.arraycopy(getArray(), 0, newList, i * l, l); + System.arraycopy(array, 0, newArray, i * size, size); } - return new PyList(newList); + return new PyList(newArray); } @ExposedMethod(type = MethodType.BINARY) @@ -264,16 +267,29 @@ return null; } int count = o.asIndex(Py.OverflowError); - int l = size(); - - int newSize = l * count; + + int size = size(); + if (size == 0 || count == 1) { + return this; + } + + if (count < 1) { + clear(); + return this; + } + + if (size > Integer.MAX_VALUE / count) { + throw Py.MemoryError(""); + } + + int newSize = size * count; list.setSize(newSize); PyObject[] array = getArray(); for (int i = 1; i < count; i++) { - System.arraycopy(array, 0, array, i * l, l); + System.arraycopy(array, 0, array, i * size, size); } gListAllocatedStatus = __len__(); - return this; + return this; } @Override @@ -486,24 +502,24 @@ } public int index(PyObject o, int start) { - return list_index(o, start, null); + return list_index(o, start, size()); } public int index(PyObject o, int start, int stop) { - return list_index(o, start, Py.newInteger(stop)); + return list_index(o, start, stop); } - @ExposedMethod(defaults = {"0", "null"}) - final int list_index(PyObject o, int start, PyObject stop) { - int iStop; - if(stop == null) { - iStop = size(); - } else { - iStop = stop.asInt(); - } - return _index(o, "list.index(x): x not in list", start, iStop); + @ExposedMethod(defaults = {"null", "null"}) + final int list_index(PyObject o, PyObject start, PyObject stop) { + int startInt = start == null ? 0 : PySlice.calculateSliceIndex(start); + int stopInt = stop == null ? size() : PySlice.calculateSliceIndex(stop); + return list_index(o, startInt, stopInt); } + final int list_index(PyObject o, int start, int stop) { + return _index(o, "list.index(x): x not in list", start, stop); + } + final int list_index(PyObject o, int start) { return _index(o, "list.index(x): x not in list", start, size()); } Modified: branches/asm/src/org/python/core/PyTuple.java =================================================================== --- branches/asm/src/org/python/core/PyTuple.java 2008-08-09 06:12:17 UTC (rev 5115) +++ branches/asm/src/org/python/core/PyTuple.java 2008-08-09 06:17:43 UTC (rev 5116) @@ -92,20 +92,26 @@ if (count < 0) { count = 0; } - if (size() == 0 || count == 1) { + int size = size(); + if (size == 0 || count == 1) { if (getType() == TYPE) { // Since tuples are immutable, we can return a shared copy in this case return this; } - if (size() == 0) { + if (size == 0) { return new PyTuple(); } } + + int newSize = size * count; + if (newSize / size != count) { + throw Py.MemoryError(""); + } + PyObject[] array = getArray(); - int l = size(); - PyObject[] newArray = new PyObject[l*count]; - for (int i=0; i<count; i++) { - System.arraycopy(array, 0, newArray, i*l, l); + PyObject[] newArray = new PyObject[newSize]; + for (int i = 0; i < count; i++) { + System.arraycopy(array, 0, newArray, i * size, size); } return new PyTuple(newArray); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |