From: Stefan Behnel Date: Sat, 30 Oct 2010 20:19:11 +0000 (+0200) Subject: make bytes the common type of char* and bytes literal in comparisons (ticket #582) X-Git-Tag: 0.14.alpha0~273 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=ff27eac9af38bbaca3273c5a8902c3f5463991a0;p=cython.git make bytes the common type of char* and bytes literal in comparisons (ticket #582) --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 62de863c..50ee5a74 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -6031,6 +6031,12 @@ class CmpNode(object): self.invalid_types_error(operand1, op, operand2) new_common_type = error_type + if new_common_type.is_string and (isinstance(operand1, BytesNode) or + isinstance(operand2, BytesNode)): + # special case when comparing char* to bytes literal: must + # compare string values! + new_common_type = bytes_type + # recursively merge types if common_type is None or new_common_type.is_error: common_type = new_common_type diff --git a/tests/run/charptr_comparison_T582.pyx b/tests/run/charptr_comparison_T582.pyx index c30a431c..aecb5b92 100644 --- a/tests/run/charptr_comparison_T582.pyx +++ b/tests/run/charptr_comparison_T582.pyx @@ -1,6 +1,85 @@ cimport cython +################################################################################ +## plain char* + +@cython.test_assert_path_exists('//SingleAssignmentNode') +#@cython.test_fail_if_path_exists('//SingleAssignmentNode//CoerceFromPyTypeNode') +def charptr_equals_literal(char* s): + """ + >>> charptr_equals_literal('abc'.encode('ASCII')) + True + >>> charptr_equals_literal('aabc'.encode('ASCII')) + False + >>> charptr_equals_literal('abcx'.encode('ASCII')) + False + >>> charptr_equals_literal('bcx'.encode('ASCII')) + False + """ + cdef bint result = (s == b"abc") + return result + +def charptr_gt_literal(char* s): + """ + >>> charptr_gt_literal('abc'.encode('ASCII')) + False + >>> charptr_gt_literal('aabc'.encode('ASCII')) + False + >>> charptr_gt_literal('abcx'.encode('ASCII')) + True + >>> charptr_gt_literal('bcx'.encode('ASCII')) + True + """ + cdef bint result = (s > b"abc") + return result + +def charptr_lt_literal(char* s): + """ + >>> charptr_lt_literal('abc'.encode('ASCII')) + False + >>> charptr_lt_literal('aabc'.encode('ASCII')) + True + >>> charptr_lt_literal('abcx'.encode('ASCII')) + False + >>> charptr_lt_literal('bcx'.encode('ASCII')) + False + """ + cdef bint result = (s < b"abc") + return result + +def charptr_ge_literal(char* s): + """ + >>> charptr_ge_literal('abc'.encode('ASCII')) + True + >>> charptr_ge_literal('aabc'.encode('ASCII')) + False + >>> charptr_ge_literal('abcx'.encode('ASCII')) + True + >>> charptr_ge_literal('bcx'.encode('ASCII')) + True + """ + cdef bint result = (s >= b"abc") + return result + +def charptr_le_literal(char* s): + """ + >>> charptr_le_literal('abc'.encode('ASCII')) + True + >>> charptr_le_literal('aabc'.encode('ASCII')) + True + >>> charptr_le_literal('abcx'.encode('ASCII')) + False + >>> charptr_le_literal('bcx'.encode('ASCII')) + False + """ + cdef bint result = (s <= b"abc") + return result + + +################################################################################ +## slices + @cython.test_assert_path_exists('//SingleAssignmentNode') #FIXME: optimise me! #@cython.test_fail_if_path_exists('//SingleAssignmentNode//CoerceFromPyTypeNode')