Commit ff27eac9 authored by Stefan Behnel's avatar Stefan Behnel

make bytes the common type of char* and bytes literal in comparisons (ticket #582)

parent 02623216
...@@ -6031,6 +6031,12 @@ class CmpNode(object): ...@@ -6031,6 +6031,12 @@ class CmpNode(object):
self.invalid_types_error(operand1, op, operand2) self.invalid_types_error(operand1, op, operand2)
new_common_type = error_type 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 # recursively merge types
if common_type is None or new_common_type.is_error: if common_type is None or new_common_type.is_error:
common_type = new_common_type common_type = new_common_type
......
cimport cython 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') @cython.test_assert_path_exists('//SingleAssignmentNode')
#FIXME: optimise me! #FIXME: optimise me!
#@cython.test_fail_if_path_exists('//SingleAssignmentNode//CoerceFromPyTypeNode') #@cython.test_fail_if_path_exists('//SingleAssignmentNode//CoerceFromPyTypeNode')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment