summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/_warnings.c13
-rw-r--r--Python/formatter_unicode.c20
-rw-r--r--Python/getargs.c21
-rw-r--r--Python/import.c3
-rw-r--r--Python/traceback.c16
5 files changed, 49 insertions, 24 deletions
diff --git a/Python/_warnings.c b/Python/_warnings.c
index 2bcca91fa6..792e3ed6df 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -497,9 +497,16 @@ setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,
/* Setup filename. */
*filename = PyDict_GetItemString(globals, "__file__");
if (*filename != NULL && PyUnicode_Check(*filename)) {
- Py_ssize_t len = PyUnicode_GetSize(*filename);
- int kind = PyUnicode_KIND(*filename);
- void *data = PyUnicode_DATA(*filename);
+ Py_ssize_t len;
+ int kind;
+ void *data;
+
+ if (PyUnicode_READY(*filename))
+ goto handle_error;
+
+ len = PyUnicode_GetSize(*filename);
+ kind = PyUnicode_KIND(*filename);
+ data = PyUnicode_DATA(*filename);
/* if filename.lower().endswith((".pyc", ".pyo")): */
if (len >= 4 &&
diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c
index 609df648b0..a389734390 100644
--- a/Python/formatter_unicode.c
+++ b/Python/formatter_unicode.c
@@ -501,7 +501,7 @@ calc_number_widths(NumberFieldWidths *spec, Py_ssize_t n_prefix,
spec->n_grouped_digits = 0;
else
spec->n_grouped_digits = _PyUnicode_InsertThousandsGrouping(
- PyUnicode_1BYTE_KIND, NULL, 0, NULL,
+ NULL, PyUnicode_1BYTE_KIND, NULL, 0, NULL,
spec->n_digits, spec->n_min_width,
locale->grouping, locale->thousands_sep);
@@ -603,7 +603,7 @@ fill_number(PyObject *out, Py_ssize_t pos, const NumberFieldWidths *spec,
r =
#endif
_PyUnicode_InsertThousandsGrouping(
- kind,
+ out, kind,
(char*)data + PyUnicode_KIND_SIZE(kind, pos),
spec->n_grouped_digits,
pdigits + PyUnicode_KIND_SIZE(kind, d_pos),
@@ -1284,33 +1284,31 @@ _PyUnicode_FormatAdvanced(PyObject *obj,
Py_ssize_t start, Py_ssize_t end)
{
InternalFormatSpec format;
- PyObject *result = NULL;
+ PyObject *result;
/* check for the special case of zero length format spec, make
it equivalent to str(obj) */
- if (start == end) {
- result = PyObject_Str(obj);
- goto done;
- }
+ if (start == end)
+ return PyObject_Str(obj);
/* parse the format_spec */
if (!parse_internal_render_format_spec(format_spec, start, end,
&format, 's', '<'))
- goto done;
+ return NULL;
/* type conversion? */
switch (format.type) {
case 's':
/* no type conversion needed, already a string. do the formatting */
result = format_string_internal(obj, &format);
+ if (result != NULL)
+ assert(_PyUnicode_CheckConsistency(result, 1));
break;
default:
/* unknown */
unknown_presentation_type(format.type, obj->ob_type->tp_name);
- goto done;
+ result = NULL;
}
-
-done:
return result;
}
diff --git a/Python/getargs.c b/Python/getargs.c
index 0e7d9c4350..2c2db36193 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -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;
}
diff --git a/Python/import.c b/Python/import.c
index 9f094c0da0..5f84ac2f74 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1785,6 +1785,9 @@ find_module_path(PyObject *fullname, PyObject *name, PyObject *path,
else
return 0;
+ if (PyUnicode_READY(path_unicode))
+ return -1;
+
len = PyUnicode_GET_LENGTH(path_unicode);
if (!PyUnicode_AsUCS4(path_unicode, buf, Py_ARRAY_LENGTH(buf), 1)) {
Py_DECREF(path_unicode);
diff --git a/Python/traceback.c b/Python/traceback.c
index 9a11bf2df7..b66c96cda6 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -483,7 +483,8 @@ dump_ascii(int fd, PyObject *text)
Py_ssize_t i, size;
int truncated;
int kind;
- void *data;
+ void *data = NULL;
+ wchar_t *wstr = NULL;
Py_UCS4 ch;
size = ascii->length;
@@ -494,11 +495,17 @@ dump_ascii(int fd, PyObject *text)
else
data = ((PyCompactUnicodeObject*)text) + 1;
}
- else {
+ else if (kind != PyUnicode_WCHAR_KIND) {
data = ((PyUnicodeObject *)text)->data.any;
if (data == NULL)
return;
}
+ else {
+ wstr = ((PyASCIIObject *)text)->wstr;
+ if (wstr == NULL)
+ return;
+ size = ((PyCompactUnicodeObject *)text)->wstr_length;
+ }
if (MAX_STRING_LENGTH < size) {
size = MAX_STRING_LENGTH;
@@ -508,7 +515,10 @@ dump_ascii(int fd, PyObject *text)
truncated = 0;
for (i=0; i < size; i++) {
- ch = PyUnicode_READ(kind, data, i);
+ if (kind != PyUnicode_WCHAR_KIND)
+ ch = PyUnicode_READ(kind, data, i);
+ else
+ ch = wstr[i];
if (ch < 128) {
char c = (char)ch;
write(fd, &c, 1);