Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r50793:e9153b7926a3
Date: 2011-12-20 23:28 +0000
http://bitbucket.org/pypy/pypy/changeset/e9153b7926a3/
Log: fix the OverflowError checking in str.replace on 32-bit systems,
also simplify the code slightly
diff --git a/pypy/objspace/std/stringobject.py
b/pypy/objspace/std/stringobject.py
--- a/pypy/objspace/std/stringobject.py
+++ b/pypy/objspace/std/stringobject.py
@@ -514,29 +514,33 @@
if maxsplit == 0:
return space.wrap(input)
- # An ok guess at the default size
- builder = StringBuilder(len(input))
- first = True
-
if not sub:
upper = len(input)
if maxsplit > 0 and maxsplit < upper + 2:
upper = maxsplit - 1
assert upper >= 0
- first = False
+
try:
- for i in range(upper):
- builder.append(by)
- builder.append(input[i])
+ result_size = ovfcheck(upper * len(by))
+ result_size = ovfcheck(result_size + upper)
+ result_size = ovfcheck(result_size + len(by))
+ result_size = ovfcheck(result_size + upper - len(input))
+ except OverflowError:
+ raise OperationError(space.w_OverflowError,
+ space.wrap("replace string is too long")
+ )
+ builder = StringBuilder(result_size)
+ for i in range(upper):
builder.append(by)
- builder.append_slice(input, upper, len(input))
- except MemoryError:
- raise OperationError(space.w_OverflowError,
- space.wrap("replace string too long")
- )
+ builder.append(input[i])
+ builder.append(by)
+ builder.append_slice(input, upper, len(input))
else:
+ # An ok guess for the result size
+ builder = StringBuilder(len(input))
start = 0
sublen = len(sub)
+ first = True
while maxsplit != 0:
next = input.find(sub, start)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit