diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2020-05-02 11:55:51 +0200 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2020-05-02 11:55:51 +0200 |
commit | ac1d79a656863c1693b0419586b3540702bbf795 (patch) | |
tree | 145e7bb66d69b028c19208e40e76fcde0a295fbc | |
parent | 8cf3192da3fec2a40f492b06a163dc8449a20762 (diff) | |
download | cython-ac1d79a656863c1693b0419586b3540702bbf795.tar.gz |
Improve error handling in "cython.array" creation code to avoid calling Py_BuildValue() with an exception set if "__pyx_format_from_typeinfo()" failed.
-rw-r--r-- | Cython/Compiler/ExprNodes.py | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index ce1fe2870..4e75e444b 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -10729,17 +10729,20 @@ class CythonArrayNode(ExprNode): code.putln(code.error_goto(self.operand.pos)) code.putln("}") - code.putln("%s = __pyx_format_from_typeinfo(&%s);" % - (format_temp, type_info)) - buildvalue_fmt = " __PYX_BUILD_PY_SSIZE_T " * len(shapes) - code.putln('%s = Py_BuildValue((char*) "(" %s ")", %s);' % ( - shapes_temp, buildvalue_fmt, ", ".join(shapes))) - - err = "!%s || !%s || !PyBytes_AsString(%s)" % (format_temp, - shapes_temp, - format_temp) - code.putln(code.error_goto_if(err, self.pos)) + code.putln("%s = __pyx_format_from_typeinfo(&%s); %s" % ( + format_temp, + type_info, + code.error_goto_if_null(format_temp, self.pos), + )) code.put_gotref(format_temp, py_object_type) + + buildvalue_fmt = " __PYX_BUILD_PY_SSIZE_T " * len(shapes) + code.putln('%s = Py_BuildValue((char*) "(" %s ")", %s); %s' % ( + shapes_temp, + buildvalue_fmt, + ", ".join(shapes), + code.error_goto_if_null(shapes_temp, self.pos), + )) code.put_gotref(shapes_temp, py_object_type) tup = (self.result(), shapes_temp, itemsize, format_temp, |