comparison Python/sysmodule.c @ 42071:825041fc8e2c

Rip out the file object's implementation. Fixed test_import.py while I was at it. However, there's still a problem in import.c -- get_file() can leak a FILE struct (not a file descriptor though). I'm not sure how to fix this; closing the FILE* closes the file descriptor, and that's the wrong thing to do when there's still a Python file object keeping the file descriptor open. I also would rather not mess with dup(), as it won't port to Windows.
author Guido van Rossum <guido@python.org>
date Tue, 12 Jun 2007 23:30:11 +0000
parents cd125fe83051
children 6727cc9ed09f
comparison
equal deleted inserted replaced
42068:45bb97a4e8b6 42071:825041fc8e2c
51 PyThreadState *tstate = PyThreadState_GET(); 51 PyThreadState *tstate = PyThreadState_GET();
52 PyObject *sd = tstate->interp->sysdict; 52 PyObject *sd = tstate->interp->sysdict;
53 if (sd == NULL) 53 if (sd == NULL)
54 return NULL; 54 return NULL;
55 return PyDict_GetItemString(sd, name); 55 return PyDict_GetItemString(sd, name);
56 }
57
58 FILE *
59 PySys_GetFile(char *name, FILE *def)
60 {
61 FILE *fp = NULL;
62 PyObject *v = PySys_GetObject(name);
63 if (v != NULL && PyFile_Check(v))
64 fp = PyFile_AsFile(v);
65 if (fp == NULL)
66 fp = def;
67 return fp;
68 } 56 }
69 57
70 int 58 int
71 PySys_SetObject(char *name, PyObject *v) 59 PySys_SetObject(char *name, PyObject *v)
72 { 60 {
1351 static void 1339 static void
1352 mywrite(char *name, FILE *fp, const char *format, va_list va) 1340 mywrite(char *name, FILE *fp, const char *format, va_list va)
1353 { 1341 {
1354 PyObject *file; 1342 PyObject *file;
1355 PyObject *error_type, *error_value, *error_traceback; 1343 PyObject *error_type, *error_value, *error_traceback;
1344 char buffer[1001];
1345 int written;
1356 1346
1357 PyErr_Fetch(&error_type, &error_value, &error_traceback); 1347 PyErr_Fetch(&error_type, &error_value, &error_traceback);
1358 file = PySys_GetObject(name); 1348 file = PySys_GetObject(name);
1359 if (file == NULL || PyFile_AsFile(file) == fp) 1349 written = PyOS_vsnprintf(buffer, sizeof(buffer), format, va);
1360 vfprintf(fp, format, va); 1350 if (PyFile_WriteString(buffer, file) != 0) {
1361 else { 1351 PyErr_Clear();
1362 char buffer[1001]; 1352 fputs(buffer, fp);
1363 const int written = PyOS_vsnprintf(buffer, sizeof(buffer), 1353 }
1364 format, va); 1354 if (written < 0 || (size_t)written >= sizeof(buffer)) {
1365 if (PyFile_WriteString(buffer, file) != 0) { 1355 const char *truncated = "... truncated";
1356 if (PyFile_WriteString(truncated, file) != 0) {
1366 PyErr_Clear(); 1357 PyErr_Clear();
1367 fputs(buffer, fp); 1358 fputs(truncated, fp);
1368 }
1369 if (written < 0 || (size_t)written >= sizeof(buffer)) {
1370 const char *truncated = "... truncated";
1371 if (PyFile_WriteString(truncated, file) != 0) {
1372 PyErr_Clear();
1373 fputs(truncated, fp);
1374 }
1375 } 1359 }
1376 } 1360 }
1377 PyErr_Restore(error_type, error_value, error_traceback); 1361 PyErr_Restore(error_type, error_value, error_traceback);
1378 } 1362 }
1379 1363