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

Reply via email to