diff -r 2de806c8b070 Include/dictobject.h --- a/Include/dictobject.h Wed Nov 06 22:17:39 2013 +1000 +++ b/Include/dictobject.h Wed Nov 06 18:07:07 2013 +0100 @@ -109,10 +109,11 @@ PyAPI_FUNC(PyObject *) _PyDict_GetItemId PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item); PyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, struct _Py_Identifier *key, PyObject *item); PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key); +PyAPI_FUNC(int) _PyDict_DelItemId(PyObject *mp, struct _Py_Identifier *key); #ifndef Py_LIMITED_API -int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *value); -PyObject *_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); +PyAPI_FUNC(int) _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *value); +PyAPI_FUNC(PyObject*) _PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out); #endif diff -r 2de806c8b070 Include/object.h --- a/Include/object.h Wed Nov 06 22:17:39 2013 +1000 +++ b/Include/object.h Wed Nov 06 18:07:07 2013 +0100 @@ -143,9 +143,17 @@ typedef struct _Py_Identifier { PyObject *object; } _Py_Identifier; -#define _Py_static_string(varname, value) static _Py_Identifier varname = { 0, value, 0 } +#define _Py_static_string_init(value) { 0, value, 0 } +#define _Py_static_string(varname, value) static _Py_Identifier varname = _Py_static_string_init(value) #define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname) +/* Shared identifiers */ +PyAPI_DATA(_Py_Identifier) _PyId_path; +PyAPI_DATA(_Py_Identifier) _PyId_argv; +PyAPI_DATA(_Py_Identifier) _PyId_stdin; +PyAPI_DATA(_Py_Identifier) _PyId_stdout; +PyAPI_DATA(_Py_Identifier) _PyId_stderr; + /* Type objects contain a string containing the type name (to help somewhat in debugging), the allocation parameters (see PyObject_New() and @@ -829,7 +837,7 @@ PyAPI_FUNC(void) _Py_Dealloc(PyObject *) PyObject *_py_xincref_tmp = (PyObject *)(op); \ if (_py_xincref_tmp != NULL) \ Py_INCREF(_py_xincref_tmp); \ - } while (0) + } while (0) #define Py_XDECREF(op) \ do { \ diff -r 2de806c8b070 Include/sysmodule.h --- a/Include/sysmodule.h Wed Nov 06 22:17:39 2013 +1000 +++ b/Include/sysmodule.h Wed Nov 06 18:07:07 2013 +0100 @@ -8,7 +8,10 @@ extern "C" { #endif PyAPI_FUNC(PyObject *) PySys_GetObject(const char *); +PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key); PyAPI_FUNC(int) PySys_SetObject(const char *, PyObject *); +PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *); + PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **); PyAPI_FUNC(void) PySys_SetArgvEx(int, wchar_t **, int); PyAPI_FUNC(void) PySys_SetPath(const wchar_t *); diff -r 2de806c8b070 Modules/_ctypes/callbacks.c --- a/Modules/_ctypes/callbacks.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Modules/_ctypes/callbacks.c Wed Nov 06 18:07:07 2013 +0100 @@ -80,7 +80,7 @@ static void PrintError(char *msg, ...) { char buf[512]; - PyObject *f = PySys_GetObject("stderr"); + PyObject *f = _PySys_GetObjectId(&_PyId_stderr); va_list marker; va_start(marker, msg); diff -r 2de806c8b070 Modules/_cursesmodule.c --- a/Modules/_cursesmodule.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Modules/_cursesmodule.c Wed Nov 06 18:07:07 2013 +0100 @@ -2578,7 +2578,7 @@ PyCurses_setupterm(PyObject* self, PyObj if (fd == -1) { PyObject* sys_stdout; - sys_stdout = PySys_GetObject("stdout"); + sys_stdout = _PySys_GetObjectId(&_PyId_stdout); if (sys_stdout == NULL || sys_stdout == Py_None) { PyErr_SetString( diff -r 2de806c8b070 Modules/_pickle.c --- a/Modules/_pickle.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Modules/_pickle.c Wed Nov 06 18:07:07 2013 +0100 @@ -136,6 +136,8 @@ static PyObject *empty_tuple = NULL; /* For looking up name pairs in copyreg._extension_registry. */ static PyObject *two_tuple = NULL; +_Py_IDENTIFIER(modules); + static int stack_underflow(void) { @@ -1363,7 +1365,7 @@ whichmodule(PyObject *global, PyObject * return NULL; search: - modules_dict = PySys_GetObject("modules"); + modules_dict = _PySys_GetObjectId(&PyId_modules); if (modules_dict == NULL) { PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules"); return NULL; @@ -5548,7 +5550,7 @@ Unpickler_find_class(UnpicklerObject *se } } - modules_dict = PySys_GetObject("modules"); + modules_dict = _PySys_GetObjectId(&PyId_modules); if (modules_dict == NULL) { PyErr_SetString(PyExc_RuntimeError, "unable to get sys.modules"); return NULL; diff -r 2de806c8b070 Modules/_threadmodule.c --- a/Modules/_threadmodule.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Modules/_threadmodule.c Wed Nov 06 18:07:07 2013 +0100 @@ -1005,7 +1005,7 @@ t_bootstrap(void *boot_raw) PySys_WriteStderr( "Unhandled exception in thread started by "); PyErr_Fetch(&exc, &value, &tb); - file = PySys_GetObject("stderr"); + file = _PySys_GetObjectId(&_PyId_stderr); if (file != NULL && file != Py_None) PyFile_WriteObject(boot->func, file, 0); else diff -r 2de806c8b070 Modules/faulthandler.c --- a/Modules/faulthandler.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Modules/faulthandler.c Wed Nov 06 18:07:07 2013 +0100 @@ -136,7 +136,7 @@ faulthandler_get_fileno(PyObject *file, int fd; if (file == NULL || file == Py_None) { - file = PySys_GetObject("stderr"); + file = _PySys_GetObjectId(&_PyId_stderr); if (file == NULL) { PyErr_SetString(PyExc_RuntimeError, "unable to get sys.stderr"); return NULL; diff -r 2de806c8b070 Modules/main.c --- a/Modules/main.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Modules/main.c Wed Nov 06 18:07:07 2013 +0100 @@ -261,7 +261,7 @@ RunMainFromImporter(wchar_t *filename) /* argv0 is usable as an import source, so put it in sys.path[0] and import __main__ */ - sys_path = PySys_GetObject("path"); + sys_path = _PySys_GetObjectId(&_PyId_path); if (sys_path == NULL) { PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path"); goto error; diff -r 2de806c8b070 Modules/syslogmodule.c --- a/Modules/syslogmodule.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Modules/syslogmodule.c Wed Nov 06 18:07:07 2013 +0100 @@ -71,7 +71,7 @@ syslog_get_argv(void) Py_ssize_t argv_len, scriptlen; PyObject *scriptobj; Py_ssize_t slash; - PyObject *argv = PySys_GetObject("argv"); + PyObject *argv = _PySys_GetObjectId(&_PyId_argv); if (argv == NULL) { return(NULL); diff -r 2de806c8b070 Objects/dictobject.c --- a/Objects/dictobject.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Objects/dictobject.c Wed Nov 06 18:07:07 2013 +0100 @@ -2736,6 +2736,15 @@ PyDict_SetItemString(PyObject *v, const } int +_PyDict_DelItemId(PyObject *v, _Py_Identifier *key) +{ + PyObject *kv = _PyUnicode_FromId(key); /* borrowed */ + if (kv == NULL) + return -1; + return PyDict_DelItem(v, kv); +} + +int PyDict_DelItemString(PyObject *v, const char *key) { PyObject *kv; diff -r 2de806c8b070 Python/_warnings.c --- a/Python/_warnings.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Python/_warnings.c Wed Nov 06 18:07:07 2013 +0100 @@ -265,7 +265,7 @@ show_warning(PyObject *filename, int lin if (name == NULL) /* XXX Can an object lack a '__name__' attribute? */ goto error; - f_stderr = PySys_GetObject("stderr"); + f_stderr = _PySys_GetObjectId(&_PyId_stderr); if (f_stderr == NULL) { fprintf(stderr, "lost sys.stderr\n"); goto error; @@ -562,7 +562,7 @@ setup_context(Py_ssize_t stack_level, Py else { *filename = NULL; if (*module != Py_None && PyUnicode_CompareWithASCIIString(*module, "__main__") == 0) { - PyObject *argv = PySys_GetObject("argv"); + PyObject *argv = _PySys_GetObjectId(&_PyId_argv); /* PyList_Check() is needed because sys.argv is set to None during Python finalization */ if (argv != NULL && PyList_Check(argv) && PyList_Size(argv) > 0) { diff -r 2de806c8b070 Python/bltinmodule.c --- a/Python/bltinmodule.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Python/bltinmodule.c Wed Nov 06 18:07:07 2013 +0100 @@ -1552,7 +1552,7 @@ builtin_print(PyObject *self, PyObject * kwlist, &sep, &end, &file, &flush)) return NULL; if (file == NULL || file == Py_None) { - file = PySys_GetObject("stdout"); + file = _PySys_GetObjectId(&_PyId_stdout); if (file == NULL) { PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); return NULL; @@ -1637,9 +1637,9 @@ static PyObject * builtin_input(PyObject *self, PyObject *args) { PyObject *promptarg = NULL; - PyObject *fin = PySys_GetObject("stdin"); - PyObject *fout = PySys_GetObject("stdout"); - PyObject *ferr = PySys_GetObject("stderr"); + PyObject *fin = _PySys_GetObjectId(&_PyId_stdin); + PyObject *fout = _PySys_GetObjectId(&_PyId_stdout); + PyObject *ferr = _PySys_GetObjectId(&_PyId_stderr); PyObject *tmp; long fd; int tty; diff -r 2de806c8b070 Python/ceval.c --- a/Python/ceval.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Python/ceval.c Wed Nov 06 18:07:07 2013 +0100 @@ -1840,8 +1840,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int } TARGET(PRINT_EXPR) { + _Py_IDENTIFIER(displayhook); PyObject *value = POP(); - PyObject *hook = PySys_GetObject("displayhook"); + PyObject *hook = _PySys_GetObjectId(&PyId_displayhook); PyObject *res; if (hook == NULL) { PyErr_SetString(PyExc_RuntimeError, diff -r 2de806c8b070 Python/errors.c --- a/Python/errors.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Python/errors.c Wed Nov 06 18:07:07 2013 +0100 @@ -844,7 +844,7 @@ PyErr_WriteUnraisable(PyObject *obj) PyErr_Fetch(&t, &v, &tb); - f = PySys_GetObject("stderr"); + f = _PySys_GetObjectId(&_PyId_stderr); if (f == NULL || f == Py_None) goto done; diff -r 2de806c8b070 Python/pythonrun.c --- a/Python/pythonrun.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Python/pythonrun.c Wed Nov 06 18:07:07 2013 +0100 @@ -35,6 +35,21 @@ #define PATH_MAX MAXPATHLEN #endif +/* global identifiers */ +_Py_Identifier _PyId_argv = _Py_static_string_init("argv"); +_Py_Identifier _PyId_path = _Py_static_string_init("path"); +_Py_Identifier _PyId_stdin = _Py_static_string_init("stdin"); +_Py_Identifier _PyId_stdout = _Py_static_string_init("stdout"); +_Py_Identifier _PyId_stderr = _Py_static_string_init("stderr"); + +/* local identifiers */ +_Py_IDENTIFIER(excepthook); +_Py_IDENTIFIER(ps1); +_Py_IDENTIFIER(ps2); +_Py_IDENTIFIER(last_type); +_Py_IDENTIFIER(last_value); +_Py_IDENTIFIER(last_traceback); + #ifdef Py_REF_DEBUG static void _print_total_refs(void) { @@ -414,7 +429,7 @@ void pstderr = PyFile_NewStdPrinter(fileno(stderr)); if (pstderr == NULL) Py_FatalError("Py_Initialize: can't set preliminary stderr"); - PySys_SetObject("stderr", pstderr); + _PySys_SetObjectId(&_PyId_stderr, pstderr); PySys_SetObject("__stderr__", pstderr); Py_DECREF(pstderr); @@ -499,8 +514,8 @@ file_is_closed(PyObject *fobj) static void flush_std_files(void) { - PyObject *fout = PySys_GetObject("stdout"); - PyObject *ferr = PySys_GetObject("stderr"); + PyObject *fout = _PySys_GetObjectId(&_PyId_stdout); + PyObject *ferr = _PySys_GetObjectId(&_PyId_stderr); PyObject *tmp; _Py_IDENTIFIER(flush); @@ -778,7 +793,7 @@ Py_NewInterpreter(void) pstderr = PyFile_NewStdPrinter(fileno(stderr)); if (pstderr == NULL) Py_FatalError("Py_Initialize: can't set preliminary stderr"); - PySys_SetObject("stderr", pstderr); + _PySys_SetObjectId(&_PyId_stderr, pstderr); PySys_SetObject("__stderr__", pstderr); Py_DECREF(pstderr); @@ -1172,7 +1187,7 @@ initstdio(void) goto error; } /* if (fd < 0) */ PySys_SetObject("__stdin__", std); - PySys_SetObject("stdin", std); + _PySys_SetObjectId(&_PyId_stdin, std); Py_DECREF(std); /* Set sys.stdout */ @@ -1187,7 +1202,7 @@ initstdio(void) goto error; } /* if (fd < 0) */ PySys_SetObject("__stdout__", std); - PySys_SetObject("stdout", std); + _PySys_SetObjectId(&_PyId_stdout, std); Py_DECREF(std); #if 1 /* Disable this if you have trouble debugging bootstrap stuff */ @@ -1221,7 +1236,7 @@ initstdio(void) Py_DECREF(std); goto error; } - if (PySys_SetObject("stderr", std) < 0) { + if (_PySys_SetObjectId(&_PyId_stderr, std) < 0) { Py_DECREF(std); goto error; } @@ -1277,14 +1292,14 @@ PyRun_InteractiveLoopFlags(FILE *fp, con flags = &local_flags; local_flags.cf_flags = 0; } - v = PySys_GetObject("ps1"); + v = _PySys_GetObjectId(&PyId_ps1); if (v == NULL) { - PySys_SetObject("ps1", v = PyUnicode_FromString(">>> ")); + _PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromString(">>> ")); Py_XDECREF(v); } - v = PySys_GetObject("ps2"); + v = _PySys_GetObjectId(&PyId_ps2); if (v == NULL) { - PySys_SetObject("ps2", v = PyUnicode_FromString("... ")); + _PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromString("... ")); Py_XDECREF(v); } for (;;) { @@ -1335,7 +1350,7 @@ PyRun_InteractiveOneFlags(FILE *fp, cons if (fp == stdin) { /* Fetch encoding from sys.stdin if possible. */ - v = PySys_GetObject("stdin"); + v = _PySys_GetObjectId(&_PyId_stdin); if (v && v != Py_None) { oenc = _PyObject_GetAttrId(v, &PyId_encoding); if (oenc) @@ -1344,7 +1359,7 @@ PyRun_InteractiveOneFlags(FILE *fp, cons PyErr_Clear(); } } - v = PySys_GetObject("ps1"); + v = _PySys_GetObjectId(&PyId_ps1); if (v != NULL) { v = PyObject_Str(v); if (v == NULL) @@ -1357,7 +1372,7 @@ PyRun_InteractiveOneFlags(FILE *fp, cons } } } - w = PySys_GetObject("ps2"); + w = _PySys_GetObjectId(&PyId_ps2); if (w != NULL) { w = PyObject_Str(w); if (w == NULL) @@ -1719,7 +1734,7 @@ handle_system_exit(void) if (PyLong_Check(value)) exitcode = (int)PyLong_AsLong(value); else { - PyObject *sys_stderr = PySys_GetObject("stderr"); + PyObject *sys_stderr = _PySys_GetObjectId(&_PyId_stderr); if (sys_stderr != NULL && sys_stderr != Py_None) { PyFile_WriteObject(value, sys_stderr, Py_PRINT_RAW); } else { @@ -1762,11 +1777,11 @@ PyErr_PrintEx(int set_sys_last_vars) return; /* Now we know v != NULL too */ if (set_sys_last_vars) { - PySys_SetObject("last_type", exception); - PySys_SetObject("last_value", v); - PySys_SetObject("last_traceback", tb); + _PySys_SetObjectId(&PyId_last_type, exception); + _PySys_SetObjectId(&PyId_last_value, v); + _PySys_SetObjectId(&PyId_last_traceback, tb); } - hook = PySys_GetObject("excepthook"); + hook = _PySys_GetObjectId(&PyId_excepthook); if (hook) { PyObject *args = PyTuple_Pack(3, exception, v, tb); PyObject *result = PyEval_CallObject(hook, args); @@ -1976,7 +1991,7 @@ void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) { PyObject *seen; - PyObject *f = PySys_GetObject("stderr"); + PyObject *f = _PySys_GetObjectId(&_PyId_stderr); if (PyExceptionInstance_Check(value) && tb != NULL && PyTraceBack_Check(tb)) { /* Put the traceback on the exception, otherwise it won't get @@ -2056,7 +2071,7 @@ flush_io(void) /* Save the current exception */ PyErr_Fetch(&type, &value, &traceback); - f = PySys_GetObject("stderr"); + f = _PySys_GetObjectId(&_PyId_stderr); if (f != NULL) { r = _PyObject_CallMethodId(f, &PyId_flush, ""); if (r) @@ -2064,7 +2079,7 @@ flush_io(void) else PyErr_Clear(); } - f = PySys_GetObject("stdout"); + f = _PySys_GetObjectId(&_PyId_stdout); if (f != NULL) { r = _PyObject_CallMethodId(f, &PyId_flush, ""); if (r) diff -r 2de806c8b070 Python/sysmodule.c --- a/Python/sysmodule.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Python/sysmodule.c Wed Nov 06 18:07:07 2013 +0100 @@ -42,6 +42,16 @@ extern const char *PyWin_DLLVersionStrin #endif PyObject * +_PySys_GetObjectId(_Py_Identifier *key) +{ + PyThreadState *tstate = PyThreadState_GET(); + PyObject *sd = tstate->interp->sysdict; + if (sd == NULL) + return NULL; + return _PyDict_GetItemId(sd, key); +} + +PyObject * PySys_GetObject(const char *name) { PyThreadState *tstate = PyThreadState_GET(); @@ -52,6 +62,21 @@ PySys_GetObject(const char *name) } int +_PySys_SetObjectId(_Py_Identifier *key, PyObject *v) +{ + PyThreadState *tstate = PyThreadState_GET(); + PyObject *sd = tstate->interp->sysdict; + if (v == NULL) { + if (_PyDict_GetItemId(sd, key) == NULL) + return 0; + else + return _PyDict_DelItemId(sd, key); + } + else + return _PyDict_SetItemId(sd, key, v); +} + +int PySys_SetObject(const char *name, PyObject *v) { PyThreadState *tstate = PyThreadState_GET(); @@ -155,7 +180,7 @@ sys_displayhook(PyObject *self, PyObject } if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0) return NULL; - outf = PySys_GetObject("stdout"); + outf = _PySys_GetObjectId(&_PyId_stdout); if (outf == NULL || outf == Py_None) { PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); return NULL; @@ -1792,7 +1817,7 @@ PySys_SetPath(const wchar_t *path) PyObject *v; if ((v = makepathobject(path, DELIM)) == NULL) Py_FatalError("can't create sys.path"); - if (PySys_SetObject("path", v) != 0) + if (_PySys_SetObjectId(&_PyId_path, v) != 0) Py_FatalError("can't assign sys.path"); Py_DECREF(v); } @@ -1861,7 +1886,7 @@ sys_update_path(int argc, wchar_t **argv wchar_t fullpath[MAX_PATH]; #endif - path = PySys_GetObject("path"); + path = _PySys_GetObjectId(&_PyId_path); if (path == NULL) return; @@ -2048,7 +2073,7 @@ sys_pyfile_write(const char *text, PyObj */ static void -sys_write(char *name, FILE *fp, const char *format, va_list va) +sys_write(_Py_Identifier *key, FILE *fp, const char *format, va_list va) { PyObject *file; PyObject *error_type, *error_value, *error_traceback; @@ -2056,7 +2081,7 @@ sys_write(char *name, FILE *fp, const ch int written; PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = PySys_GetObject(name); + file = _PySys_GetObjectId(key); written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va); if (sys_pyfile_write(buffer, file) != 0) { PyErr_Clear(); @@ -2076,7 +2101,7 @@ PySys_WriteStdout(const char *format, .. va_list va; va_start(va, format); - sys_write("stdout", stdout, format, va); + sys_write(&_PyId_stdout, stdout, format, va); va_end(va); } @@ -2086,19 +2111,19 @@ PySys_WriteStderr(const char *format, .. va_list va; va_start(va, format); - sys_write("stderr", stderr, format, va); + sys_write(&_PyId_stderr, stderr, format, va); va_end(va); } static void -sys_format(char *name, FILE *fp, const char *format, va_list va) +sys_format(_Py_Identifier *key, FILE *fp, const char *format, va_list va) { PyObject *file, *message; PyObject *error_type, *error_value, *error_traceback; char *utf8; PyErr_Fetch(&error_type, &error_value, &error_traceback); - file = PySys_GetObject(name); + file = _PySys_GetObjectId(key); message = PyUnicode_FromFormatV(format, va); if (message != NULL) { if (sys_pyfile_write_unicode(message, file) != 0) { @@ -2118,7 +2143,7 @@ PySys_FormatStdout(const char *format, . va_list va; va_start(va, format); - sys_format("stdout", stdout, format, va); + sys_format(&_PyId_stdout, stdout, format, va); va_end(va); } @@ -2128,6 +2153,6 @@ PySys_FormatStderr(const char *format, . va_list va; va_start(va, format); - sys_format("stderr", stderr, format, va); + sys_format(&_PyId_stderr, stderr, format, va); va_end(va); } diff -r 2de806c8b070 Python/traceback.c --- a/Python/traceback.c Wed Nov 06 22:17:39 2013 +1000 +++ b/Python/traceback.c Wed Nov 06 18:07:07 2013 +0100 @@ -169,7 +169,7 @@ static PyObject * tail++; taillen = strlen(tail); - syspath = PySys_GetObject("path"); + syspath = _PySys_GetObjectId(&_PyId_path); if (syspath == NULL || !PyList_Check(syspath)) goto error; npath = PyList_Size(syspath);