Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Objects/stringlib/partition.h

    r2 r391  
    99
    1010Py_LOCAL_INLINE(PyObject*)
    11 stringlib_partition(
    12     PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len,
    13     PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len
    14     )
     11stringlib_partition(PyObject* str_obj,
     12                    const STRINGLIB_CHAR* str, Py_ssize_t str_len,
     13                    PyObject* sep_obj,
     14                    const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
    1515{
    1616    PyObject* out;
     
    1919    if (sep_len == 0) {
    2020        PyErr_SetString(PyExc_ValueError, "empty separator");
    21         return NULL;
     21        return NULL;
    2222    }
    2323
    2424    out = PyTuple_New(3);
    2525    if (!out)
    26         return NULL;
     26        return NULL;
    2727
    28     pos = fastsearch(str, str_len, sep, sep_len, FAST_SEARCH);
     28    pos = fastsearch(str, str_len, sep, sep_len, -1, FAST_SEARCH);
    2929
    3030    if (pos < 0) {
    31         Py_INCREF(str_obj);
    32         PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj);
    33         Py_INCREF(STRINGLIB_EMPTY);
    34         PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY);
    35         Py_INCREF(STRINGLIB_EMPTY);
    36         PyTuple_SET_ITEM(out, 2, (PyObject*) STRINGLIB_EMPTY);
    37         return out;
     31#if STRINGLIB_MUTABLE
     32        PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, str_len));
     33        PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
     34        PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(NULL, 0));
     35#else
     36        Py_INCREF(str_obj);
     37        PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj);
     38        Py_INCREF(STRINGLIB_EMPTY);
     39        PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY);
     40        Py_INCREF(STRINGLIB_EMPTY);
     41        PyTuple_SET_ITEM(out, 2, (PyObject*) STRINGLIB_EMPTY);
     42#endif
     43        return out;
    3844    }
    3945
     
    4551
    4652    if (PyErr_Occurred()) {
    47         Py_DECREF(out);
    48         return NULL;
     53        Py_DECREF(out);
     54        return NULL;
    4955    }
    5056
     
    5359
    5460Py_LOCAL_INLINE(PyObject*)
    55 stringlib_rpartition(
    56     PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len,
    57     PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len
    58     )
     61stringlib_rpartition(PyObject* str_obj,
     62                    const STRINGLIB_CHAR* str, Py_ssize_t str_len,
     63                     PyObject* sep_obj,
     64                     const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
    5965{
    6066    PyObject* out;
    61     Py_ssize_t pos, j;
     67    Py_ssize_t pos;
    6268
    6369    if (sep_len == 0) {
    6470        PyErr_SetString(PyExc_ValueError, "empty separator");
    65         return NULL;
     71        return NULL;
    6672    }
    6773
    6874    out = PyTuple_New(3);
    6975    if (!out)
    70         return NULL;
     76        return NULL;
    7177
    72     /* XXX - create reversefastsearch helper! */
    73         pos = -1;
    74         for (j = str_len - sep_len; j >= 0; --j)
    75             if (STRINGLIB_CMP(str+j, sep, sep_len) == 0) {
    76                 pos = j;
    77                 break;
    78             }
     78    pos = fastsearch(str, str_len, sep, sep_len, -1, FAST_RSEARCH);
    7979
    8080    if (pos < 0) {
    81         Py_INCREF(STRINGLIB_EMPTY);
    82         PyTuple_SET_ITEM(out, 0, (PyObject*) STRINGLIB_EMPTY);
    83         Py_INCREF(STRINGLIB_EMPTY);
    84         PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY);
    85         Py_INCREF(str_obj);       
    86         PyTuple_SET_ITEM(out, 2, (PyObject*) str_obj);
    87         return out;
     81#if STRINGLIB_MUTABLE
     82        PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(NULL, 0));
     83        PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
     84        PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str, str_len));
     85#else
     86        Py_INCREF(STRINGLIB_EMPTY);
     87        PyTuple_SET_ITEM(out, 0, (PyObject*) STRINGLIB_EMPTY);
     88        Py_INCREF(STRINGLIB_EMPTY);
     89        PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY);
     90        Py_INCREF(str_obj);
     91        PyTuple_SET_ITEM(out, 2, (PyObject*) str_obj);
     92#endif
     93        return out;
    8894    }
    8995
     
    95101
    96102    if (PyErr_Occurred()) {
    97         Py_DECREF(out);
    98         return NULL;
     103        Py_DECREF(out);
     104        return NULL;
    99105    }
    100106
     
    103109
    104110#endif
    105 
    106 /*
    107 Local variables:
    108 c-basic-offset: 4
    109 indent-tabs-mode: nil
    110 End:
    111 */
Note: See TracChangeset for help on using the changeset viewer.