mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	#5057: Merge with 3.2.
This commit is contained in:
		
						commit
						e1adeeb7fd
					
				
					 3 changed files with 41 additions and 1 deletions
				
			
		| 
						 | 
					@ -205,6 +205,24 @@ class TestTranforms(unittest.TestCase):
 | 
				
			||||||
        asm = dis_single('a="x"*1000')
 | 
					        asm = dis_single('a="x"*1000')
 | 
				
			||||||
        self.assertIn('(1000)', asm)
 | 
					        self.assertIn('(1000)', asm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_binary_subscr_on_unicode(self):
 | 
				
			||||||
 | 
					        # valid code get optimized
 | 
				
			||||||
 | 
					        asm = dis_single('"foo"[0]')
 | 
				
			||||||
 | 
					        self.assertIn("('f')", asm)
 | 
				
			||||||
 | 
					        self.assertNotIn('BINARY_SUBSCR', asm)
 | 
				
			||||||
 | 
					        asm = dis_single('"\u0061\uffff"[1]')
 | 
				
			||||||
 | 
					        self.assertIn("('\\uffff')", asm)
 | 
				
			||||||
 | 
					        self.assertNotIn('BINARY_SUBSCR', asm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # invalid code doesn't get optimized
 | 
				
			||||||
 | 
					        # out of range
 | 
				
			||||||
 | 
					        asm = dis_single('"fuu"[10]')
 | 
				
			||||||
 | 
					        self.assertIn('BINARY_SUBSCR', asm)
 | 
				
			||||||
 | 
					        # non-BMP char (see #5057)
 | 
				
			||||||
 | 
					        asm = dis_single('"\U00012345"[0]')
 | 
				
			||||||
 | 
					        self.assertIn('BINARY_SUBSCR', asm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_folding_of_unaryops_on_constants(self):
 | 
					    def test_folding_of_unaryops_on_constants(self):
 | 
				
			||||||
        for line, elem in (
 | 
					        for line, elem in (
 | 
				
			||||||
            ('-0.5', '(-0.5)'),                     # unary negative
 | 
					            ('-0.5', '(-0.5)'),                     # unary negative
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,10 @@ What's New in Python 3.3 Alpha 1?
 | 
				
			||||||
Core and Builtins
 | 
					Core and Builtins
 | 
				
			||||||
-----------------
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Issue #5057: fix a bug in the peepholer that led to non-portable pyc files
 | 
				
			||||||
 | 
					  between narrow and wide builds while optimizing BINARY_SUBSCR on non-BMP
 | 
				
			||||||
 | 
					  chars (e.g. "\U00012345"[0]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Issue #11845: Fix typo in rangeobject.c that caused a crash in
 | 
					- Issue #11845: Fix typo in rangeobject.c that caused a crash in
 | 
				
			||||||
  compute_slice_indices.  Patch by Daniel Urban.
 | 
					  compute_slice_indices.  Patch by Daniel Urban.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -183,6 +183,24 @@ fold_binops_on_constants(unsigned char *codestr, PyObject *consts, PyObject **ob
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        case BINARY_SUBSCR:
 | 
					        case BINARY_SUBSCR:
 | 
				
			||||||
            newconst = PyObject_GetItem(v, w);
 | 
					            newconst = PyObject_GetItem(v, w);
 | 
				
			||||||
 | 
					            /* #5057: if v is unicode, there might be differences between
 | 
				
			||||||
 | 
					               wide and narrow builds in cases like '\U00012345'[0].
 | 
				
			||||||
 | 
					               Wide builds will return a non-BMP char, whereas narrow builds
 | 
				
			||||||
 | 
					               will return a surrogate.  In both the cases skip the
 | 
				
			||||||
 | 
					               optimization in order to produce compatible pycs.
 | 
				
			||||||
 | 
					             */
 | 
				
			||||||
 | 
					            if (newconst != NULL &&
 | 
				
			||||||
 | 
					                PyUnicode_Check(v) && PyUnicode_Check(newconst)) {
 | 
				
			||||||
 | 
					                Py_UNICODE ch = PyUnicode_AS_UNICODE(newconst)[0];
 | 
				
			||||||
 | 
					#ifdef Py_UNICODE_WIDE
 | 
				
			||||||
 | 
					                if (ch > 0xFFFF) {
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					                if (ch >= 0xD800 && ch <= 0xDFFF) {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                    Py_DECREF(newconst);
 | 
				
			||||||
 | 
					                    return 0;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        case BINARY_LSHIFT:
 | 
					        case BINARY_LSHIFT:
 | 
				
			||||||
            newconst = PyNumber_Lshift(v, w);
 | 
					            newconst = PyNumber_Lshift(v, w);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue