Fix test unicode_slicing for compatibility between py2X/py3
authorzaur <aintellimath@gmail.com>
Tue, 19 Feb 2013 13:37:44 +0000 (16:37 +0300)
committerzaur <aintellimath@gmail.com>
Tue, 19 Feb 2013 13:37:44 +0000 (16:37 +0300)
Cython/Compiler/ExprNodes.py
tests/run/unicode_slicing.pyx

index b263380..cc063d5 100755 (executable)
@@ -3470,6 +3470,8 @@ class SliceIndexNode(ExprNode):
         if base_type.is_builtin_type:
             # slicing builtin types returns something of the same type
             self.type = base_type
+            self.base = self.base.as_none_safe_node("'NoneType' object is not subscriptable")
+
         c_int = PyrexTypes.c_py_ssize_t_type
         if self.start:
             self.start = self.start.coerce_to(c_int, env)
@@ -3486,10 +3488,6 @@ class SliceIndexNode(ExprNode):
             error(self.pos,
                   "Slicing is not currently supported for '%s'." % self.type)
             return
-
-        maybe_check = self.base.as_none_safe_node("'NoneType' object is not slicable")
-        if maybe_check.is_nonecheck:
-            maybe_check.generate_result_code(code)
             
         base_result = self.base.result()
         result = self.result()
@@ -9786,9 +9784,7 @@ class NoneCheckNode(CoercionNode):
         code.putln(
             "if (unlikely(%s == Py_None)) {" % self.condition())
 
-        in_nogil_context = getattr(self, "in_nogil_context", False)
-            
-        if in_nogil_context:
+        if self.in_nogil_context:
             code.put_ensure_gil()
 
         escape = StringEncoding.escape_byte_string
@@ -9804,7 +9800,7 @@ class NoneCheckNode(CoercionNode):
                 self.exception_type_cname,
                 escape(self.exception_message.encode('UTF-8'))))
 
-        if in_nogil_context:
+        if self.in_nogil_context:
             code.put_release_ensured_gil()
 
         code.putln(code.error_goto(self.pos))
