Mercurial > cpython-lru_cache-weakref
comparison Python/pythonrun.c @ 43225:38f3f9ef193d
Convert code from sys.stdin.encoding to UTF-8 in
interactive mode. Fixes #1100.
| author | Martin v. Löwis <martin@v.loewis.de> |
|---|---|
| date | Tue, 04 Sep 2007 09:18:06 +0000 |
| parents | 06dc4321a56a |
| children | b9d19d51de36 |
comparison
equal
deleted
inserted
replaced
| 43224:0294bb2e95de | 43225:38f3f9ef193d |
|---|---|
| 742 #endif | 742 #endif |
| 743 | 743 |
| 744 int | 744 int |
| 745 PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) | 745 PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags) |
| 746 { | 746 { |
| 747 PyObject *m, *d, *v, *w; | 747 PyObject *m, *d, *v, *w, *oenc = NULL; |
| 748 mod_ty mod; | 748 mod_ty mod; |
| 749 PyArena *arena; | 749 PyArena *arena; |
| 750 char *ps1 = "", *ps2 = ""; | 750 char *ps1 = "", *ps2 = "", *enc = NULL; |
| 751 int errcode = 0; | 751 int errcode = 0; |
| 752 | 752 |
| 753 if (fp == stdin) { | |
| 754 /* Fetch encoding from sys.stdin */ | |
| 755 v = PySys_GetObject("stdin"); | |
| 756 if (!v) | |
| 757 return -1; | |
| 758 oenc = PyObject_GetAttrString(v, "encoding"); | |
| 759 if (!oenc) | |
| 760 return -1; | |
| 761 enc = PyUnicode_AsString(oenc); | |
| 762 } | |
| 753 v = PySys_GetObject("ps1"); | 763 v = PySys_GetObject("ps1"); |
| 754 if (v != NULL) { | 764 if (v != NULL) { |
| 755 v = PyObject_Str(v); | 765 v = PyObject_Str(v); |
| 756 if (v == NULL) | 766 if (v == NULL) |
| 757 PyErr_Clear(); | 767 PyErr_Clear(); |
| 768 } | 778 } |
| 769 arena = PyArena_New(); | 779 arena = PyArena_New(); |
| 770 if (arena == NULL) { | 780 if (arena == NULL) { |
| 771 Py_XDECREF(v); | 781 Py_XDECREF(v); |
| 772 Py_XDECREF(w); | 782 Py_XDECREF(w); |
| 783 Py_XDECREF(oenc); | |
| 773 return -1; | 784 return -1; |
| 774 } | 785 } |
| 775 mod = PyParser_ASTFromFile(fp, filename, | 786 mod = PyParser_ASTFromFile(fp, filename, enc, |
| 776 Py_single_input, ps1, ps2, | 787 Py_single_input, ps1, ps2, |
| 777 flags, &errcode, arena); | 788 flags, &errcode, arena); |
| 778 Py_XDECREF(v); | 789 Py_XDECREF(v); |
| 779 Py_XDECREF(w); | 790 Py_XDECREF(w); |
| 791 Py_XDECREF(oenc); | |
| 780 if (mod == NULL) { | 792 if (mod == NULL) { |
| 781 PyArena_Free(arena); | 793 PyArena_Free(arena); |
| 782 if (errcode == E_EOF) { | 794 if (errcode == E_EOF) { |
| 783 PyErr_Clear(); | 795 PyErr_Clear(); |
| 784 return E_EOF; | 796 return E_EOF; |
| 1252 mod_ty mod; | 1264 mod_ty mod; |
| 1253 PyArena *arena = PyArena_New(); | 1265 PyArena *arena = PyArena_New(); |
| 1254 if (arena == NULL) | 1266 if (arena == NULL) |
| 1255 return NULL; | 1267 return NULL; |
| 1256 | 1268 |
| 1257 mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, | 1269 mod = PyParser_ASTFromFile(fp, filename, NULL, start, 0, 0, |
| 1258 flags, NULL, arena); | 1270 flags, NULL, arena); |
| 1259 if (closeit) | 1271 if (closeit) |
| 1260 fclose(fp); | 1272 fclose(fp); |
| 1261 if (mod == NULL) { | 1273 if (mod == NULL) { |
| 1262 PyArena_Free(arena); | 1274 PyArena_Free(arena); |
| 1377 return NULL; | 1389 return NULL; |
| 1378 } | 1390 } |
| 1379 } | 1391 } |
| 1380 | 1392 |
| 1381 mod_ty | 1393 mod_ty |
| 1382 PyParser_ASTFromFile(FILE *fp, const char *filename, int start, char *ps1, | 1394 PyParser_ASTFromFile(FILE *fp, const char *filename, const char* enc, |
| 1395 int start, char *ps1, | |
| 1383 char *ps2, PyCompilerFlags *flags, int *errcode, | 1396 char *ps2, PyCompilerFlags *flags, int *errcode, |
| 1384 PyArena *arena) | 1397 PyArena *arena) |
| 1385 { | 1398 { |
| 1386 mod_ty mod; | 1399 mod_ty mod; |
| 1387 perrdetail err; | 1400 perrdetail err; |
| 1388 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, | 1401 node *n = PyParser_ParseFileFlags(fp, filename, enc, |
| 1402 &_PyParser_Grammar, | |
| 1389 start, ps1, ps2, &err, PARSER_FLAGS(flags)); | 1403 start, ps1, ps2, &err, PARSER_FLAGS(flags)); |
| 1390 if (n) { | 1404 if (n) { |
| 1391 mod = PyAST_FromNode(n, flags, filename, arena); | 1405 mod = PyAST_FromNode(n, flags, filename, arena); |
| 1392 PyNode_Free(n); | 1406 PyNode_Free(n); |
| 1393 return mod; | 1407 return mod; |
| 1404 | 1418 |
| 1405 node * | 1419 node * |
| 1406 PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) | 1420 PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) |
| 1407 { | 1421 { |
| 1408 perrdetail err; | 1422 perrdetail err; |
| 1409 node *n = PyParser_ParseFileFlags(fp, filename, &_PyParser_Grammar, | 1423 node *n = PyParser_ParseFileFlags(fp, filename, NULL, |
| 1424 &_PyParser_Grammar, | |
| 1410 start, NULL, NULL, &err, flags); | 1425 start, NULL, NULL, &err, flags); |
| 1411 if (n == NULL) | 1426 if (n == NULL) |
| 1412 err_input(&err); | 1427 err_input(&err); |
| 1413 | 1428 |
| 1414 return n; | 1429 return n; |
