This commit is contained in:
Charles-François Natali 2011-10-04 23:37:43 +02:00
commit 4637309ee6
3 changed files with 60 additions and 17 deletions

View File

@ -131,6 +131,10 @@ write_str(stringio *self, PyObject *obj)
return -1;
assert(PyUnicode_Check(decoded));
if (PyUnicode_READY(decoded)) {
Py_DECREF(decoded);
return -1;
}
len = PyUnicode_GET_LENGTH(decoded);
assert(len >= 0);

View File

@ -2120,6 +2120,10 @@ PyUnicode_FromFormatV(const char *format, va_list vargs)
str_obj = PyUnicode_DecodeUTF8(str, strlen(str), "replace");
if (!str_obj)
goto fail;
if (PyUnicode_READY(str_obj)) {
Py_DECREF(str_obj);
goto fail;
}
argmaxchar = PyUnicode_MAX_CHAR_VALUE(str_obj);
maxchar = Py_MAX(maxchar, argmaxchar);
n += PyUnicode_GET_LENGTH(str_obj);
@ -2625,10 +2629,12 @@ PyUnicode_Decode(const char *s,
goto onError;
}
Py_DECREF(buffer);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&unicode)) {
Py_DECREF(unicode);
return NULL;
}
#endif
return unicode;
onError:
@ -3674,10 +3680,12 @@ utf7Error:
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&unicode)) {
Py_DECREF(unicode);
return NULL;
}
#endif
return (PyObject *)unicode;
onError:
@ -4244,10 +4252,12 @@ PyUnicode_DecodeUTF8Stateful(const char *s,
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&unicode)) {
Py_DECREF(unicode);
return NULL;
}
#endif
return (PyObject *)unicode;
onError:
@ -4747,10 +4757,12 @@ PyUnicode_DecodeUTF32Stateful(const char *s,
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&unicode)) {
Py_DECREF(unicode);
return NULL;
}
#endif
return (PyObject *)unicode;
onError:
@ -5145,10 +5157,12 @@ PyUnicode_DecodeUTF16Stateful(const char *s,
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&unicode)) {
Py_DECREF(unicode);
return NULL;
}
#endif
return (PyObject *)unicode;
onError:
@ -5604,10 +5618,12 @@ PyUnicode_DecodeUnicodeEscape(const char *s,
}
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&v)) {
Py_DECREF(v);
return NULL;
}
#endif
return (PyObject *)v;
ucnhashError:
@ -5905,10 +5921,12 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s,
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&v)) {
Py_DECREF(v);
return NULL;
}
#endif
return (PyObject *)v;
onError:
@ -6093,10 +6111,12 @@ _PyUnicode_DecodeUnicodeInternal(const char *s,
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&v)) {
Py_DECREF(v);
return NULL;
}
#endif
return (PyObject *)v;
onError:
@ -6519,10 +6539,12 @@ PyUnicode_DecodeASCII(const char *s,
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&v)) {
Py_DECREF(v);
return NULL;
}
#endif
return (PyObject *)v;
onError:
@ -6713,10 +6735,12 @@ PyUnicode_DecodeMBCSStateful(const char *s,
goto retry;
}
#endif
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&v)) {
Py_DECREF(v);
return NULL;
}
#endif
return (PyObject *)v;
}
@ -7012,10 +7036,12 @@ PyUnicode_DecodeCharmap(const char *s,
goto onError;
Py_XDECREF(errorHandler);
Py_XDECREF(exc);
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&v)) {
Py_DECREF(v);
return NULL;
}
#endif
return (PyObject *)v;
onError:
@ -8057,10 +8083,12 @@ PyUnicode_TransformDecimalToASCII(Py_UNICODE *s,
p[i] = '0' + decimal;
}
}
if (PyUnicode_READY((PyUnicodeObject*)result) == -1) {
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&result)) {
Py_DECREF(result);
return NULL;
}
#endif
return result;
}
/* --- Decimal Encoder ---------------------------------------------------- */
@ -10038,17 +10066,17 @@ PyUnicode_Append(PyObject **p_left, PyObject *right)
goto error;
}
if (PyUnicode_READY(left))
goto error;
if (PyUnicode_READY(right))
goto error;
if (PyUnicode_CheckExact(left) && left != unicode_empty
&& PyUnicode_CheckExact(right) && right != unicode_empty
&& unicode_resizable(left)
&& (_PyUnicode_KIND(right) <= _PyUnicode_KIND(left)
|| _PyUnicode_WSTR(left) != NULL))
{
if (PyUnicode_READY(left))
goto error;
if (PyUnicode_READY(right))
goto error;
/* Don't resize for ascii += latin1. Convert ascii to latin1 requires
to change the structure size, but characters are stored just after
the structure, and so it requires to move all charactres which is
@ -10265,10 +10293,12 @@ unicode_expandtabs(PyUnicodeObject *self, PyObject *args)
}
}
assert (j == PyUnicode_GET_LENGTH(u));
if (PyUnicode_READY(u)) {
#ifndef DONT_MAKE_RESULT_READY
if (_PyUnicode_READY_REPLACE(&u)) {
Py_DECREF(u);
return NULL;
}
#endif
return (PyObject*) u;
overflow:
@ -12923,7 +12953,7 @@ unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (unicode == NULL)
return NULL;
assert(_PyUnicode_CHECK(unicode));
if (_PyUnicode_READY_REPLACE(&unicode))
if (PyUnicode_READY(unicode))
return NULL;
self = (PyUnicodeObject *) type->tp_alloc(type, 0);
@ -13131,7 +13161,7 @@ PyUnicode_InternInPlace(PyObject **p)
if (PyUnicode_CHECK_INTERNED(s))
return;
if (_PyUnicode_READY_REPLACE(p)) {
assert(0 && "PyUnicode_READY fail in PyUnicode_InternInPlace");
assert(0 && "_PyUnicode_READY_REPLACE fail in PyUnicode_InternInPlace");
return;
}
s = (PyUnicodeObject *)(*p);
@ -13217,8 +13247,10 @@ _Py_ReleaseInternedUnicodeStrings(void)
n);
for (i = 0; i < n; i++) {
s = (PyUnicodeObject *) PyList_GET_ITEM(keys, i);
if (PyUnicode_READY(s) == -1)
if (PyUnicode_READY(s) == -1) {
assert(0 && "could not ready string");
fprintf(stderr, "could not ready string\n");
}
switch (PyUnicode_CHECK_INTERNED(s)) {
case SSTATE_NOT_INTERNED:
/* XXX Shouldn't happen */

View File

@ -834,14 +834,21 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'C': {/* unicode char */
int *p = va_arg(*p_va, int *);
if (PyUnicode_Check(arg) &&
PyUnicode_GET_LENGTH(arg) == 1) {
int kind = PyUnicode_KIND(arg);
void *data = PyUnicode_DATA(arg);
*p = PyUnicode_READ(kind, data, 0);
}
else
int kind;
void *data;
if (!PyUnicode_Check(arg))
return converterr("a unicode character", arg, msgbuf, bufsize);
if (PyUnicode_READY(arg))
RETURN_ERR_OCCURRED;
if (PyUnicode_GET_LENGTH(arg) != 1)
return converterr("a unicode character", arg, msgbuf, bufsize);
kind = PyUnicode_KIND(arg);
data = PyUnicode_DATA(arg);
*p = PyUnicode_READ(kind, data, 0);
break;
}