[Python-checkins] cpython: Remove commented code: str+=str is no more super-optimized

victor.stinner python-checkins at python.org
Sat Oct 1 02:49:27 CEST 2011


http://hg.python.org/cpython/rev/df6deb7bb772
changeset:   72550:df6deb7bb772
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Sat Oct 01 01:26:08 2011 +0200
summary:
  Remove commented code: str+=str is no more super-optimized

files:
  Python/ceval.c |  118 +-----------------------------------
  1 files changed, 6 insertions(+), 112 deletions(-)


diff --git a/Python/ceval.c b/Python/ceval.c
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -136,8 +136,6 @@
 static int import_all_from(PyObject *, PyObject *);
 static void format_exc_check_arg(PyObject *, const char *, PyObject *);
 static void format_exc_unbound(PyCodeObject *co, int oparg);
-static PyObject * unicode_concatenate(PyObject *, PyObject *,
-                                      PyFrameObject *, unsigned char *);
 static PyObject * special_lookup(PyObject *, char *, PyObject **);
 
 #define NAME_ERROR_MSG \
@@ -1509,17 +1507,11 @@
         TARGET(BINARY_ADD)
             w = POP();
             v = TOP();
-            if (PyUnicode_CheckExact(v) &&
-                     PyUnicode_CheckExact(w)) {
-                x = unicode_concatenate(v, w, f, next_instr);
-                /* unicode_concatenate consumed the ref to v */
-                goto skip_decref_vx;
-            }
-            else {
+            if (PyUnicode_Check(v) && PyUnicode_Check(w))
+                x = PyUnicode_Concat(v, w);
+            else
                 x = PyNumber_Add(v, w);
-            }
             Py_DECREF(v);
-          skip_decref_vx:
             Py_DECREF(w);
             SET_TOP(x);
             if (x != NULL) DISPATCH();
@@ -1670,17 +1662,11 @@
         TARGET(INPLACE_ADD)
             w = POP();
             v = TOP();
-            if (PyUnicode_CheckExact(v) &&
-                     PyUnicode_CheckExact(w)) {
-                x = unicode_concatenate(v, w, f, next_instr);
-                /* unicode_concatenate consumed the ref to v */
-                goto skip_decref_v;
-            }
-            else {
+            if (PyUnicode_Check(v) && PyUnicode_Check(w))
+                x = PyUnicode_Concat(v, w);
+            else
                 x = PyNumber_InPlaceAdd(v, w);
-            }
             Py_DECREF(v);
-          skip_decref_v:
             Py_DECREF(w);
             SET_TOP(x);
             if (x != NULL) DISPATCH();
@@ -4515,98 +4501,6 @@
     }
 }
 
-static PyObject *
-unicode_concatenate(PyObject *v, PyObject *w,
-                   PyFrameObject *f, unsigned char *next_instr)
-{
-    /* This function implements 'variable += expr' when both arguments
-       are (Unicode) strings. */
-
-    w = PyUnicode_Concat(v, w);
-    Py_DECREF(v);
-    return w;
-
-    /* XXX: This optimization is currently disabled as unicode objects in the
-       new flexible representation are not in-place resizable anymore. */
-#if 0
-    Py_ssize_t v_len = PyUnicode_GET_SIZE(v);
-    Py_ssize_t w_len = PyUnicode_GET_SIZE(w);
-    Py_ssize_t new_len = v_len + w_len;
-    if (new_len < 0) {
-        PyErr_SetString(PyExc_OverflowError,
-                        "strings are too large to concat");
-        return NULL;
-    }
-
-    if (Py_REFCNT(v) == 2) {
-        /* In the common case, there are 2 references to the value
-         * stored in 'variable' when the += is performed: one on the
-         * value stack (in 'v') and one still stored in the
-         * 'variable'.  We try to delete the variable now to reduce
-         * the refcnt to 1.
-         */
-        switch (*next_instr) {
-        case STORE_FAST:
-        {
-            int oparg = PEEKARG();
-            PyObject **fastlocals = f->f_localsplus;
-            if (GETLOCAL(oparg) == v)
-                SETLOCAL(oparg, NULL);
-            break;
-        }
-        case STORE_DEREF:
-        {
-            PyObject **freevars = (f->f_localsplus +
-                                   f->f_code->co_nlocals);
-            PyObject *c = freevars[PEEKARG()];
-            if (PyCell_GET(c) == v)
-                PyCell_Set(c, NULL);
-            break;
-        }
-        case STORE_NAME:
-        {
-            PyObject *names = f->f_code->co_names;
-            PyObject *name = GETITEM(names, PEEKARG());
-            PyObject *locals = f->f_locals;
-            if (PyDict_CheckExact(locals) &&
-                PyDict_GetItem(locals, name) == v) {
-                if (PyDict_DelItem(locals, name) != 0) {
-                    PyErr_Clear();
-                }
-            }
-            break;
-        }
-        }
-    }
-
-    if (Py_REFCNT(v) == 1 && !PyUnicode_CHECK_INTERNED(v) &&
-        !PyUnicode_IS_COMPACT((PyUnicodeObject *)v)) {
-        /* Now we own the last reference to 'v', so we can resize it
-         * in-place.
-         */
-        if (PyUnicode_Resize(&v, new_len) != 0) {
-            /* XXX if PyUnicode_Resize() fails, 'v' has been
-             * deallocated so it cannot be put back into
-             * 'variable'.  The MemoryError is raised when there
-             * is no value in 'variable', which might (very
-             * remotely) be a cause of incompatibilities.
-             */
-            return NULL;
-        }
-        /* copy 'w' into the newly allocated area of 'v' */
-        memcpy(PyUnicode_AS_UNICODE(v) + v_len,
-               PyUnicode_AS_UNICODE(w), w_len*sizeof(Py_UNICODE));
-        return v;
-    }
-    else {
-        /* When in-place resizing is not an option. */
-        w = PyUnicode_Concat(v, w);
-        Py_DECREF(v);
-        return w;
-    }
-#endif
-}
-
 #ifdef DYNAMIC_EXECUTION_PROFILE
 
 static PyObject *

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list