[pypy-issue] Issue #2324: bytearray().replace('a', 'bc') raises MemoryError (pypy/pypy)

Jason Madden issues-reply at bitbucket.org
Mon Jun 13 10:53:45 EDT 2016


New issue 2324: bytearray().replace('a', 'bc') raises MemoryError
https://bitbucket.org/pypy/pypy/issues/2324/bytearray-replace-a-bc-raises-memoryerror

Jason Madden:

Given an empty bytearry, trying to replace any string with a longer string raises a MemoryError in every version of PyPy from 2.5.0 onward (tested 2.5.0 on OS X and Linux, 4.0.0 and 4.0.1, 5.0.0 and 5.3.0 on OS X):

```python
Python 2.7.10 (5f8302b8bf9f, Nov 18 2015, 10:38:03)
[PyPy 4.0.1 with GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>> bytearray().replace("\\", '\\\\')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>>> bytearray().replace("a", 'b')
bytearray(b'')
>>>> bytearray().replace("a", '\\\\')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
>>>> bytearray().replace("\\", 'b')
bytearray(b'')
>>>> bytearray().replace("\\", 'b')
bytearray(b'')
>>>> bytearray().replace('a', 'bc')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError
```

These cases all work in CPython. 

This came up in PyMySQL which is uses `value.replace('\\', '\\\\')` to do string escaping. See https://github.com/PyMySQL/PyMySQL/issues/474

Curiously, replacing an empty substring with a longer string does work:
```python
Python 2.7.10 (c09c19272c99, Jun 07 2016, 16:26:05)
[PyPy 5.3.0 with GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>> bytearray().replace('', 'bcd')
bytearray(b'bcd')
```




More information about the pypy-issue mailing list