summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/_warnings.c46
-rw-r--r--Python/pythonrun.c1
-rw-r--r--Python/sysmodule.c8
3 files changed, 44 insertions, 11 deletions
diff --git a/Python/_warnings.c b/Python/_warnings.c
index d03b452..12b1021 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -378,15 +378,47 @@ warn_explicit(PyObject *category, PyObject *message,
show_warning(filename, lineno, text, category, sourceline);
}
else {
- PyObject *res;
-
- res = PyObject_CallFunctionObjArgs(show_fxn, message, category,
+ const char *msg = "functions overriding warnings.showwarning() "
+ "must support the 'line' argument";
+ const char *text_char = PyUnicode_AsString(text);
+
+ if (strcmp(msg, text_char) == 0) {
+ /* Prevent infinite recursion by using built-in implementation
+ of showwarning(). */
+ show_warning(filename, lineno, text, category, sourceline);
+ }
+ else {
+ PyObject *check_fxn;
+ PyObject *defaults;
+ PyObject *res;
+
+ if (PyMethod_Check(show_fxn))
+ check_fxn = PyMethod_Function(show_fxn);
+ else if (PyFunction_Check(show_fxn))
+ check_fxn = show_fxn;
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "warnings.showwarning() must be set to a "
+ "function or method");
+ Py_DECREF(show_fxn);
+ goto cleanup;
+ }
+
+ defaults = PyFunction_GetDefaults(check_fxn);
+ /* A proper implementation of warnings.showwarning() should
+ have at least two default arguments. */
+ if ((defaults == NULL) || (PyTuple_Size(defaults) < 2)) {
+ if (PyErr_WarnEx(PyExc_DeprecationWarning, msg, 1) < 0)
+ goto cleanup;
+ }
+ res = PyObject_CallFunctionObjArgs(show_fxn, message, category,
filename, lineno_obj,
NULL);
- Py_DECREF(show_fxn);
- Py_XDECREF(res);
- if (res == NULL)
- goto cleanup;
+ Py_DECREF(show_fxn);
+ Py_XDECREF(res);
+ if (res == NULL)
+ goto cleanup;
+ }
}
}
else /* if (rc == -1) */
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index e2ba185..7712518 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -83,6 +83,7 @@ int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */
int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
int Py_FrozenFlag; /* Needed by getpath.c */
int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
+int Py_NoUserSiteDirectory = 0; /* for -s and site.py */
/* PyModule_GetWarningsModule is no longer necessary as of 2.6
since _warnings is builtin. This API should not be used. */
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index ec167f0..c33457f 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -1097,7 +1097,7 @@ static PyStructSequence_Field flags_fields[] = {
{"interactive", "-i"},
{"optimize", "-O or -OO"},
{"dont_write_bytecode", "-B"},
- /* {"no_user_site", "-s"}, */
+ {"no_user_site", "-s"},
{"no_site", "-S"},
{"ignore_environment", "-E"},
{"tabcheck", "-t or -tt"},
@@ -1116,9 +1116,9 @@ static PyStructSequence_Desc flags_desc = {
flags__doc__, /* doc */
flags_fields, /* fields */
#ifdef RISCOS
- 11
+ 12
#else
- 10
+ 11
#endif
};
@@ -1141,7 +1141,7 @@ make_flags(void)
SetFlag(Py_InteractiveFlag);
SetFlag(Py_OptimizeFlag);
SetFlag(Py_DontWriteBytecodeFlag);
- /* SetFlag(Py_NoUserSiteDirectory); */
+ SetFlag(Py_NoUserSiteDirectory);
SetFlag(Py_NoSiteFlag);
SetFlag(Py_IgnoreEnvironmentFlag);
SetFlag(Py_TabcheckFlag);