summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_unicode.py2
-rw-r--r--Objects/unicodeobject.c12
2 files changed, 11 insertions, 3 deletions
diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py
index 90147eb5fe..9e36316d79 100644
--- a/Lib/test/test_unicode.py
+++ b/Lib/test/test_unicode.py
@@ -213,6 +213,8 @@ test('replace', u'one!two!three!', u'one!two!three!', u'x', u'@', 2)
test('replace', u'abc', u'-a-b-c-', u'', u'-')
test('replace', u'abc', u'-a-b-c', u'', u'-', 3)
test('replace', u'abc', u'abc', u'', u'-', 0)
+test('replace', u'abc', u'abc', u'ab', u'--', 0)
+test('replace', u'abc', u'abc', u'xy', u'--')
test('replace', u'', u'', u'', u'')
test('startswith', u'hello', True, u'he')
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index 6dea94f479..920f9ea2d8 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -3534,10 +3534,16 @@ PyObject *replace(PyUnicodeObject *self,
n = count(self, 0, self->length, str1);
if (n > maxcount)
n = maxcount;
- if (n == 0 && PyUnicode_CheckExact(self)) {
+ if (n == 0) {
/* nothing to replace, return original string */
- Py_INCREF(self);
- u = self;
+ if (PyUnicode_CheckExact(self)) {
+ Py_INCREF(self);
+ u = self;
+ }
+ else {
+ u = (PyUnicodeObject *)
+ PyUnicode_FromUnicode(self->str, self->length);
+ }
} else {
u = _PyUnicode_New(
self->length + n * (str2->length - str1->length));