Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: 
Changeset: r47304:27862000e92d
Date: 2011-09-16 18:21 +0200
http://bitbucket.org/pypy/pypy/changeset/27862000e92d/

Log:    merge default

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
@@ -359,26 +359,43 @@
 
     return _str_join_many_items(space, w_self, list_w, size)
 
-def _str_join_many_items(space, w_self, list_w, size):
-    self = w_self._value
+from pypy.rlib.jit import JitDriver
+
+one = JitDriver(greens = [], reds = ['size', 'reslen', 'self', 'list_w'])
+two = JitDriver(greens = [], reds = ['i', 'size', 'list_w', 'sb', 'self',
+                                     'w_self'])
+
+def _str_join_compute_reslen(space, self, list_w, size):
     reslen = len(self) * (size - 1)
     for i in range(size):
+        one.jit_merge_point(size = size, reslen = reslen,
+                            self = self, list_w = list_w)
         w_s = list_w[i]
         if not space.isinstance_w(w_s, space.w_str):
             if space.isinstance_w(w_s, space.w_unicode):
-                # we need to rebuild w_list here, because the original
-                # w_list might be an iterable which we already consumed
-                w_list = space.newlist(list_w)
-                w_u = space.call_function(space.w_unicode, w_self)
-                return space.call_method(w_u, "join", w_list)
+                return -1
             raise operationerrfmt(
                 space.w_TypeError,
                 "sequence item %d: expected string, %s "
                 "found", i, space.type(w_s).getname(space))
         reslen += len(space.str_w(w_s))
+    return reslen
+
+def _str_join_many_items(space, w_self, list_w, size):
+    self = w_self._value
+
+    reslen = _str_join_compute_reslen(space, self, list_w, size)
+    if reslen == -1:
+        # we need to rebuild w_list here, because the original
+        # w_list might be an iterable which we already consumed
+        w_list = space.newlist(list_w)
+        w_u = space.call_function(space.w_unicode, w_self)
+        return space.call_method(w_u, "join", w_list)
 
     sb = StringBuilder(reslen)
     for i in range(size):
+        two.jit_merge_point(size=size, i=i, sb=sb, list_w=list_w, self=self,
+                            w_self=w_self)
         if self and i != 0:
             sb.append(self)
         sb.append(space.str_w(list_w[i]))
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to