mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	The endless 460020 bug.
Disable t[:], t*0, t*1 optimizations when t is of a tuple subclass type.
This commit is contained in:
		
							parent
							
								
									f0b0f680fe
								
							
						
					
					
						commit
						7b07a41e9f
					
				
					 2 changed files with 18 additions and 6 deletions
				
			
		| 
						 | 
					@ -1417,9 +1417,18 @@ def rev(self):
 | 
				
			||||||
    a = madtuple((1,2,3,4,5))
 | 
					    a = madtuple((1,2,3,4,5))
 | 
				
			||||||
    verify(tuple(a) == (1,2,3,4,5))
 | 
					    verify(tuple(a) == (1,2,3,4,5))
 | 
				
			||||||
    verify(tuple(a).__class__ is tuple)
 | 
					    verify(tuple(a).__class__ is tuple)
 | 
				
			||||||
 | 
					    verify(a[:].__class__ is tuple)
 | 
				
			||||||
 | 
					    verify((a * 1).__class__ is tuple)
 | 
				
			||||||
 | 
					    verify((a * 0).__class__ is tuple)
 | 
				
			||||||
 | 
					    verify((a + ()).__class__ is tuple)
 | 
				
			||||||
    a = madtuple(())
 | 
					    a = madtuple(())
 | 
				
			||||||
    verify(tuple(a) == ())
 | 
					    verify(tuple(a) == ())
 | 
				
			||||||
    verify(tuple(a).__class__ is tuple)
 | 
					    verify(tuple(a).__class__ is tuple)
 | 
				
			||||||
 | 
					    verify((a + a).__class__ is tuple)
 | 
				
			||||||
 | 
					    verify((a * 0).__class__ is tuple)
 | 
				
			||||||
 | 
					    verify((a * 1).__class__ is tuple)
 | 
				
			||||||
 | 
					    verify((a * 2).__class__ is tuple)
 | 
				
			||||||
 | 
					    verify(a[:].__class__ is tuple)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class madstring(str):
 | 
					    class madstring(str):
 | 
				
			||||||
        _rev = None
 | 
					        _rev = None
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -298,8 +298,7 @@ tupleslice(register PyTupleObject *a, register int ilow, register int ihigh)
 | 
				
			||||||
		ihigh = a->ob_size;
 | 
							ihigh = a->ob_size;
 | 
				
			||||||
	if (ihigh < ilow)
 | 
						if (ihigh < ilow)
 | 
				
			||||||
		ihigh = ilow;
 | 
							ihigh = ilow;
 | 
				
			||||||
	if (ilow == 0 && ihigh == a->ob_size) {
 | 
						if (ilow == 0 && ihigh == a->ob_size && PyTuple_CheckExact(a)) {
 | 
				
			||||||
		/* XXX can only do this if tuples are immutable! */
 | 
					 | 
				
			||||||
		Py_INCREF(a);
 | 
							Py_INCREF(a);
 | 
				
			||||||
		return (PyObject *)a;
 | 
							return (PyObject *)a;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -366,11 +365,15 @@ tuplerepeat(PyTupleObject *a, int n)
 | 
				
			||||||
	if (n < 0)
 | 
						if (n < 0)
 | 
				
			||||||
		n = 0;
 | 
							n = 0;
 | 
				
			||||||
	if (a->ob_size == 0 || n == 1) {
 | 
						if (a->ob_size == 0 || n == 1) {
 | 
				
			||||||
 | 
							if (PyTuple_CheckExact(a)) {
 | 
				
			||||||
			/* Since tuples are immutable, we can return a shared
 | 
								/* Since tuples are immutable, we can return a shared
 | 
				
			||||||
			   copy in this case */
 | 
								   copy in this case */
 | 
				
			||||||
			Py_INCREF(a);
 | 
								Py_INCREF(a);
 | 
				
			||||||
			return (PyObject *)a;
 | 
								return (PyObject *)a;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (a->ob_size == 0)
 | 
				
			||||||
 | 
								return PyTuple_New(0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	size = a->ob_size * n;
 | 
						size = a->ob_size * n;
 | 
				
			||||||
	if (size/a->ob_size != n)
 | 
						if (size/a->ob_size != n)
 | 
				
			||||||
		return PyErr_NoMemory();
 | 
							return PyErr_NoMemory();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue