text = 'abc def'
self.assertIs(text.replace(pattern, pattern), text)
+ @support.nomemtest
+ def test_replace_oom(self):
+ # https://github.com/python/cpython/issues/152228
+ s1 = "轘" * 4
+ s2 = "&"
+ s3 = "&"
+ assertion = self.assertRaises(MemoryError)
+ _testcapi.set_nomemory(0, 0)
+ try:
+ # No allocations made in the test itself:
+ with assertion:
+ s1.replace(s2, s3) # this line used to crash before
+ finally:
+ _testcapi.remove_mem_hooks()
+
def test_repeat_id_preserving(self):
a = '123abc1@'
b = '456zyx-+'
}
done:
- assert(srelease == (sbuf != PyUnicode_DATA(self)));
- assert(release1 == (buf1 != PyUnicode_DATA(str1)));
- assert(release2 == (buf2 != PyUnicode_DATA(str2)));
+ assert(srelease == (sbuf != NULL && sbuf != PyUnicode_DATA(self)));
+ assert(release1 == (buf1 != NULL && buf1 != PyUnicode_DATA(str1)));
+ assert(release2 == (buf2 != NULL && buf2 != PyUnicode_DATA(str2)));
if (srelease)
PyMem_Free((void *)sbuf);
if (release1)
nothing:
/* nothing to replace; return original string (when possible) */
- assert(srelease == (sbuf != PyUnicode_DATA(self)));
- assert(release1 == (buf1 != PyUnicode_DATA(str1)));
- assert(release2 == (buf2 != PyUnicode_DATA(str2)));
+ assert(srelease == (sbuf != NULL && sbuf != PyUnicode_DATA(self)));
+ assert(release1 == (buf1 != NULL && buf1 != PyUnicode_DATA(str1)));
+ assert(release2 == (buf2 != NULL && buf2 != PyUnicode_DATA(str2)));
if (srelease)
PyMem_Free((void *)sbuf);
if (release1)
return unicode_result_unchanged(self);
error:
- assert(srelease == (sbuf != PyUnicode_DATA(self)));
- assert(release1 == (buf1 != PyUnicode_DATA(str1)));
- assert(release2 == (buf2 != PyUnicode_DATA(str2)));
+ assert(srelease == (sbuf != NULL && sbuf != PyUnicode_DATA(self)));
+ assert(release1 == (buf1 != NULL && buf1 != PyUnicode_DATA(str1)));
+ assert(release2 == (buf2 != NULL && buf2 != PyUnicode_DATA(str2)));
if (srelease)
PyMem_Free((void *)sbuf);
if (release1)