index 2ef2b1a..a3a7e4a 100644 (file)
 # coding: utf-8
 
 __doc__ = u"""
-    >>> do_slice(u'abcdef', 2, 3)
-    (u'c', u'cdef', u'ab', u'abcdef', u'cdef', u'ab', u'abcdef')
-    >>> do_slice(u'abcdef', 0, 5)
-    (u'abcde', u'abcdef', u'', u'abcdef', u'abcdef', u'', u'abcdef')
-    >>> do_slice(u'aАbБcСdДeЕfФ', 2, 8)
-    (u'bБcСdД', u'bБcСdДeЕfФ', u'aА', u'aАbБcСdДeЕfФ', u'bБcСdДeЕfФ', u'aА', u'aАbБcСdДeЕfФ')
-    >>> do_slice(u'aАbБcСdДeЕfФ', 2, 8)
-    (u'bБcСdД', u'bБcСdДeЕfФ', u'aА', u'aАbБcСdДeЕfФ', u'bБcСdДeЕfФ', u'aА', u'aАbБcСdДeЕfФ')
-    >>> do_slice(u'АБСДЕФ', 2, 4)
-    (u'СД', u'СДЕФ', u'АБ', u'АБСДЕФ', u'СДЕФ', u'АБ', u'АБСДЕФ')
-    >>> do_slice(None, 2, 4)
+    >>> do_slice1(u'abcdef', 2, 3)
+    u'c'
+    >>> do_slice2(u'abcdef', 2, 3)
+    u'cdef'
+    >>> do_slice3(u'abcdef', 2, 3)
+    u'ab'
+    >>> do_slice4(u'abcdef', 2, 3)
+    u'abcdef'
+    >>> do_slice5(u'abcdef', 2, 3)
+    u'cdef'
+    >>> do_slice6(u'abcdef', 2, 3)
+    u'ab'
+    >>> do_slice7(u'abcdef', 2, 3)
+    u'abcdef'
+    >>> do_slice1(u'abcdef', 0, 5)
+    u'abcde'
+    >>> do_slice2(u'abcdef', 0, 5)
+    u'abcdef'
+    >>> do_slice3(u'abcdef', 0, 5)
+    u''
+    >>> do_slice4(u'abcdef', 0, 5)
+    u'abcdef'
+    >>> do_slice5(u'abcdef', 0, 5)
+    u'abcdef'
+    >>> do_slice6(u'abcdef', 0, 5)
+    u''
+    >>> do_slice7(u'abcdef', 0, 5)
+    u'abcdef'
+    >>> do_slice1(u'aАbБcСdДeЕfФ', 2, 8)
+    u'bБcСdД'
+    >>> do_slice2(u'aАbБcСdДeЕfФ', 2, 8)
+    u'bБcСdДeЕfФ'
+    >>> do_slice3(u'aАbБcСdДeЕfФ', 2, 8)
+    u'aА'
+    >>> do_slice4(u'aАbБcСdДeЕfФ', 2, 8)
+    u'aАbБcСdДeЕfФ'
+    >>> do_slice5(u'aАbБcСdДeЕfФ', 2, 8)
+    u'bБcСdДeЕfФ'
+    >>> do_slice6(u'aАbБcСdДeЕfФ', 2, 8)
+    u'aА'
+    >>> do_slice7(u'aАbБcСdДeЕfФ', 2, 8)
+    u'aАbБcСdДeЕfФ'
+    >>> do_slice1(u'АБСДЕФ', 2, 4)
+    u'СД'
+    >>> do_slice2(u'АБСДЕФ', 2, 4)
+    u'СДЕФ'
+    >>> do_slice3(u'АБСДЕФ', 2, 4)
+    u'АБ'
+    >>> do_slice4(u'АБСДЕФ', 2, 4)
+    u'АБСДЕФ'
+    >>> do_slice5(u'АБСДЕФ', 2, 4)
+    u'СДЕФ'
+    >>> do_slice6(u'АБСДЕФ', 2, 4)
+    u'АБ'
+    >>> do_slice7(u'АБСДЕФ', 2, 4)
+    u'АБСДЕФ'
+    >>> do_slice1(None, 2, 4)
     Traceback (most recent call last):    
-    TypeError: 'NoneType' object is not slicable
+    TypeError: 'NoneType' object is not subscriptable
+    >>> do_slice2(None, 2, 4)
+    Traceback (most recent call last):    
+    TypeError: 'NoneType' object is not subscriptable
+    >>> do_slice3(None, 2, 4)
+    Traceback (most recent call last):    
+    TypeError: 'NoneType' object is not subscriptable
+    >>> do_slice4(None, 2, 4)
+    Traceback (most recent call last):    
+    TypeError: 'NoneType' object is not subscriptable
+    >>> do_slice5(None, 2, 4)
+    Traceback (most recent call last):    
+    TypeError: 'NoneType' object is not subscriptable
+    >>> do_slice6(None, 2, 4)
+    Traceback (most recent call last):    
+    TypeError: 'NoneType' object is not subscriptable
+    >>> do_slice7(None, 2, 4)
+    Traceback (most recent call last):    
+    TypeError: 'NoneType' object is not subscriptable
 """
 
 import sys
 
 if sys.version_info[0] >= 3:
     __doc__ = __doc__.replace(u"(u'", u"('").replace(u" u'", u" '")
+    ss = "'"
+else:
+    ss = "u'"
+
+def do_slice1(unicode s, int i, int j):
+    print(ss+s[i:j]+"'")
+
+def do_slice2(unicode s, int i, int j):
+    print(ss+s[i:]+"'")
+
+def do_slice3(unicode s, int i, int j):
+    print(ss+s[:i]+"'")
+
+def do_slice4(unicode s, int i, int j):
+    print(ss+s[:]+"'")
+
+def do_slice5(unicode s, int i, int j):
+    print(ss+s[i:None]+"'")
 
-def do_slice(unicode s, int i, int j):
-    return s[i:j], s[i:], s[:i], s[:], s[i:None], s[None:i], s[None:None]
+def do_slice6(unicode s, int i, int j):
+    print(ss+s[None:i]+"'")
 
+def do_slice7(unicode s, int i, int j):
+    print(ss+s[None:None]+"'")