Commit 6642d167 authored by da-woods's avatar da-woods Committed by Stefan Behnel

Only use PyUnicode_Concat on unicode object operations (GH-3433)

parent 033e6864
...@@ -11390,19 +11390,24 @@ class AddNode(NumBinopNode): ...@@ -11390,19 +11390,24 @@ class AddNode(NumBinopNode):
self, type1, type2) self, type1, type2)
def py_operation_function(self, code): def py_operation_function(self, code):
is_unicode_concat = False
if isinstance(self.operand1, FormattedValueNode) or isinstance(self.operand2, FormattedValueNode):
is_unicode_concat = True
else:
type1, type2 = self.operand1.type, self.operand2.type type1, type2 = self.operand1.type, self.operand2.type
if type1 is unicode_type or type2 is unicode_type: if type1 is unicode_type or type2 is unicode_type:
is_unicode_concat = type1.is_builtin_type and type2.is_builtin_type if type1 in (unicode_type, str_type) and type2 in (unicode_type, str_type):
is_unicode_concat = True
elif isinstance(self.operand1, FormattedValueNode) or isinstance(self.operand2, FormattedValueNode):
# Assume that even if we don't know the second type, it's going to be a string.
is_unicode_concat = True
else:
# Operation depends on the second type.
is_unicode_concat = False
if is_unicode_concat: if is_unicode_concat:
if self.operand1.may_be_none() or self.operand2.may_be_none(): if self.operand1.may_be_none() or self.operand2.may_be_none():
return '__Pyx_PyUnicode_ConcatSafe' return '__Pyx_PyUnicode_ConcatSafe'
else: else:
return '__Pyx_PyUnicode_Concat' return '__Pyx_PyUnicode_Concat'
return super(AddNode, self).py_operation_function(code) return super(AddNode, self).py_operation_function(code)
......
...@@ -993,6 +993,14 @@ class CommonTest(BaseTest): ...@@ -993,6 +993,14 @@ class CommonTest(BaseTest):
self.checkequal('\u019b\u1d00\u1d86\u0221\u1fb7', self.checkequal('\u019b\u1d00\u1d86\u0221\u1fb7',
'\u019b\u1d00\u1d86\u0221\u1fb7', 'capitalize') '\u019b\u1d00\u1d86\u0221\u1fb7', 'capitalize')
def test_list_concat(self):
# https://github.com/cython/cython/issues/3426
y = []
y += 'ab'
self.assertEqual('a', y[0])
self.assertEqual('b', y[1])
self.assertEqual(['a', 'b'], y)
class MixinStrUnicodeUserStringTest: class MixinStrUnicodeUserStringTest:
# additional tests that only work for # additional tests that only work for
......
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