Mercurial > cpython-lru_cache-weakref
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 |
