Author: Alex Gaynor <alex.gay...@gmail.com> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit