From: Benjamin Peterson Date: Wed, 7 Mar 2012 20:59:13 +0000 (-0600) Subject: merge 3.2 (#14212) X-Git-Tag: v3.3.0a2~268 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=33d21a24fa3da625e20eb4d543eb1f9f6392f96c;p=python merge 3.2 (#14212) --- 33d21a24fa3da625e20eb4d543eb1f9f6392f96c diff --cc Misc/NEWS index f3e591c71a,44683f5d5f..7d6441168f --- a/Misc/NEWS +++ b/Misc/NEWS @@@ -2,36 -2,10 +2,42 @@@ Python News +++++++++++ -What's New in Python 3.2.3 release candidate 1? -=============================================== +What's New in Python 3.3.0 Alpha 2? +=================================== -*Release date: 24-Feb-2011* +*Release date: XXXX-XX-XX* + +Core and Builtins +----------------- + +- Issue #14205: dict lookup raises a RuntimeError if the dict is modified + during a lookup. + +Library +------- + +- Issue #14168: Check for presence of Element._attrs in minidom before + accessing it. + +- Issue #12328: Fix multiprocessing's use of overlapped I/O on Windows. + Also, add a multiprocessing.connection.wait(rlist, timeout=None) function + for polling multiple objects at once. Patch by sbt. + +- Issue #14007: Accept incomplete TreeBuilder objects (missing start, end, + data or close method) for the Python implementation as well. + Drop the no-op TreeBuilder().xml() method from the C implementation. + ++Extension Modules ++----------------- ++ ++- Issue #14212: The re module didn't retain a reference to buffers it was ++ scanning, resulting in segfaults. ++ + +What's New in Python 3.3.0 Alpha 1? +=================================== + +*Release date: 05-Mar-2012* Core and Builtins ----------------- diff --cc Modules/_sre.c index f1c3bafd21,472b5a3797..92544808d3 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@@ -1649,8 -1664,7 +1649,9 @@@ state_reset(SRE_STATE* state } static void* -getstring(PyObject* string, Py_ssize_t* p_length, int* p_charsize, Py_buffer *view) +getstring(PyObject* string, Py_ssize_t* p_length, - int* p_logical_charsize, int* p_charsize) ++ int* p_logical_charsize, int* p_charsize, ++ Py_buffer *view) { /* given a python object, return a data pointer, a length (in characters), and a character size. return NULL if the object @@@ -1674,11 -1684,11 +1674,11 @@@ return ptr; } - /* get pointer to string buffer */ + /* get pointer to byte string buffer */ - view.len = -1; + view->len = -1; buffer = Py_TYPE(string)->tp_as_buffer; if (!buffer || !buffer->bf_getbuffer || - (*buffer->bf_getbuffer)(string, &view, PyBUF_SIMPLE) < 0) { + (*buffer->bf_getbuffer)(string, view, PyBUF_SIMPLE) < 0) { PyErr_SetString(PyExc_TypeError, "expected string or buffer"); return NULL; } @@@ -1702,9 -1707,13 +1697,9 @@@ if (PyBytes_Check(string) || bytes == size) charsize = 1; -#if defined(HAVE_UNICODE) - else if (bytes == (Py_ssize_t) (size * sizeof(Py_UNICODE))) - charsize = sizeof(Py_UNICODE); -#endif else { PyErr_SetString(PyExc_TypeError, "buffer size mismatch"); - return NULL; + goto err; } *p_length = size; @@@ -1733,20 -1746,21 +1733,21 @@@ state_init(SRE_STATE* state, PatternObj state->lastmark = -1; state->lastindex = -1; - ptr = getstring(string, &length, &logical_charsize, &charsize); + state->buffer.buf = NULL; - ptr = getstring(string, &length, &charsize, &state->buffer); ++ ptr = getstring(string, &length, &logical_charsize, &charsize, &state->buffer); if (!ptr) - return NULL; + goto err; - if (logical_charsize == 1 && pattern->logical_charsize > 1) { - PyErr_SetString(PyExc_TypeError, - if (charsize == 1 && pattern->charsize > 1) { ++ if (logical_charsize == 1 && pattern->logical_charsize > 1) { + PyErr_SetString(PyExc_TypeError, - "can't use a string pattern on a bytes-like object"); + "can't use a string pattern on a bytes-like object"); - return NULL; - } - if (logical_charsize > 1 && pattern->logical_charsize == 1) { - PyErr_SetString(PyExc_TypeError, + goto err; + } - if (charsize > 1 && pattern->charsize == 1) { ++ if (logical_charsize > 1 && pattern->logical_charsize == 1) { + PyErr_SetString(PyExc_TypeError, - "can't use a bytes pattern on a string-like object"); + "can't use a bytes pattern on a string-like object"); - return NULL; - } + goto err; + } /* adjust boundaries */ if (start < 0) @@@ -2270,8 -2303,9 +2279,9 @@@ pattern_subx(PatternObject* self, PyObj int status; Py_ssize_t n; Py_ssize_t i, b, e; - int bint; + int logical_charsize, charsize; int filter_is_callable; + Py_buffer view; if (PyCallable_Check(ptemplate)) { /* sub/subn takes either a function or a template */ @@@ -2281,10 -2315,17 +2291,11 @@@ } else { /* if not callable, check if it's a literal string */ int literal; - ptr = getstring(ptemplate, &n, &logical_charsize, &charsize); + view.buf = NULL; - ptr = getstring(ptemplate, &n, &bint, &view); - b = bint; ++ ptr = getstring(ptemplate, &n, &logical_charsize, &charsize, &view); + b = charsize; if (ptr) { - if (b == 1) { - literal = sre_literal_template((unsigned char *)ptr, n); - } else { -#if defined(HAVE_UNICODE) - literal = sre_uliteral_template((Py_UNICODE *)ptr, n); -#endif - } + literal = sre_literal_template(b, ptr, n); } else { PyErr_Clear(); literal = 0; @@@ -2661,14 -2708,11 +2676,14 @@@ _compile(PyObject* self_, PyObject* arg return NULL; } - if (pattern == Py_None) + if (pattern == Py_None) { + self->logical_charsize = -1; self->charsize = -1; + } else { Py_ssize_t p_length; - if (!getstring(pattern, &p_length, &self->charsize, &self->view)) { + if (!getstring(pattern, &p_length, &self->logical_charsize, - &self->charsize)) { ++ &self->charsize, &self->view)) { Py_DECREF(self); return NULL; } diff --cc Modules/sre.h index 0d91f25409,aec9b541dd..01abcb0aed --- a/Modules/sre.h +++ b/Modules/sre.h @@@ -30,8 -30,8 +30,9 @@@ typedef struct PyObject* pattern; /* pattern source (or None) */ int flags; /* flags used when compiling pattern source */ PyObject *weakreflist; /* List of weak references */ - int charsize; /* pattern charsize (or -1) */ + int logical_charsize; /* pattern charsize (or -1) */ + int charsize; + Py_buffer view; /* pattern code */ Py_ssize_t codesize; SRE_CODE code[1];