gh-108512: Add and use new replacements for PySys_GetObject() (GH-111035)
Add functions PySys_GetAttr(), PySys_GetAttrString(), PySys_GetOptionalAttr() and PySys_GetOptionalAttrString().
This commit is contained in:
parent
b265a7ddeb
commit
bac3fcba5b
@ -2111,7 +2111,7 @@ initialization::
|
|||||||
|
|
||||||
/* Specify sys.path explicitly */
|
/* Specify sys.path explicitly */
|
||||||
/* If you want to modify the default set of paths, finish
|
/* If you want to modify the default set of paths, finish
|
||||||
initialization first and then use PySys_GetObject("path") */
|
initialization first and then use PySys_GetAttrString("path") */
|
||||||
config.module_search_paths_set = 1;
|
config.module_search_paths_set = 1;
|
||||||
status = PyWideStringList_Append(&config.module_search_paths,
|
status = PyWideStringList_Append(&config.module_search_paths,
|
||||||
L"/path/to/stdlib");
|
L"/path/to/stdlib");
|
||||||
|
@ -258,10 +258,57 @@ These are utility functions that make functionality from the :mod:`sys` module
|
|||||||
accessible to C code. They all work with the current interpreter thread's
|
accessible to C code. They all work with the current interpreter thread's
|
||||||
:mod:`sys` module's dict, which is contained in the internal thread state structure.
|
:mod:`sys` module's dict, which is contained in the internal thread state structure.
|
||||||
|
|
||||||
|
.. c:function:: PyObject *PySys_GetAttr(PyObject *name)
|
||||||
|
|
||||||
|
Get the attribute *name* of the :mod:`sys` module.
|
||||||
|
Return a :term:`strong reference`.
|
||||||
|
Raise :exc:`RuntimeError` and return ``NULL`` if it does not exist or
|
||||||
|
if the :mod:`sys` module cannot be found.
|
||||||
|
|
||||||
|
If the non-existing object should not be treated as a failure, you can use
|
||||||
|
:c:func:`PySys_GetOptionalAttr` instead.
|
||||||
|
|
||||||
|
.. versionadded:: next
|
||||||
|
|
||||||
|
.. c:function:: PyObject *PySys_GetAttrString(const char *name)
|
||||||
|
|
||||||
|
This is the same as :c:func:`PySys_GetAttr`, but *name* is
|
||||||
|
specified as a :c:expr:`const char*` UTF-8 encoded bytes string,
|
||||||
|
rather than a :c:expr:`PyObject*`.
|
||||||
|
|
||||||
|
If the non-existing object should not be treated as a failure, you can use
|
||||||
|
:c:func:`PySys_GetOptionalAttrString` instead.
|
||||||
|
|
||||||
|
.. versionadded:: next
|
||||||
|
|
||||||
|
.. c:function:: int PySys_GetOptionalAttr(PyObject *name, PyObject **result)
|
||||||
|
|
||||||
|
Variant of :c:func:`PySys_GetAttr` which doesn't raise
|
||||||
|
exception if the object does not exist.
|
||||||
|
|
||||||
|
* Set *\*result* to a new :term:`strong reference` to the object and
|
||||||
|
return ``1`` if the object exists.
|
||||||
|
* Set *\*result* to ``NULL`` and return ``0`` without setting an exception
|
||||||
|
if the object does not exist.
|
||||||
|
* Set an exception, set *\*result* to ``NULL``, and return ``-1``,
|
||||||
|
if an error occurred.
|
||||||
|
|
||||||
|
.. versionadded:: next
|
||||||
|
|
||||||
|
.. c:function:: int PySys_GetOptionalAttrString(const char *name, PyObject **result)
|
||||||
|
|
||||||
|
This is the same as :c:func:`PySys_GetOptionalAttr`, but *name* is
|
||||||
|
specified as a :c:expr:`const char*` UTF-8 encoded bytes string,
|
||||||
|
rather than a :c:expr:`PyObject*`.
|
||||||
|
|
||||||
|
.. versionadded:: next
|
||||||
|
|
||||||
.. c:function:: PyObject *PySys_GetObject(const char *name)
|
.. c:function:: PyObject *PySys_GetObject(const char *name)
|
||||||
|
|
||||||
Return the object *name* from the :mod:`sys` module or ``NULL`` if it does
|
Similar to :c:func:`PySys_GetAttrString`, but return a :term:`borrowed
|
||||||
not exist, without setting an exception.
|
reference` and return ``NULL`` *without* setting exception on failure.
|
||||||
|
|
||||||
|
Preserves exception that was set before the call.
|
||||||
|
|
||||||
.. c:function:: int PySys_SetObject(const char *name, PyObject *v)
|
.. c:function:: int PySys_SetObject(const char *name, PyObject *v)
|
||||||
|
|
||||||
|
4
Doc/data/stable_abi.dat
generated
4
Doc/data/stable_abi.dat
generated
@ -628,7 +628,11 @@ func,PySys_Audit,3.13,,
|
|||||||
func,PySys_AuditTuple,3.13,,
|
func,PySys_AuditTuple,3.13,,
|
||||||
func,PySys_FormatStderr,3.2,,
|
func,PySys_FormatStderr,3.2,,
|
||||||
func,PySys_FormatStdout,3.2,,
|
func,PySys_FormatStdout,3.2,,
|
||||||
|
func,PySys_GetAttr,3.15,,
|
||||||
|
func,PySys_GetAttrString,3.15,,
|
||||||
func,PySys_GetObject,3.2,,
|
func,PySys_GetObject,3.2,,
|
||||||
|
func,PySys_GetOptionalAttr,3.15,,
|
||||||
|
func,PySys_GetOptionalAttrString,3.15,,
|
||||||
func,PySys_GetXOptions,3.7,,
|
func,PySys_GetXOptions,3.7,,
|
||||||
func,PySys_ResetWarnOptions,3.2,,
|
func,PySys_ResetWarnOptions,3.2,,
|
||||||
func,PySys_SetArgv,3.2,,
|
func,PySys_SetArgv,3.2,,
|
||||||
|
@ -213,7 +213,10 @@ C API changes
|
|||||||
New features
|
New features
|
||||||
------------
|
------------
|
||||||
|
|
||||||
* TODO
|
* Add :c:func:`PySys_GetAttr`, :c:func:`PySys_GetAttrString`,
|
||||||
|
:c:func:`PySys_GetOptionalAttr`, and :c:func:`PySys_GetOptionalAttrString`
|
||||||
|
functions as replacements for :c:func:`PySys_GetObject`.
|
||||||
|
(Contributed by Serhiy Storchaka in :gh:`108512`.)
|
||||||
|
|
||||||
Porting to Python 3.15
|
Porting to Python 3.15
|
||||||
----------------------
|
----------------------
|
||||||
|
@ -8,11 +8,6 @@ extern "C" {
|
|||||||
# error "this header requires Py_BUILD_CORE define"
|
# error "this header requires Py_BUILD_CORE define"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
PyAPI_FUNC(int) _PySys_GetOptionalAttr(PyObject *, PyObject **);
|
|
||||||
PyAPI_FUNC(int) _PySys_GetOptionalAttrString(const char *, PyObject **);
|
|
||||||
PyAPI_FUNC(PyObject *) _PySys_GetRequiredAttr(PyObject *);
|
|
||||||
PyAPI_FUNC(PyObject *) _PySys_GetRequiredAttrString(const char *);
|
|
||||||
|
|
||||||
// Export for '_pickle' shared extension
|
// Export for '_pickle' shared extension
|
||||||
PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *);
|
PyAPI_FUNC(size_t) _PySys_GetSizeOf(PyObject *);
|
||||||
|
|
||||||
|
@ -4,6 +4,12 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030f0000
|
||||||
|
PyAPI_FUNC(PyObject *) PySys_GetAttr(PyObject *);
|
||||||
|
PyAPI_FUNC(PyObject *) PySys_GetAttrString(const char *);
|
||||||
|
PyAPI_FUNC(int) PySys_GetOptionalAttr(PyObject *, PyObject **);
|
||||||
|
PyAPI_FUNC(int) PySys_GetOptionalAttrString(const char *, PyObject **);
|
||||||
|
#endif
|
||||||
PyAPI_FUNC(PyObject *) PySys_GetObject(const char *);
|
PyAPI_FUNC(PyObject *) PySys_GetObject(const char *);
|
||||||
PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *);
|
PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *);
|
||||||
|
|
||||||
|
@ -19,6 +19,68 @@ class CAPITest(unittest.TestCase):
|
|||||||
|
|
||||||
maxDiff = None
|
maxDiff = None
|
||||||
|
|
||||||
|
@unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
|
||||||
|
def test_sys_getattr(self):
|
||||||
|
# Test PySys_GetAttr()
|
||||||
|
sys_getattr = _testlimitedcapi.sys_getattr
|
||||||
|
|
||||||
|
self.assertIs(sys_getattr('stdout'), sys.stdout)
|
||||||
|
with support.swap_attr(sys, '\U0001f40d', 42):
|
||||||
|
self.assertEqual(sys_getattr('\U0001f40d'), 42)
|
||||||
|
|
||||||
|
with self.assertRaisesRegex(RuntimeError, r'lost sys\.nonexistent'):
|
||||||
|
sys_getattr('nonexistent')
|
||||||
|
with self.assertRaisesRegex(RuntimeError, r'lost sys\.\U0001f40d'):
|
||||||
|
sys_getattr('\U0001f40d')
|
||||||
|
self.assertRaises(TypeError, sys_getattr, 1)
|
||||||
|
self.assertRaises(TypeError, sys_getattr, [])
|
||||||
|
# CRASHES sys_getattr(NULL)
|
||||||
|
|
||||||
|
@unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
|
||||||
|
def test_sys_getattrstring(self):
|
||||||
|
# Test PySys_GetAttrString()
|
||||||
|
getattrstring = _testlimitedcapi.sys_getattrstring
|
||||||
|
|
||||||
|
self.assertIs(getattrstring(b'stdout'), sys.stdout)
|
||||||
|
with support.swap_attr(sys, '\U0001f40d', 42):
|
||||||
|
self.assertEqual(getattrstring('\U0001f40d'.encode()), 42)
|
||||||
|
|
||||||
|
with self.assertRaisesRegex(RuntimeError, r'lost sys\.nonexistent'):
|
||||||
|
getattrstring(b'nonexistent')
|
||||||
|
with self.assertRaisesRegex(RuntimeError, r'lost sys\.\U0001f40d'):
|
||||||
|
getattrstring('\U0001f40d'.encode())
|
||||||
|
self.assertRaises(UnicodeDecodeError, getattrstring, b'\xff')
|
||||||
|
# CRASHES getattrstring(NULL)
|
||||||
|
|
||||||
|
@unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
|
||||||
|
def test_sys_getoptionalattr(self):
|
||||||
|
# Test PySys_GetOptionalAttr()
|
||||||
|
getoptionalattr = _testlimitedcapi.sys_getoptionalattr
|
||||||
|
|
||||||
|
self.assertIs(getoptionalattr('stdout'), sys.stdout)
|
||||||
|
with support.swap_attr(sys, '\U0001f40d', 42):
|
||||||
|
self.assertEqual(getoptionalattr('\U0001f40d'), 42)
|
||||||
|
|
||||||
|
self.assertIs(getoptionalattr('nonexistent'), AttributeError)
|
||||||
|
self.assertIs(getoptionalattr('\U0001f40d'), AttributeError)
|
||||||
|
self.assertRaises(TypeError, getoptionalattr, 1)
|
||||||
|
self.assertRaises(TypeError, getoptionalattr, [])
|
||||||
|
# CRASHES getoptionalattr(NULL)
|
||||||
|
|
||||||
|
@unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
|
||||||
|
def test_sys_getoptionalattrstring(self):
|
||||||
|
# Test PySys_GetOptionalAttrString()
|
||||||
|
getoptionalattrstring = _testlimitedcapi.sys_getoptionalattrstring
|
||||||
|
|
||||||
|
self.assertIs(getoptionalattrstring(b'stdout'), sys.stdout)
|
||||||
|
with support.swap_attr(sys, '\U0001f40d', 42):
|
||||||
|
self.assertEqual(getoptionalattrstring('\U0001f40d'.encode()), 42)
|
||||||
|
|
||||||
|
self.assertIs(getoptionalattrstring(b'nonexistent'), AttributeError)
|
||||||
|
self.assertIs(getoptionalattrstring('\U0001f40d'.encode()), AttributeError)
|
||||||
|
self.assertRaises(UnicodeDecodeError, getoptionalattrstring, b'\xff')
|
||||||
|
# CRASHES getoptionalattrstring(NULL)
|
||||||
|
|
||||||
@support.cpython_only
|
@support.cpython_only
|
||||||
@unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
|
@unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
|
||||||
def test_sys_getobject(self):
|
def test_sys_getobject(self):
|
||||||
@ -29,7 +91,7 @@ class CAPITest(unittest.TestCase):
|
|||||||
with support.swap_attr(sys, '\U0001f40d', 42):
|
with support.swap_attr(sys, '\U0001f40d', 42):
|
||||||
self.assertEqual(getobject('\U0001f40d'.encode()), 42)
|
self.assertEqual(getobject('\U0001f40d'.encode()), 42)
|
||||||
|
|
||||||
self.assertIs(getobject(b'nonexisting'), AttributeError)
|
self.assertIs(getobject(b'nonexistent'), AttributeError)
|
||||||
with support.catch_unraisable_exception() as cm:
|
with support.catch_unraisable_exception() as cm:
|
||||||
self.assertIs(getobject(b'\xff'), AttributeError)
|
self.assertIs(getobject(b'\xff'), AttributeError)
|
||||||
self.assertEqual(cm.unraisable.exc_type, UnicodeDecodeError)
|
self.assertEqual(cm.unraisable.exc_type, UnicodeDecodeError)
|
||||||
|
4
Lib/test/test_stable_abi_ctypes.py
generated
4
Lib/test/test_stable_abi_ctypes.py
generated
@ -658,7 +658,11 @@ SYMBOL_NAMES = (
|
|||||||
"PySys_AuditTuple",
|
"PySys_AuditTuple",
|
||||||
"PySys_FormatStderr",
|
"PySys_FormatStderr",
|
||||||
"PySys_FormatStdout",
|
"PySys_FormatStdout",
|
||||||
|
"PySys_GetAttr",
|
||||||
|
"PySys_GetAttrString",
|
||||||
"PySys_GetObject",
|
"PySys_GetObject",
|
||||||
|
"PySys_GetOptionalAttr",
|
||||||
|
"PySys_GetOptionalAttrString",
|
||||||
"PySys_GetXOptions",
|
"PySys_GetXOptions",
|
||||||
"PySys_HasWarnOptions",
|
"PySys_HasWarnOptions",
|
||||||
"PySys_ResetWarnOptions",
|
"PySys_ResetWarnOptions",
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
Add functions :c:func:`PySys_GetAttr`, :c:func:`PySys_GetAttrString`,
|
||||||
|
:c:func:`PySys_GetOptionalAttr` and :c:func:`PySys_GetOptionalAttrString`.
|
@ -2575,3 +2575,11 @@
|
|||||||
added = '3.14'
|
added = '3.14'
|
||||||
[function.Py_PACK_VERSION]
|
[function.Py_PACK_VERSION]
|
||||||
added = '3.14'
|
added = '3.14'
|
||||||
|
[function.PySys_GetAttr]
|
||||||
|
added = '3.15'
|
||||||
|
[function.PySys_GetAttrString]
|
||||||
|
added = '3.15'
|
||||||
|
[function.PySys_GetOptionalAttr]
|
||||||
|
added = '3.15'
|
||||||
|
[function.PySys_GetOptionalAttrString]
|
||||||
|
added = '3.15'
|
||||||
|
@ -108,7 +108,6 @@ static const char PyCursesVersion[] = "2.2";
|
|||||||
#include "pycore_capsule.h" // _PyCapsule_SetTraverse()
|
#include "pycore_capsule.h" // _PyCapsule_SetTraverse()
|
||||||
#include "pycore_long.h" // _PyLong_GetZero()
|
#include "pycore_long.h" // _PyLong_GetZero()
|
||||||
#include "pycore_structseq.h" // _PyStructSequence_NewType()
|
#include "pycore_structseq.h" // _PyStructSequence_NewType()
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetOptionalAttrString()
|
|
||||||
#include "pycore_fileutils.h" // _Py_set_inheritable
|
#include "pycore_fileutils.h" // _Py_set_inheritable
|
||||||
|
|
||||||
#ifdef __hpux
|
#ifdef __hpux
|
||||||
@ -3847,7 +3846,7 @@ _curses_setupterm_impl(PyObject *module, const char *term, int fd)
|
|||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
PyObject* sys_stdout;
|
PyObject* sys_stdout;
|
||||||
|
|
||||||
if (_PySys_GetOptionalAttrString("stdout", &sys_stdout) < 0) {
|
if (PySys_GetOptionalAttrString("stdout", &sys_stdout) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -782,7 +782,7 @@ _lsprof_Profiler_enable_impl(ProfilerObject *self, int subcalls,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyObject* monitoring = PyImport_ImportModuleAttrString("sys", "monitoring");
|
PyObject* monitoring = PySys_GetAttrString("monitoring");
|
||||||
if (!monitoring) {
|
if (!monitoring) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -864,7 +864,7 @@ _lsprof_Profiler_disable_impl(ProfilerObject *self)
|
|||||||
}
|
}
|
||||||
if (self->flags & POF_ENABLED) {
|
if (self->flags & POF_ENABLED) {
|
||||||
PyObject* result = NULL;
|
PyObject* result = NULL;
|
||||||
PyObject* monitoring = PyImport_ImportModuleAttrString("sys", "monitoring");
|
PyObject* monitoring = PySys_GetAttrString("monitoring");
|
||||||
|
|
||||||
if (!monitoring) {
|
if (!monitoring) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -983,7 +983,7 @@ profiler_init_impl(ProfilerObject *self, PyObject *timer, double timeunit,
|
|||||||
Py_XSETREF(self->externalTimer, Py_XNewRef(timer));
|
Py_XSETREF(self->externalTimer, Py_XNewRef(timer));
|
||||||
self->tool_id = PY_MONITORING_PROFILER_ID;
|
self->tool_id = PY_MONITORING_PROFILER_ID;
|
||||||
|
|
||||||
PyObject* monitoring = PyImport_ImportModuleAttrString("sys", "monitoring");
|
PyObject* monitoring = PySys_GetAttrString("monitoring");
|
||||||
if (!monitoring) {
|
if (!monitoring) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1915,7 +1915,7 @@ whichmodule(PickleState *st, PyObject *global, PyObject *global_name, PyObject *
|
|||||||
__module__ can be None. If it is so, then search sys.modules for
|
__module__ can be None. If it is so, then search sys.modules for
|
||||||
the module of global. */
|
the module of global. */
|
||||||
Py_CLEAR(module_name);
|
Py_CLEAR(module_name);
|
||||||
modules = _PySys_GetRequiredAttr(&_Py_ID(modules));
|
modules = PySys_GetAttr(&_Py_ID(modules));
|
||||||
if (modules == NULL) {
|
if (modules == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,76 @@
|
|||||||
|
#include "pyconfig.h" // Py_GIL_DISABLED
|
||||||
|
// Need limited C API version 3.15 for PySys_GetAttr() etc
|
||||||
|
#if !defined(Py_GIL_DISABLED) && !defined(Py_LIMITED_API)
|
||||||
|
# define Py_LIMITED_API 0x030f0000
|
||||||
|
#endif
|
||||||
#include "parts.h"
|
#include "parts.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
sys_getattr(PyObject *Py_UNUSED(module), PyObject *name)
|
||||||
|
{
|
||||||
|
NULLABLE(name);
|
||||||
|
return PySys_GetAttr(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
sys_getattrstring(PyObject *Py_UNUSED(module), PyObject *arg)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
Py_ssize_t size;
|
||||||
|
if (!PyArg_Parse(arg, "z#", &name, &size)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return PySys_GetAttrString(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
sys_getoptionalattr(PyObject *Py_UNUSED(module), PyObject *name)
|
||||||
|
{
|
||||||
|
PyObject *value = UNINITIALIZED_PTR;
|
||||||
|
NULLABLE(name);
|
||||||
|
|
||||||
|
switch (PySys_GetOptionalAttr(name, &value)) {
|
||||||
|
case -1:
|
||||||
|
assert(value == NULL);
|
||||||
|
assert(PyErr_Occurred());
|
||||||
|
return NULL;
|
||||||
|
case 0:
|
||||||
|
assert(value == NULL);
|
||||||
|
return Py_NewRef(PyExc_AttributeError);
|
||||||
|
case 1:
|
||||||
|
return value;
|
||||||
|
default:
|
||||||
|
Py_FatalError("PySys_GetOptionalAttr() returned invalid code");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
sys_getoptionalattrstring(PyObject *Py_UNUSED(module), PyObject *arg)
|
||||||
|
{
|
||||||
|
PyObject *value = UNINITIALIZED_PTR;
|
||||||
|
const char *name;
|
||||||
|
Py_ssize_t size;
|
||||||
|
if (!PyArg_Parse(arg, "z#", &name, &size)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (PySys_GetOptionalAttrString(name, &value)) {
|
||||||
|
case -1:
|
||||||
|
assert(value == NULL);
|
||||||
|
assert(PyErr_Occurred());
|
||||||
|
return NULL;
|
||||||
|
case 0:
|
||||||
|
assert(value == NULL);
|
||||||
|
return Py_NewRef(PyExc_AttributeError);
|
||||||
|
case 1:
|
||||||
|
return value;
|
||||||
|
default:
|
||||||
|
Py_FatalError("PySys_GetOptionalAttrString() returned invalid code");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
sys_getobject(PyObject *Py_UNUSED(module), PyObject *arg)
|
sys_getobject(PyObject *Py_UNUSED(module), PyObject *arg)
|
||||||
{
|
{
|
||||||
@ -39,6 +108,10 @@ sys_getxoptions(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(ignored))
|
|||||||
|
|
||||||
|
|
||||||
static PyMethodDef test_methods[] = {
|
static PyMethodDef test_methods[] = {
|
||||||
|
{"sys_getattr", sys_getattr, METH_O},
|
||||||
|
{"sys_getattrstring", sys_getattrstring, METH_O},
|
||||||
|
{"sys_getoptionalattr", sys_getoptionalattr, METH_O},
|
||||||
|
{"sys_getoptionalattrstring", sys_getoptionalattrstring, METH_O},
|
||||||
{"sys_getobject", sys_getobject, METH_O},
|
{"sys_getobject", sys_getobject, METH_O},
|
||||||
{"sys_setobject", sys_setobject, METH_VARARGS},
|
{"sys_setobject", sys_setobject, METH_VARARGS},
|
||||||
{"sys_getxoptions", sys_getxoptions, METH_NOARGS},
|
{"sys_getxoptions", sys_getxoptions, METH_NOARGS},
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include "pycore_object_deferred.h" // _PyObject_SetDeferredRefcount()
|
#include "pycore_object_deferred.h" // _PyObject_SetDeferredRefcount()
|
||||||
#include "pycore_pylifecycle.h"
|
#include "pycore_pylifecycle.h"
|
||||||
#include "pycore_pystate.h" // _PyThreadState_SetCurrent()
|
#include "pycore_pystate.h" // _PyThreadState_SetCurrent()
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetOptionalAttr()
|
|
||||||
#include "pycore_time.h" // _PyTime_FromSeconds()
|
#include "pycore_time.h" // _PyTime_FromSeconds()
|
||||||
#include "pycore_weakref.h" // _PyWeakref_GET_REF()
|
#include "pycore_weakref.h" // _PyWeakref_GET_REF()
|
||||||
|
|
||||||
@ -2290,7 +2289,7 @@ thread_excepthook(PyObject *module, PyObject *args)
|
|||||||
PyObject *thread = PyStructSequence_GET_ITEM(args, 3);
|
PyObject *thread = PyStructSequence_GET_ITEM(args, 3);
|
||||||
|
|
||||||
PyObject *file;
|
PyObject *file;
|
||||||
if (_PySys_GetOptionalAttr( &_Py_ID(stderr), &file) < 0) {
|
if (PySys_GetOptionalAttr( &_Py_ID(stderr), &file) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (file == NULL || file == Py_None) {
|
if (file == NULL || file == Py_None) {
|
||||||
|
@ -31,7 +31,6 @@ Copyright (C) 1994 Steen Lumholt.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "pycore_long.h" // _PyLong_IsNegative()
|
#include "pycore_long.h" // _PyLong_IsNegative()
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetOptionalAttrString()
|
|
||||||
#include "pycore_unicodeobject.h" // _PyUnicode_AsUTF8String
|
#include "pycore_unicodeobject.h" // _PyUnicode_AsUTF8String
|
||||||
|
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
@ -146,7 +145,7 @@ _get_tcl_lib_path(void)
|
|||||||
int stat_return_value;
|
int stat_return_value;
|
||||||
PyObject *prefix;
|
PyObject *prefix;
|
||||||
|
|
||||||
(void) _PySys_GetOptionalAttrString("base_prefix", &prefix);
|
(void) PySys_GetOptionalAttrString("base_prefix", &prefix);
|
||||||
if (prefix == NULL) {
|
if (prefix == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -3547,7 +3546,7 @@ PyInit__tkinter(void)
|
|||||||
|
|
||||||
/* This helps the dynamic loader; in Unicode aware Tcl versions
|
/* This helps the dynamic loader; in Unicode aware Tcl versions
|
||||||
it also helps Tcl find its encodings. */
|
it also helps Tcl find its encodings. */
|
||||||
(void) _PySys_GetOptionalAttrString("executable", &uexe);
|
(void) PySys_GetOptionalAttrString("executable", &uexe);
|
||||||
if (uexe && PyUnicode_Check(uexe)) { // sys.executable can be None
|
if (uexe && PyUnicode_Check(uexe)) { // sys.executable can be None
|
||||||
cexe = PyUnicode_EncodeFSDefault(uexe);
|
cexe = PyUnicode_EncodeFSDefault(uexe);
|
||||||
Py_DECREF(uexe);
|
Py_DECREF(uexe);
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||||
#include "pycore_runtime.h" // _Py_ID()
|
#include "pycore_runtime.h" // _Py_ID()
|
||||||
#include "pycore_signal.h" // Py_NSIG
|
#include "pycore_signal.h" // Py_NSIG
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetRequiredAttr()
|
|
||||||
#include "pycore_time.h" // _PyTime_FromSecondsObject()
|
#include "pycore_time.h" // _PyTime_FromSecondsObject()
|
||||||
#include "pycore_traceback.h" // _Py_DumpTracebackThreads
|
#include "pycore_traceback.h" // _Py_DumpTracebackThreads
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
@ -98,7 +97,7 @@ faulthandler_get_fileno(PyObject **file_ptr)
|
|||||||
PyObject *file = *file_ptr;
|
PyObject *file = *file_ptr;
|
||||||
|
|
||||||
if (file == NULL || file == Py_None) {
|
if (file == NULL || file == Py_None) {
|
||||||
file = _PySys_GetRequiredAttr(&_Py_ID(stderr));
|
file = PySys_GetAttr(&_Py_ID(stderr));
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -497,16 +497,13 @@ error:
|
|||||||
static int
|
static int
|
||||||
pymain_run_interactive_hook(int *exitcode)
|
pymain_run_interactive_hook(int *exitcode)
|
||||||
{
|
{
|
||||||
PyObject *hook = PyImport_ImportModuleAttrString("sys",
|
PyObject *hook;
|
||||||
"__interactivehook__");
|
if (PySys_GetOptionalAttrString("__interactivehook__", &hook) < 0) {
|
||||||
if (hook == NULL) {
|
|
||||||
if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
|
|
||||||
// no sys.__interactivehook__ attribute
|
|
||||||
PyErr_Clear();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
if (hook == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (PySys_Audit("cpython.run_interactivehook", "O", hook) < 0) {
|
if (PySys_Audit("cpython.run_interactivehook", "O", hook) < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -56,7 +56,6 @@ Revision history:
|
|||||||
|
|
||||||
#include "Python.h"
|
#include "Python.h"
|
||||||
#include "osdefs.h" // SEP
|
#include "osdefs.h" // SEP
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetOptionalAttrString()
|
|
||||||
|
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
|
|
||||||
@ -92,7 +91,7 @@ syslog_get_argv(void)
|
|||||||
Py_ssize_t slash;
|
Py_ssize_t slash;
|
||||||
PyObject *argv;
|
PyObject *argv;
|
||||||
|
|
||||||
if (_PySys_GetOptionalAttrString("argv", &argv) <= 0) {
|
if (PySys_GetOptionalAttrString("argv", &argv) <= 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
#include "pycore_object.h" // _PyType_AllocNoTrack
|
#include "pycore_object.h" // _PyType_AllocNoTrack
|
||||||
#include "pycore_pyerrors.h" // _PyErr_FormatFromCause()
|
#include "pycore_pyerrors.h" // _PyErr_FormatFromCause()
|
||||||
#include "pycore_pystate.h" // _PyInterpreterState_GET()
|
#include "pycore_pystate.h" // _PyInterpreterState_GET()
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetOptionalAttrString()
|
|
||||||
#include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString()
|
#include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString()
|
||||||
|
|
||||||
#include "osdefs.h" // MAXPATHLEN
|
#include "osdefs.h" // MAXPATHLEN
|
||||||
@ -1058,7 +1057,7 @@ _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress)
|
|||||||
int is_possibly_shadowing_stdlib = 0;
|
int is_possibly_shadowing_stdlib = 0;
|
||||||
if (is_possibly_shadowing) {
|
if (is_possibly_shadowing) {
|
||||||
PyObject *stdlib_modules;
|
PyObject *stdlib_modules;
|
||||||
if (_PySys_GetOptionalAttrString("stdlib_module_names", &stdlib_modules) < 0) {
|
if (PySys_GetOptionalAttrString("stdlib_module_names", &stdlib_modules) < 0) {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (stdlib_modules && PyAnySet_Check(stdlib_modules)) {
|
if (stdlib_modules && PyAnySet_Check(stdlib_modules)) {
|
||||||
|
4
PC/python3dll.c
generated
4
PC/python3dll.c
generated
@ -595,7 +595,11 @@ EXPORT_FUNC(PySys_Audit)
|
|||||||
EXPORT_FUNC(PySys_AuditTuple)
|
EXPORT_FUNC(PySys_AuditTuple)
|
||||||
EXPORT_FUNC(PySys_FormatStderr)
|
EXPORT_FUNC(PySys_FormatStderr)
|
||||||
EXPORT_FUNC(PySys_FormatStdout)
|
EXPORT_FUNC(PySys_FormatStdout)
|
||||||
|
EXPORT_FUNC(PySys_GetAttr)
|
||||||
|
EXPORT_FUNC(PySys_GetAttrString)
|
||||||
EXPORT_FUNC(PySys_GetObject)
|
EXPORT_FUNC(PySys_GetObject)
|
||||||
|
EXPORT_FUNC(PySys_GetOptionalAttr)
|
||||||
|
EXPORT_FUNC(PySys_GetOptionalAttrString)
|
||||||
EXPORT_FUNC(PySys_GetXOptions)
|
EXPORT_FUNC(PySys_GetXOptions)
|
||||||
EXPORT_FUNC(PySys_HasWarnOptions)
|
EXPORT_FUNC(PySys_HasWarnOptions)
|
||||||
EXPORT_FUNC(PySys_ResetWarnOptions)
|
EXPORT_FUNC(PySys_ResetWarnOptions)
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
#include "pycore_long.h" // _PyLong_GetZero()
|
#include "pycore_long.h" // _PyLong_GetZero()
|
||||||
#include "pycore_pylifecycle.h" // _Py_IsInterpreterFinalizing()
|
#include "pycore_pylifecycle.h" // _Py_IsInterpreterFinalizing()
|
||||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetOptionalAttr()
|
|
||||||
#include "pycore_traceback.h" // _Py_DisplaySourceLine()
|
#include "pycore_traceback.h" // _Py_DisplaySourceLine()
|
||||||
#include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString()
|
#include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString()
|
||||||
|
|
||||||
@ -678,7 +677,7 @@ show_warning(PyThreadState *tstate, PyObject *filename, int lineno,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(stderr), &f_stderr) <= 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(stderr), &f_stderr) <= 0) {
|
||||||
fprintf(stderr, "lost sys.stderr\n");
|
fprintf(stderr, "lost sys.stderr\n");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include "pycore_pyerrors.h" // _PyErr_NoMemory()
|
#include "pycore_pyerrors.h" // _PyErr_NoMemory()
|
||||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||||
#include "pycore_pythonrun.h" // _Py_SourceAsString()
|
#include "pycore_pythonrun.h" // _Py_SourceAsString()
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetRequiredAttr()
|
|
||||||
#include "pycore_tuple.h" // _PyTuple_FromArray()
|
#include "pycore_tuple.h" // _PyTuple_FromArray()
|
||||||
#include "pycore_cell.h" // PyCell_GetRef()
|
#include "pycore_cell.h" // PyCell_GetRef()
|
||||||
|
|
||||||
@ -465,7 +464,7 @@ builtin_callable(PyObject *module, PyObject *obj)
|
|||||||
static PyObject *
|
static PyObject *
|
||||||
builtin_breakpoint(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
|
builtin_breakpoint(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *keywords)
|
||||||
{
|
{
|
||||||
PyObject *hook = _PySys_GetRequiredAttrString("breakpointhook");
|
PyObject *hook = PySys_GetAttrString("breakpointhook");
|
||||||
if (hook == NULL) {
|
if (hook == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -2164,7 +2163,7 @@ builtin_print_impl(PyObject *module, PyObject * const *args,
|
|||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
if (file == Py_None) {
|
if (file == Py_None) {
|
||||||
file = _PySys_GetRequiredAttr(&_Py_ID(stdout));
|
file = PySys_GetAttr(&_Py_ID(stdout));
|
||||||
if (file == NULL) {
|
if (file == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -2270,7 +2269,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
|
|||||||
int tty;
|
int tty;
|
||||||
|
|
||||||
/* Check that stdin/out/err are intact */
|
/* Check that stdin/out/err are intact */
|
||||||
fin = _PySys_GetRequiredAttr(&_Py_ID(stdin));
|
fin = PySys_GetAttr(&_Py_ID(stdin));
|
||||||
if (fin == NULL) {
|
if (fin == NULL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -2278,7 +2277,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
|
|||||||
PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
|
PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
fout = _PySys_GetRequiredAttr(&_Py_ID(stdout));
|
fout = PySys_GetAttr(&_Py_ID(stdout));
|
||||||
if (fout == NULL) {
|
if (fout == NULL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -2286,7 +2285,7 @@ builtin_input_impl(PyObject *module, PyObject *prompt)
|
|||||||
PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
|
PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
ferr = _PySys_GetRequiredAttr(&_Py_ID(stderr));
|
ferr = PySys_GetAttr(&_Py_ID(stderr));
|
||||||
if (ferr == NULL) {
|
if (ferr == NULL) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -2979,7 +2979,7 @@ _PyEval_ImportFrom(PyThreadState *tstate, PyObject *v, PyObject *name)
|
|||||||
int is_possibly_shadowing_stdlib = 0;
|
int is_possibly_shadowing_stdlib = 0;
|
||||||
if (is_possibly_shadowing) {
|
if (is_possibly_shadowing) {
|
||||||
PyObject *stdlib_modules;
|
PyObject *stdlib_modules;
|
||||||
if (_PySys_GetOptionalAttrString("stdlib_module_names", &stdlib_modules) < 0) {
|
if (PySys_GetOptionalAttrString("stdlib_module_names", &stdlib_modules) < 0) {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (stdlib_modules && PyAnySet_Check(stdlib_modules)) {
|
if (stdlib_modules && PyAnySet_Check(stdlib_modules)) {
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||||
#include "pycore_runtime.h" // _Py_ID()
|
#include "pycore_runtime.h" // _Py_ID()
|
||||||
#include "pycore_structseq.h" // _PyStructSequence_FiniBuiltin()
|
#include "pycore_structseq.h" // _PyStructSequence_FiniBuiltin()
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetOptionalAttr()
|
|
||||||
#include "pycore_traceback.h" // _PyTraceBack_FromFrame()
|
#include "pycore_traceback.h" // _PyTraceBack_FromFrame()
|
||||||
#include "pycore_unicodeobject.h" // _PyUnicode_Equal()
|
#include "pycore_unicodeobject.h" // _PyUnicode_Equal()
|
||||||
|
|
||||||
@ -1570,7 +1569,7 @@ write_unraisable_exc(PyThreadState *tstate, PyObject *exc_type,
|
|||||||
PyObject *obj)
|
PyObject *obj)
|
||||||
{
|
{
|
||||||
PyObject *file;
|
PyObject *file;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(stderr), &file) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(stderr), &file) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (file == NULL || file == Py_None) {
|
if (file == NULL || file == Py_None) {
|
||||||
@ -1677,7 +1676,7 @@ format_unraisable_v(const char *format, va_list va, PyObject *obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyObject *hook;
|
PyObject *hook;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(unraisablehook), &hook) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(unraisablehook), &hook) < 0) {
|
||||||
Py_DECREF(hook_args);
|
Py_DECREF(hook_args);
|
||||||
err_msg_str = NULL;
|
err_msg_str = NULL;
|
||||||
obj = NULL;
|
obj = NULL;
|
||||||
|
@ -3369,11 +3369,11 @@ PyObject *
|
|||||||
PyImport_GetImporter(PyObject *path)
|
PyImport_GetImporter(PyObject *path)
|
||||||
{
|
{
|
||||||
PyThreadState *tstate = _PyThreadState_GET();
|
PyThreadState *tstate = _PyThreadState_GET();
|
||||||
PyObject *path_importer_cache = _PySys_GetRequiredAttrString("path_importer_cache");
|
PyObject *path_importer_cache = PySys_GetAttrString("path_importer_cache");
|
||||||
if (path_importer_cache == NULL) {
|
if (path_importer_cache == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
PyObject *path_hooks = _PySys_GetRequiredAttrString("path_hooks");
|
PyObject *path_hooks = PySys_GetAttrString("path_hooks");
|
||||||
if (path_hooks == NULL) {
|
if (path_hooks == NULL) {
|
||||||
Py_DECREF(path_importer_cache);
|
Py_DECREF(path_importer_cache);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -3682,14 +3682,14 @@ import_find_and_load(PyThreadState *tstate, PyObject *abs_name)
|
|||||||
PyTime_t t1 = 0, accumulated_copy = accumulated;
|
PyTime_t t1 = 0, accumulated_copy = accumulated;
|
||||||
|
|
||||||
PyObject *sys_path, *sys_meta_path, *sys_path_hooks;
|
PyObject *sys_path, *sys_meta_path, *sys_path_hooks;
|
||||||
if (_PySys_GetOptionalAttrString("path", &sys_path) < 0) {
|
if (PySys_GetOptionalAttrString("path", &sys_path) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (_PySys_GetOptionalAttrString("meta_path", &sys_meta_path) < 0) {
|
if (PySys_GetOptionalAttrString("meta_path", &sys_meta_path) < 0) {
|
||||||
Py_XDECREF(sys_path);
|
Py_XDECREF(sys_path);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (_PySys_GetOptionalAttrString("path_hooks", &sys_path_hooks) < 0) {
|
if (PySys_GetOptionalAttrString("path_hooks", &sys_path_hooks) < 0) {
|
||||||
Py_XDECREF(sys_meta_path);
|
Py_XDECREF(sys_meta_path);
|
||||||
Py_XDECREF(sys_path);
|
Py_XDECREF(sys_path);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -4127,7 +4127,7 @@ _PyImport_FiniCore(PyInterpreterState *interp)
|
|||||||
static int
|
static int
|
||||||
init_zipimport(PyThreadState *tstate, int verbose)
|
init_zipimport(PyThreadState *tstate, int verbose)
|
||||||
{
|
{
|
||||||
PyObject *path_hooks = _PySys_GetRequiredAttrString("path_hooks");
|
PyObject *path_hooks = PySys_GetAttrString("path_hooks");
|
||||||
if (path_hooks == NULL) {
|
if (path_hooks == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -3647,7 +3647,7 @@ _Py_DumpPathConfig(PyThreadState *tstate)
|
|||||||
#define DUMP_SYS(NAME) \
|
#define DUMP_SYS(NAME) \
|
||||||
do { \
|
do { \
|
||||||
PySys_FormatStderr(" sys.%s = ", #NAME); \
|
PySys_FormatStderr(" sys.%s = ", #NAME); \
|
||||||
if (_PySys_GetOptionalAttrString(#NAME, &obj) < 0) { \
|
if (PySys_GetOptionalAttrString(#NAME, &obj) < 0) { \
|
||||||
PyErr_Clear(); \
|
PyErr_Clear(); \
|
||||||
} \
|
} \
|
||||||
if (obj != NULL) { \
|
if (obj != NULL) { \
|
||||||
@ -3671,7 +3671,7 @@ _Py_DumpPathConfig(PyThreadState *tstate)
|
|||||||
#undef DUMP_SYS
|
#undef DUMP_SYS
|
||||||
|
|
||||||
PyObject *sys_path;
|
PyObject *sys_path;
|
||||||
(void) _PySys_GetOptionalAttrString("path", &sys_path);
|
(void) PySys_GetOptionalAttrString("path", &sys_path);
|
||||||
if (sys_path != NULL && PyList_Check(sys_path)) {
|
if (sys_path != NULL && PyList_Check(sys_path)) {
|
||||||
PySys_WriteStderr(" sys.path = [\n");
|
PySys_WriteStderr(" sys.path = [\n");
|
||||||
Py_ssize_t len = PyList_GET_SIZE(sys_path);
|
Py_ssize_t len = PyList_GET_SIZE(sys_path);
|
||||||
@ -4294,7 +4294,7 @@ _PyConfig_CreateXOptionsDict(const PyConfig *config)
|
|||||||
static int
|
static int
|
||||||
config_get_sys_write_bytecode(const PyConfig *config, int *value)
|
config_get_sys_write_bytecode(const PyConfig *config, int *value)
|
||||||
{
|
{
|
||||||
PyObject *attr = _PySys_GetRequiredAttrString("dont_write_bytecode");
|
PyObject *attr = PySys_GetAttrString("dont_write_bytecode");
|
||||||
if (attr == NULL) {
|
if (attr == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -4315,7 +4315,7 @@ config_get(const PyConfig *config, const PyConfigSpec *spec,
|
|||||||
{
|
{
|
||||||
if (use_sys) {
|
if (use_sys) {
|
||||||
if (spec->sys.attr != NULL) {
|
if (spec->sys.attr != NULL) {
|
||||||
return _PySys_GetRequiredAttrString(spec->sys.attr);
|
return PySys_GetAttrString(spec->sys.attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(spec->name, "write_bytecode") == 0) {
|
if (strcmp(spec->name, "write_bytecode") == 0) {
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include "pycore_intrinsics.h" // INTRINSIC_PRINT
|
#include "pycore_intrinsics.h" // INTRINSIC_PRINT
|
||||||
#include "pycore_pyerrors.h" // _PyErr_SetString()
|
#include "pycore_pyerrors.h" // _PyErr_SetString()
|
||||||
#include "pycore_runtime.h" // _Py_ID()
|
#include "pycore_runtime.h" // _Py_ID()
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetRequiredAttr()
|
|
||||||
#include "pycore_tuple.h" // _PyTuple_FromArray()
|
#include "pycore_tuple.h" // _PyTuple_FromArray()
|
||||||
#include "pycore_typevarobject.h" // _Py_make_typevar()
|
#include "pycore_typevarobject.h" // _Py_make_typevar()
|
||||||
#include "pycore_unicodeobject.h" // _PyUnicode_FromASCII()
|
#include "pycore_unicodeobject.h" // _PyUnicode_FromASCII()
|
||||||
@ -27,7 +26,7 @@ no_intrinsic1(PyThreadState* tstate, PyObject *unused)
|
|||||||
static PyObject *
|
static PyObject *
|
||||||
print_expr(PyThreadState* Py_UNUSED(ignored), PyObject *value)
|
print_expr(PyThreadState* Py_UNUSED(ignored), PyObject *value)
|
||||||
{
|
{
|
||||||
PyObject *hook = _PySys_GetRequiredAttr(&_Py_ID(displayhook));
|
PyObject *hook = PySys_GetAttr(&_Py_ID(displayhook));
|
||||||
if (hook == NULL) {
|
if (hook == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1283,7 +1283,7 @@ init_interp_main(PyThreadState *tstate)
|
|||||||
if (is_main_interp) {
|
if (is_main_interp) {
|
||||||
/* Initialize warnings. */
|
/* Initialize warnings. */
|
||||||
PyObject *warnoptions;
|
PyObject *warnoptions;
|
||||||
if (_PySys_GetOptionalAttrString("warnoptions", &warnoptions) < 0) {
|
if (PySys_GetOptionalAttrString("warnoptions", &warnoptions) < 0) {
|
||||||
return _PyStatus_ERR("can't initialize warnings");
|
return _PyStatus_ERR("can't initialize warnings");
|
||||||
}
|
}
|
||||||
if (warnoptions != NULL && PyList_Check(warnoptions) &&
|
if (warnoptions != NULL && PyList_Check(warnoptions) &&
|
||||||
@ -1806,7 +1806,7 @@ flush_std_files(void)
|
|||||||
PyObject *file;
|
PyObject *file;
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(stdout), &file) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(stdout), &file) < 0) {
|
||||||
status = -1;
|
status = -1;
|
||||||
}
|
}
|
||||||
else if (file != NULL && file != Py_None && !file_is_closed(file)) {
|
else if (file != NULL && file != Py_None && !file_is_closed(file)) {
|
||||||
@ -1819,7 +1819,7 @@ flush_std_files(void)
|
|||||||
}
|
}
|
||||||
Py_XDECREF(file);
|
Py_XDECREF(file);
|
||||||
|
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(stderr), &file) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(stderr), &file) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
status = -1;
|
status = -1;
|
||||||
}
|
}
|
||||||
@ -3046,7 +3046,7 @@ _Py_FatalError_PrintExc(PyThreadState *tstate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyObject *ferr;
|
PyObject *ferr;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(stderr), &ferr) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(stderr), &ferr) < 0) {
|
||||||
_PyErr_Clear(tstate);
|
_PyErr_Clear(tstate);
|
||||||
}
|
}
|
||||||
if (ferr == NULL || ferr == Py_None) {
|
if (ferr == NULL || ferr == Py_None) {
|
||||||
|
@ -114,7 +114,7 @@ _PyRun_InteractiveLoopObject(FILE *fp, PyObject *filename, PyCompilerFlags *flag
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyObject *v;
|
PyObject *v;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(ps1), &v) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(ps1), &v) < 0) {
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -128,7 +128,7 @@ _PyRun_InteractiveLoopObject(FILE *fp, PyObject *filename, PyCompilerFlags *flag
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Py_XDECREF(v);
|
Py_XDECREF(v);
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(ps2), &v) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(ps2), &v) < 0) {
|
||||||
PyErr_Print();
|
PyErr_Print();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -206,7 +206,7 @@ pyrun_one_parse_ast(FILE *fp, PyObject *filename,
|
|||||||
PyObject *encoding_obj = NULL;
|
PyObject *encoding_obj = NULL;
|
||||||
const char *encoding = NULL;
|
const char *encoding = NULL;
|
||||||
if (fp == stdin) {
|
if (fp == stdin) {
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(stdin), &attr) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(stdin), &attr) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
else if (attr != NULL && attr != Py_None) {
|
else if (attr != NULL && attr != Py_None) {
|
||||||
@ -226,7 +226,7 @@ pyrun_one_parse_ast(FILE *fp, PyObject *filename,
|
|||||||
// Get sys.ps1 (as UTF-8)
|
// Get sys.ps1 (as UTF-8)
|
||||||
PyObject *ps1_obj = NULL;
|
PyObject *ps1_obj = NULL;
|
||||||
const char *ps1 = "";
|
const char *ps1 = "";
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(ps1), &attr) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(ps1), &attr) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
else if (attr != NULL) {
|
else if (attr != NULL) {
|
||||||
@ -247,7 +247,7 @@ pyrun_one_parse_ast(FILE *fp, PyObject *filename,
|
|||||||
// Get sys.ps2 (as UTF-8)
|
// Get sys.ps2 (as UTF-8)
|
||||||
PyObject *ps2_obj = NULL;
|
PyObject *ps2_obj = NULL;
|
||||||
const char *ps2 = "";
|
const char *ps2 = "";
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(ps2), &attr) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(ps2), &attr) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
else if (attr != NULL) {
|
else if (attr != NULL) {
|
||||||
@ -658,7 +658,7 @@ _Py_HandleSystemExitAndKeyboardInterrupt(int *exitcode_p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyObject *sys_stderr;
|
PyObject *sys_stderr;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(stderr), &sys_stderr) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(stderr), &sys_stderr) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
else if (sys_stderr != NULL && sys_stderr != Py_None) {
|
else if (sys_stderr != NULL && sys_stderr != Py_None) {
|
||||||
@ -722,7 +722,7 @@ _PyErr_PrintEx(PyThreadState *tstate, int set_sys_last_vars)
|
|||||||
_PyErr_Clear(tstate);
|
_PyErr_Clear(tstate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(excepthook), &hook) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(excepthook), &hook) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
if (_PySys_Audit(tstate, "sys.excepthook", "OOOO", hook ? hook : Py_None,
|
if (_PySys_Audit(tstate, "sys.excepthook", "OOOO", hook ? hook : Py_None,
|
||||||
@ -1197,7 +1197,7 @@ void
|
|||||||
PyErr_Display(PyObject *unused, PyObject *value, PyObject *tb)
|
PyErr_Display(PyObject *unused, PyObject *value, PyObject *tb)
|
||||||
{
|
{
|
||||||
PyObject *file;
|
PyObject *file;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(stderr), &file) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(stderr), &file) < 0) {
|
||||||
PyObject *exc = PyErr_GetRaisedException();
|
PyObject *exc = PyErr_GetRaisedException();
|
||||||
_PyObject_Dump(value);
|
_PyObject_Dump(value);
|
||||||
fprintf(stderr, "lost sys.stderr\n");
|
fprintf(stderr, "lost sys.stderr\n");
|
||||||
@ -1321,7 +1321,7 @@ static void
|
|||||||
flush_io_stream(PyThreadState *tstate, PyObject *name)
|
flush_io_stream(PyThreadState *tstate, PyObject *name)
|
||||||
{
|
{
|
||||||
PyObject *f;
|
PyObject *f;
|
||||||
if (_PySys_GetOptionalAttr(name, &f) < 0) {
|
if (PySys_GetOptionalAttr(name, &f) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
if (f != NULL) {
|
if (f != NULL) {
|
||||||
|
@ -76,12 +76,12 @@ module sys
|
|||||||
|
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
_PySys_GetRequiredAttr(PyObject *name)
|
PySys_GetAttr(PyObject *name)
|
||||||
{
|
{
|
||||||
if (!PyUnicode_Check(name)) {
|
if (!PyUnicode_Check(name)) {
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"attribute name must be string, not '%.200s'",
|
"attribute name must be string, not '%T'",
|
||||||
Py_TYPE(name)->tp_name);
|
name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
PyThreadState *tstate = _PyThreadState_GET();
|
PyThreadState *tstate = _PyThreadState_GET();
|
||||||
@ -98,7 +98,7 @@ _PySys_GetRequiredAttr(PyObject *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyObject *
|
PyObject *
|
||||||
_PySys_GetRequiredAttrString(const char *name)
|
PySys_GetAttrString(const char *name)
|
||||||
{
|
{
|
||||||
PyThreadState *tstate = _PyThreadState_GET();
|
PyThreadState *tstate = _PyThreadState_GET();
|
||||||
PyObject *sysdict = tstate->interp->sysdict;
|
PyObject *sysdict = tstate->interp->sysdict;
|
||||||
@ -114,12 +114,12 @@ _PySys_GetRequiredAttrString(const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
_PySys_GetOptionalAttr(PyObject *name, PyObject **value)
|
PySys_GetOptionalAttr(PyObject *name, PyObject **value)
|
||||||
{
|
{
|
||||||
if (!PyUnicode_Check(name)) {
|
if (!PyUnicode_Check(name)) {
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"attribute name must be string, not '%.200s'",
|
"attribute name must be string, not '%T'",
|
||||||
Py_TYPE(name)->tp_name);
|
name);
|
||||||
*value = NULL;
|
*value = NULL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -133,7 +133,7 @@ _PySys_GetOptionalAttr(PyObject *name, PyObject **value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
_PySys_GetOptionalAttrString(const char *name, PyObject **value)
|
PySys_GetOptionalAttrString(const char *name, PyObject **value)
|
||||||
{
|
{
|
||||||
PyThreadState *tstate = _PyThreadState_GET();
|
PyThreadState *tstate = _PyThreadState_GET();
|
||||||
PyObject *sysdict = tstate->interp->sysdict;
|
PyObject *sysdict = tstate->interp->sysdict;
|
||||||
@ -773,7 +773,7 @@ sys_displayhook(PyObject *module, PyObject *o)
|
|||||||
}
|
}
|
||||||
if (PyObject_SetAttr(builtins, _Py_LATIN1_CHR('_'), Py_None) != 0)
|
if (PyObject_SetAttr(builtins, _Py_LATIN1_CHR('_'), Py_None) != 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
outf = _PySys_GetRequiredAttr(&_Py_ID(stdout));
|
outf = PySys_GetAttr(&_Py_ID(stdout));
|
||||||
if (outf == NULL) {
|
if (outf == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -3005,7 +3005,7 @@ static PyObject *
|
|||||||
get_warnoptions(PyThreadState *tstate)
|
get_warnoptions(PyThreadState *tstate)
|
||||||
{
|
{
|
||||||
PyObject *warnoptions;
|
PyObject *warnoptions;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(warnoptions), &warnoptions) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(warnoptions), &warnoptions) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (warnoptions == NULL || !PyList_Check(warnoptions)) {
|
if (warnoptions == NULL || !PyList_Check(warnoptions)) {
|
||||||
@ -3042,7 +3042,7 @@ PySys_ResetWarnOptions(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyObject *warnoptions;
|
PyObject *warnoptions;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(warnoptions), &warnoptions) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(warnoptions), &warnoptions) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3106,7 +3106,7 @@ PyAPI_FUNC(int)
|
|||||||
PySys_HasWarnOptions(void)
|
PySys_HasWarnOptions(void)
|
||||||
{
|
{
|
||||||
PyObject *warnoptions;
|
PyObject *warnoptions;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(warnoptions), &warnoptions) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(warnoptions), &warnoptions) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -3120,7 +3120,7 @@ static PyObject *
|
|||||||
get_xoptions(PyThreadState *tstate)
|
get_xoptions(PyThreadState *tstate)
|
||||||
{
|
{
|
||||||
PyObject *xoptions;
|
PyObject *xoptions;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(_xoptions), &xoptions) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(_xoptions), &xoptions) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (xoptions == NULL || !PyDict_Check(xoptions)) {
|
if (xoptions == NULL || !PyDict_Check(xoptions)) {
|
||||||
@ -3373,7 +3373,7 @@ sys_set_flag(PyObject *flags, Py_ssize_t pos, PyObject *value)
|
|||||||
int
|
int
|
||||||
_PySys_SetFlagObj(Py_ssize_t pos, PyObject *value)
|
_PySys_SetFlagObj(Py_ssize_t pos, PyObject *value)
|
||||||
{
|
{
|
||||||
PyObject *flags = _PySys_GetRequiredAttrString("flags");
|
PyObject *flags = PySys_GetAttrString("flags");
|
||||||
if (flags == NULL) {
|
if (flags == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3935,7 +3935,7 @@ _PySys_UpdateConfig(PyThreadState *tstate)
|
|||||||
#undef COPY_WSTR
|
#undef COPY_WSTR
|
||||||
|
|
||||||
// sys.flags
|
// sys.flags
|
||||||
PyObject *flags = _PySys_GetRequiredAttrString("flags");
|
PyObject *flags = PySys_GetAttrString("flags");
|
||||||
if (flags == NULL) {
|
if (flags == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -4251,7 +4251,7 @@ PySys_SetArgvEx(int argc, wchar_t **argv, int updatepath)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PyObject *sys_path;
|
PyObject *sys_path;
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(path), &sys_path) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(path), &sys_path) < 0) {
|
||||||
Py_FatalError("can't get sys.path");
|
Py_FatalError("can't get sys.path");
|
||||||
}
|
}
|
||||||
else if (sys_path != NULL) {
|
else if (sys_path != NULL) {
|
||||||
@ -4347,7 +4347,7 @@ sys_write(PyObject *key, FILE *fp, const char *format, va_list va)
|
|||||||
|
|
||||||
PyObject *exc = _PyErr_GetRaisedException(tstate);
|
PyObject *exc = _PyErr_GetRaisedException(tstate);
|
||||||
written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
|
written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
|
||||||
file = _PySys_GetRequiredAttr(key);
|
file = PySys_GetAttr(key);
|
||||||
if (sys_pyfile_write(buffer, file) != 0) {
|
if (sys_pyfile_write(buffer, file) != 0) {
|
||||||
_PyErr_Clear(tstate);
|
_PyErr_Clear(tstate);
|
||||||
fputs(buffer, fp);
|
fputs(buffer, fp);
|
||||||
@ -4391,7 +4391,7 @@ sys_format(PyObject *key, FILE *fp, const char *format, va_list va)
|
|||||||
PyObject *exc = _PyErr_GetRaisedException(tstate);
|
PyObject *exc = _PyErr_GetRaisedException(tstate);
|
||||||
message = PyUnicode_FromFormatV(format, va);
|
message = PyUnicode_FromFormatV(format, va);
|
||||||
if (message != NULL) {
|
if (message != NULL) {
|
||||||
file = _PySys_GetRequiredAttr(key);
|
file = PySys_GetAttr(key);
|
||||||
if (sys_pyfile_write_unicode(message, file) != 0) {
|
if (sys_pyfile_write_unicode(message, file) != 0) {
|
||||||
_PyErr_Clear(tstate);
|
_PyErr_Clear(tstate);
|
||||||
utf8 = PyUnicode_AsUTF8(message);
|
utf8 = PyUnicode_AsUTF8(message);
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include "pycore_interpframe.h" // _PyFrame_GetCode()
|
#include "pycore_interpframe.h" // _PyFrame_GetCode()
|
||||||
#include "pycore_pyerrors.h" // _PyErr_GetRaisedException()
|
#include "pycore_pyerrors.h" // _PyErr_GetRaisedException()
|
||||||
#include "pycore_pystate.h" // _PyThreadState_GET()
|
#include "pycore_pystate.h" // _PyThreadState_GET()
|
||||||
#include "pycore_sysmodule.h" // _PySys_GetOptionalAttr()
|
|
||||||
#include "pycore_traceback.h" // EXCEPTION_TB_HEADER
|
#include "pycore_traceback.h" // EXCEPTION_TB_HEADER
|
||||||
|
|
||||||
#include "frameobject.h" // PyFrame_New()
|
#include "frameobject.h" // PyFrame_New()
|
||||||
@ -399,7 +398,7 @@ _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *
|
|||||||
taillen = strlen(tail);
|
taillen = strlen(tail);
|
||||||
|
|
||||||
PyThreadState *tstate = _PyThreadState_GET();
|
PyThreadState *tstate = _PyThreadState_GET();
|
||||||
if (_PySys_GetOptionalAttr(&_Py_ID(path), &syspath) < 0) {
|
if (PySys_GetOptionalAttr(&_Py_ID(path), &syspath) < 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -777,7 +776,7 @@ _PyTraceBack_Print(PyObject *v, const char *header, PyObject *f)
|
|||||||
PyErr_BadInternalCall();
|
PyErr_BadInternalCall();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (_PySys_GetOptionalAttrString("tracebacklimit", &limitv) < 0) {
|
if (PySys_GetOptionalAttrString("tracebacklimit", &limitv) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if (limitv != NULL && PyLong_Check(limitv)) {
|
else if (limitv != NULL && PyLong_Check(limitv)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user