summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
Diffstat (limited to 'Python')
-rw-r--r--Python/bltinmodule.c15
-rw-r--r--Python/import.c37
-rw-r--r--Python/marshal.c87
-rw-r--r--Python/pythonrun.c34
-rw-r--r--Python/sysmodule.c38
5 files changed, 58 insertions, 153 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index d4c8a74905..3b43ff953a 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -659,8 +659,7 @@ builtin_exec(PyObject *self, PyObject *args)
locals = globals;
if (!PyString_Check(prog) &&
!PyUnicode_Check(prog) &&
- !PyCode_Check(prog) &&
- !PyFile_Check(prog)) {
+ !PyCode_Check(prog)) {
PyErr_Format(PyExc_TypeError,
"exec() arg 1 must be a string, file, or code "
"object, not %.100s", prog->ob_type->tp_name);
@@ -692,18 +691,6 @@ builtin_exec(PyObject *self, PyObject *args)
}
v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
}
- else if (PyFile_Check(prog)) {
- FILE *fp = PyFile_AsFile(prog);
- char *name = PyString_AsString(PyFile_Name(prog));
- PyCompilerFlags cf;
- cf.cf_flags = 0;
- if (PyEval_MergeCompilerFlags(&cf))
- v = PyRun_FileFlags(fp, name, Py_file_input, globals,
- locals, &cf);
- else
- v = PyRun_File(fp, name, Py_file_input, globals,
- locals);
- }
else {
char *str = source_as_string(prog);
PyCompilerFlags cf;
diff --git a/Python/import.c b/Python/import.c
index 4786f1b3ee..5680abcc32 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -2764,19 +2764,21 @@ static FILE *
get_file(char *pathname, PyObject *fob, char *mode)
{
FILE *fp;
+ if (mode[0] == 'U')
+ mode = "r" PY_STDIOTEXTMODE;
if (fob == NULL) {
- if (mode[0] == 'U')
- mode = "r" PY_STDIOTEXTMODE;
fp = fopen(pathname, mode);
- if (fp == NULL)
- PyErr_SetFromErrno(PyExc_IOError);
}
else {
- fp = PyFile_AsFile(fob);
- if (fp == NULL)
- PyErr_SetString(PyExc_ValueError,
- "bad/closed file object");
+ int fd = PyObject_AsFileDescriptor(fob);
+ if (fd == -1)
+ return NULL;
+ /* XXX This will leak a FILE struct. Fix this!!!!
+ (But it doesn't leak a file descrioptor!) */
+ fp = fdopen(fd, mode);
}
+ if (fp == NULL)
+ PyErr_SetFromErrno(PyExc_IOError);
return fp;
}
@@ -2788,8 +2790,8 @@ imp_load_compiled(PyObject *self, PyObject *args)
PyObject *fob = NULL;
PyObject *m;
FILE *fp;
- if (!PyArg_ParseTuple(args, "ss|O!:load_compiled", &name, &pathname,
- &PyFile_Type, &fob))
+ if (!PyArg_ParseTuple(args, "ss|O:load_compiled",
+ &name, &pathname, &fob))
return NULL;
fp = get_file(pathname, fob, "rb");
if (fp == NULL)
@@ -2810,8 +2812,8 @@ imp_load_dynamic(PyObject *self, PyObject *args)
PyObject *fob = NULL;
PyObject *m;
FILE *fp = NULL;
- if (!PyArg_ParseTuple(args, "ss|O!:load_dynamic", &name, &pathname,
- &PyFile_Type, &fob))
+ if (!PyArg_ParseTuple(args, "ss|O:load_dynamic",
+ &name, &pathname, &fob))
return NULL;
if (fob) {
fp = get_file(pathname, fob, "r");
@@ -2832,8 +2834,8 @@ imp_load_source(PyObject *self, PyObject *args)
PyObject *fob = NULL;
PyObject *m;
FILE *fp;
- if (!PyArg_ParseTuple(args, "ss|O!:load_source", &name, &pathname,
- &PyFile_Type, &fob))
+ if (!PyArg_ParseTuple(args, "ss|O:load_source",
+ &name, &pathname, &fob))
return NULL;
fp = get_file(pathname, fob, "r");
if (fp == NULL)
@@ -2873,12 +2875,7 @@ imp_load_module(PyObject *self, PyObject *args)
if (fob == Py_None)
fp = NULL;
else {
- if (!PyFile_Check(fob)) {
- PyErr_SetString(PyExc_ValueError,
- "load_module arg#2 should be a file or None");
- return NULL;
- }
- fp = get_file(pathname, fob, mode);
+ fp = get_file(NULL, fob, mode);
if (fp == NULL)
return NULL;
}
diff --git a/Python/marshal.c b/Python/marshal.c
index 262c185aba..85926edbbd 100644
--- a/Python/marshal.c
+++ b/Python/marshal.c
@@ -1138,81 +1138,52 @@ PyMarshal_WriteObjectToString(PyObject *x, int version)
static PyObject *
marshal_dump(PyObject *self, PyObject *args)
{
- WFILE wf;
+ /* XXX Quick hack -- need to do this differently */
PyObject *x;
PyObject *f;
int version = Py_MARSHAL_VERSION;
+ PyObject *s;
+ PyObject *res;
if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version))
return NULL;
- if (!PyFile_Check(f)) {
- /* XXX Quick hack -- need to do this differently */
- PyObject *s = PyMarshal_WriteObjectToString(x, version);
- PyObject *res = NULL;
- if (s != NULL) {
- res = PyObject_CallMethod(f, "write", "O", s);
- Py_DECREF(s);
- }
- return res;
- }
- wf.fp = PyFile_AsFile(f);
- wf.str = NULL;
- wf.ptr = wf.end = NULL;
- wf.error = 0;
- wf.depth = 0;
- wf.strings = (version > 0) ? PyDict_New() : 0;
- wf.version = version;
- w_object(x, &wf);
- Py_XDECREF(wf.strings);
- if (wf.error) {
- PyErr_SetString(PyExc_ValueError,
- (wf.error==1)?"unmarshallable object"
- :"object too deeply nested to marshal");
+ s = PyMarshal_WriteObjectToString(x, version);
+ if (s == NULL)
return NULL;
- }
- Py_INCREF(Py_None);
- return Py_None;
+ res = PyObject_CallMethod(f, "write", "O", s);
+ Py_DECREF(s);
+ return res;
}
static PyObject *
marshal_load(PyObject *self, PyObject *f)
{
+ /* XXX Quick hack -- need to do this differently */
+ PyObject *data, *result;
RFILE rf;
- PyObject *result;
- if (!PyFile_Check(f)) {
- /* XXX Quick hack -- need to do this differently */
- PyObject *data, *result;
- RFILE rf;
- data = PyObject_CallMethod(f, "read", "");
- if (data == NULL)
- return NULL;
- rf.fp = NULL;
- if (PyString_Check(data)) {
- rf.ptr = PyString_AS_STRING(data);
- rf.end = rf.ptr + PyString_GET_SIZE(data);
- }
- else if (PyBytes_Check(data)) {
- rf.ptr = PyBytes_AS_STRING(data);
- rf.end = rf.ptr + PyBytes_GET_SIZE(data);
- }
- else {
- PyErr_Format(PyExc_TypeError,
- "f.read() returned neither string "
- "nor bytes but %.100s",
- data->ob_type->tp_name);
- Py_DECREF(data);
- return NULL;
- }
- rf.strings = PyList_New(0);
- result = read_object(&rf);
- Py_DECREF(rf.strings);
+ data = PyObject_CallMethod(f, "read", "");
+ if (data == NULL)
+ return NULL;
+ rf.fp = NULL;
+ if (PyString_Check(data)) {
+ rf.ptr = PyString_AS_STRING(data);
+ rf.end = rf.ptr + PyString_GET_SIZE(data);
+ }
+ else if (PyBytes_Check(data)) {
+ rf.ptr = PyBytes_AS_STRING(data);
+ rf.end = rf.ptr + PyBytes_GET_SIZE(data);
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "f.read() returned neither string "
+ "nor bytes but %.100s",
+ data->ob_type->tp_name);
Py_DECREF(data);
- return result;
+ return NULL;
}
- rf.fp = PyFile_AsFile(f);
rf.strings = PyList_New(0);
- rf.depth = 0;
result = read_object(&rf);
Py_DECREF(rf.strings);
+ Py_DECREF(data);
return result;
}
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 5daf7dd0ec..db21dafaae 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -155,7 +155,6 @@ Py_InitializeEx(int install_sigs)
#if defined(HAVE_LANGINFO_H) && defined(CODESET)
char *codeset;
char *saved_locale;
- PyObject *sys_stream, *sys_isatty;
#endif
extern void _Py_ReadyTypes(void);
@@ -273,39 +272,6 @@ Py_InitializeEx(int install_sigs)
free(saved_locale);
if (codeset) {
- sys_stream = PySys_GetObject("stdin");
- sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
- if (!sys_isatty)
- PyErr_Clear();
- if(sys_isatty && PyObject_IsTrue(sys_isatty) &&
- PyFile_Check(sys_stream)) {
- if (!PyFile_SetEncoding(sys_stream, codeset))
- Py_FatalError("Cannot set codeset of stdin");
- }
- Py_XDECREF(sys_isatty);
-
- sys_stream = PySys_GetObject("stdout");
- sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
- if (!sys_isatty)
- PyErr_Clear();
- if(sys_isatty && PyObject_IsTrue(sys_isatty) &&
- PyFile_Check(sys_stream)) {
- if (!PyFile_SetEncoding(sys_stream, codeset))
- Py_FatalError("Cannot set codeset of stdout");
- }
- Py_XDECREF(sys_isatty);
-
- sys_stream = PySys_GetObject("stderr");
- sys_isatty = PyObject_CallMethod(sys_stream, "isatty", "");
- if (!sys_isatty)
- PyErr_Clear();
- if(sys_isatty && PyObject_IsTrue(sys_isatty) &&
- PyFile_Check(sys_stream)) {
- if (!PyFile_SetEncoding(sys_stream, codeset))
- Py_FatalError("Cannot set codeset of stderr");
- }
- Py_XDECREF(sys_isatty);
-
if (!Py_FileSystemDefaultEncoding)
Py_FileSystemDefaultEncoding = codeset;
else
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 1b7674b9b0..71a455a82f 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -55,18 +55,6 @@ PySys_GetObject(char *name)
return PyDict_GetItemString(sd, name);
}
-FILE *
-PySys_GetFile(char *name, FILE *def)
-{
- FILE *fp = NULL;
- PyObject *v = PySys_GetObject(name);
- if (v != NULL && PyFile_Check(v))
- fp = PyFile_AsFile(v);
- if (fp == NULL)
- fp = def;
- return fp;
-}
-
int
PySys_SetObject(char *name, PyObject *v)
{
@@ -1353,25 +1341,21 @@ mywrite(char *name, FILE *fp, const char *format, va_list va)
{
PyObject *file;
PyObject *error_type, *error_value, *error_traceback;
+ char buffer[1001];
+ int written;
PyErr_Fetch(&error_type, &error_value, &error_traceback);
file = PySys_GetObject(name);
- if (file == NULL || PyFile_AsFile(file) == fp)
- vfprintf(fp, format, va);
- else {
- char buffer[1001];
- const int written = PyOS_vsnprintf(buffer, sizeof(buffer),
- format, va);
- if (PyFile_WriteString(buffer, file) != 0) {
+ written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
+ if (PyFile_WriteString(buffer, file) != 0) {
+ PyErr_Clear();
+ fputs(buffer, fp);
+ }
+ if (written < 0 || (size_t)written >= sizeof(buffer)) {
+ const char *truncated = "... truncated";
+ if (PyFile_WriteString(truncated, file) != 0) {
PyErr_Clear();
- fputs(buffer, fp);
- }
- if (written < 0 || (size_t)written >= sizeof(buffer)) {
- const char *truncated = "... truncated";
- if (PyFile_WriteString(truncated, file) != 0) {
- PyErr_Clear();
- fputs(truncated, fp);
- }
+ fputs(truncated, fp);
}
}
PyErr_Restore(error_type, error_value, error_traceback);