Core and Builtins
-----------------
-- Issue #20437: Fixed 21 potential bugs when deleting objects references.
++- Issue #20437: Fixed 22 potential bugs when deleting objects references.
+
-- Issue #20538: UTF-7 incremental decoder produced inconsistant string when
- input was truncated in BASE64 section.
-
-- Issue #17825: Cursor "^" is correctly positioned for SyntaxError and
- IndentationError.
-
-- Issue #2382: SyntaxError cursor "^" is now written at correct position in most
- cases when multibyte characters are in line (before "^"). This still not
- works correctly with wide East Asian characters.
-
-- Issue #18960: The first line of Python script could be executed twice when
- the source encoding was specified on the second line. Now the source encoding
- declaration on the second line isn't effective if the first line contains
- anything except a comment. 'python -x' works now again with files with the
- source encoding declarations, and can be used to make Python batch files
- on Windows.
-
-- Issue #17432: Drop UCS2 from names of Unicode functions in python3.def.
-
-- Issue #19969: PyBytes_FromFormatV() now raises an OverflowError if "%c"
- argument is not in range [0; 255].
+- Issue #20500: Displaying an exception at interpreter shutdown no longer
+ risks triggering an assertion failure in PyObject_Str.
-- Issue #14432: Generator now clears the borrowed reference to the thread
- state. Fix a crash when a generator is created in a C thread that is
- destroyed while the generator is still used. The issue was that a generator
- contains a frame, and the frame kept a reference to the Python state of the
- destroyed C thread. The crash occurs when a trace function is setup.
+- Issue #20538: UTF-7 incremental decoder produced inconsistent string when
+ input was truncated in BASE64 section.
-- Issue #19932: Fix typo in import.h, missing whitespaces in function prototypes.
+- Issue #20404: io.TextIOWrapper (and hence the open() builtin) now uses the
+ internal codec marking system added for issue #19619 to throw LookupError
+ for known non-text encodings at stream construction time. The existing
+ output type checks remain in place to deal with unmarked third party
+ codecs.
-- Issue #19729: In str.format(), fix recursive expansion in format spec.
+- Issue #17162: Add PyType_GetSlot.
-- Issue #19638: Fix possible crash / undefined behaviour from huge (more than 2
- billion characters) input strings in _Py_dg_strtod.
+- Issue #20162: Fix an alignment issue in the siphash24() hash function which
+ caused a crash on PowerPC 64-bit (ppc64).
Library
-------
return;
onError:
- Py_DECREF(*exceptionObject);
- *exceptionObject = NULL;
+ Py_CLEAR(*exceptionObject);
}
+#ifdef HAVE_MBCS
/* error handling callback helper:
build arguments, call the callback and check the arguments,
if no exception occurred, copy the replacement to the output
PyObject *newbuffer;
newbuffer = resize_compact(writer->buffer, writer->pos);
if (newbuffer == NULL) {
-- Py_DECREF(writer->buffer);
- writer->buffer = NULL;
++ Py_CLEAR(writer->buffer);
return NULL;
}
writer->buffer = newbuffer;
if (tstate->use_tracing) {
if (tstate->c_tracefunc) {
if (why == WHY_RETURN || why == WHY_YIELD) {
- if (call_trace(tstate->c_tracefunc,
- tstate->c_traceobj, f,
+ if (call_trace(tstate->c_tracefunc, tstate->c_traceobj,
+ tstate, f,
PyTrace_RETURN, retval)) {
- Py_XDECREF(retval);
- retval = NULL;
+ Py_CLEAR(retval);
why = WHY_EXCEPTION;
}
}
if (tstate->c_profilefunc) {
if (why == WHY_EXCEPTION)
call_trace_protected(tstate->c_profilefunc,
- tstate->c_profileobj, f,
+ tstate->c_profileobj,
+ tstate, f,
PyTrace_RETURN, NULL);
- else if (call_trace(tstate->c_profilefunc,
- tstate->c_profileobj, f,
+ else if (call_trace(tstate->c_profilefunc, tstate->c_profileobj,
+ tstate, f,
PyTrace_RETURN, retval)) {
- Py_XDECREF(retval);
- retval = NULL;
+ Py_CLEAR(retval);
/* why = WHY_EXCEPTION; */
}
}
callback = frame->f_trace;
if (callback == NULL)
return 0;
- result = call_trampoline(tstate, callback, frame, what, arg);
+ result = call_trampoline(callback, frame, what, arg);
if (result == NULL) {
PyEval_SetTrace(NULL, NULL);
- Py_XDECREF(frame->f_trace);
- frame->f_trace = NULL;
+ Py_CLEAR(frame->f_trace);
return -1;
}
if (result != Py_None) {