Python/初期化処理を読む
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[Pythonを読む]]
#contents
*Py_Main (Modules/main.c) [#l307a9ec]
読んだことないので先頭から。main関数はPrograms/python.cに...
Py_Main関数は500行ぐらいありますが、初めの300行ぐらいはコ...
コマンドライン処理が終わったぐらいのところでPy_Initialize...
その後、コマンド指定(-c)がされているか、モジュール指定...
#code(C){{
run_file(FILE *fp, const wchar_t *filename, PyCompilerFla...
{
char *filename_str;
int run;
if (filename) {
// 省略
}
else
filename_str = "<stdin>";
run = PyRun_AnyFileExFlags(fp, filename_str, filename...
return run != 0;
}
}}
fpはstdinです。
* PyRun_InteractiveOneObject (Python/pythonrun.c) [#ce284...
PyRun_AnyFileExFlags。入力がインタラクティブの時はInterac...
#code(C){{
int
PyRun_AnyFileExFlags(FILE *fp, const char *filename, int ...
PyCompilerFlags *flags)
{
if (Py_FdIsInteractive(fp, filename)) {
int err = PyRun_InteractiveLoopFlags(fp, filename...
if (closeit)
fclose(fp);
return err;
}
else
return PyRun_SimpleFileExFlags(fp, filename, clos...
}
}}
PyRun_InteractiveLoopFlagsに進みます。エラー処理とかを省...
#code(C){{
int
PyRun_InteractiveLoopFlags(FILE *fp, const char *filename...
{
PyObject *filename, *v;
int ret, err;
filename = PyUnicode_DecodeFSDefault(filename_str);
v = _PySys_GetObjectId(&PyId_ps1);
if (v == NULL) {
_PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromS...
Py_XDECREF(v);
}
v = _PySys_GetObjectId(&PyId_ps2);
if (v == NULL) {
_PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromS...
Py_XDECREF(v);
}
err = -1;
for (;;) {
ret = PyRun_InteractiveOneObject(fp, filename, fl...
if (ret == E_EOF) {
err = 0;
break;
}
}
Py_DECREF(filename);
return err;
}
}}
PyRun_InteractiveOneObjectと、シェルに入力した式が実行さ...
#code(C){{
int
PyRun_InteractiveOneObject(FILE *fp, PyObject *filename, ...
{
PyObject *m, *d, *v, *w, *oenc = NULL, *mod_name;
mod_ty mod;
PyArena *arena;
char *ps1 = "", *ps2 = "", *enc = NULL;
int errcode = 0;
_Py_IDENTIFIER(encoding);
_Py_IDENTIFIER(__main__);
mod_name = _PyUnicode_FromId(&PyId___main__); /* borr...
if (fp == stdin) {
/* Fetch encoding from sys.stdin if possible. */
v = _PySys_GetObjectId(&PyId_stdin);
if (v && v != Py_None) {
oenc = _PyObject_GetAttrId(v, &PyId_encoding);
if (oenc)
enc = _PyUnicode_AsString(oenc);
}
}
arena = PyArena_New();
mod = PyParser_ASTFromFileObject(fp, filename, enc,
Py_single_input, ps1...
flags, &errcode, are...
Py_XDECREF(v);
Py_XDECREF(w);
Py_XDECREF(oenc);
m = PyImport_AddModuleObject(mod_name);
d = PyModule_GetDict(m);
v = run_mod(mod, filename, d, d, flags, arena);
PyArena_Free(arena);
Py_DECREF(v);
flush_io();
return 0;
}
}}
入力からASTを作り、実行しています。PyParser_ASTFromFileOb...
#code(C){{
mod_ty
PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, ...
int start, char *ps1,
char *ps2, PyCompilerFlags *fl...
PyArena *arena)
{
mod_ty mod;
perrdetail err;
int iflags = PARSER_FLAGS(flags);
node *n = PyParser_ParseFileObject(fp, filename, enc,
&_PyParser_Grammar,
start, ps1, ps2, &...
if (n) {
flags->cf_flags |= iflags & PyCF_MASK;
mod = PyAST_FromNodeObject(n, flags, filename, ar...
PyNode_Free(n);
}
err_free(&err);
return mod;
}
}}
run_mod。
#code(C){{
static PyObject *
run_mod(mod_ty mod, PyObject *filename, PyObject *globals...
PyCompilerFlags *flags, PyArena *arena)
{
PyCodeObject *co;
PyObject *v;
co = PyAST_CompileObject(mod, filename, flags, -1, ar...
v = PyEval_EvalCode((PyObject*)co, globals, locals);
Py_DECREF(co);
return v;
}
}}
というわけで、教科書のように以下の順番で処理が行われてい...
+スクリプトからノードへの変換:PyParser_ParseFileObject (...
+ノードからASTへの変換:PyAST_FromNodeObject (Python/ast.c)
+ASTからバイトコードへの変換:PyAST_CompileObject (Python...
+バイトコードの実行:PyEval_EvalCode (Python/ceval.c)
スクリプト解析は長くなるので[[別ページ>Python/スクリプト...
ここまでの感想、ってほどでもないですが、慣れてないせいかR...
終了行:
[[Pythonを読む]]
#contents
*Py_Main (Modules/main.c) [#l307a9ec]
読んだことないので先頭から。main関数はPrograms/python.cに...
Py_Main関数は500行ぐらいありますが、初めの300行ぐらいはコ...
コマンドライン処理が終わったぐらいのところでPy_Initialize...
その後、コマンド指定(-c)がされているか、モジュール指定...
#code(C){{
run_file(FILE *fp, const wchar_t *filename, PyCompilerFla...
{
char *filename_str;
int run;
if (filename) {
// 省略
}
else
filename_str = "<stdin>";
run = PyRun_AnyFileExFlags(fp, filename_str, filename...
return run != 0;
}
}}
fpはstdinです。
* PyRun_InteractiveOneObject (Python/pythonrun.c) [#ce284...
PyRun_AnyFileExFlags。入力がインタラクティブの時はInterac...
#code(C){{
int
PyRun_AnyFileExFlags(FILE *fp, const char *filename, int ...
PyCompilerFlags *flags)
{
if (Py_FdIsInteractive(fp, filename)) {
int err = PyRun_InteractiveLoopFlags(fp, filename...
if (closeit)
fclose(fp);
return err;
}
else
return PyRun_SimpleFileExFlags(fp, filename, clos...
}
}}
PyRun_InteractiveLoopFlagsに進みます。エラー処理とかを省...
#code(C){{
int
PyRun_InteractiveLoopFlags(FILE *fp, const char *filename...
{
PyObject *filename, *v;
int ret, err;
filename = PyUnicode_DecodeFSDefault(filename_str);
v = _PySys_GetObjectId(&PyId_ps1);
if (v == NULL) {
_PySys_SetObjectId(&PyId_ps1, v = PyUnicode_FromS...
Py_XDECREF(v);
}
v = _PySys_GetObjectId(&PyId_ps2);
if (v == NULL) {
_PySys_SetObjectId(&PyId_ps2, v = PyUnicode_FromS...
Py_XDECREF(v);
}
err = -1;
for (;;) {
ret = PyRun_InteractiveOneObject(fp, filename, fl...
if (ret == E_EOF) {
err = 0;
break;
}
}
Py_DECREF(filename);
return err;
}
}}
PyRun_InteractiveOneObjectと、シェルに入力した式が実行さ...
#code(C){{
int
PyRun_InteractiveOneObject(FILE *fp, PyObject *filename, ...
{
PyObject *m, *d, *v, *w, *oenc = NULL, *mod_name;
mod_ty mod;
PyArena *arena;
char *ps1 = "", *ps2 = "", *enc = NULL;
int errcode = 0;
_Py_IDENTIFIER(encoding);
_Py_IDENTIFIER(__main__);
mod_name = _PyUnicode_FromId(&PyId___main__); /* borr...
if (fp == stdin) {
/* Fetch encoding from sys.stdin if possible. */
v = _PySys_GetObjectId(&PyId_stdin);
if (v && v != Py_None) {
oenc = _PyObject_GetAttrId(v, &PyId_encoding);
if (oenc)
enc = _PyUnicode_AsString(oenc);
}
}
arena = PyArena_New();
mod = PyParser_ASTFromFileObject(fp, filename, enc,
Py_single_input, ps1...
flags, &errcode, are...
Py_XDECREF(v);
Py_XDECREF(w);
Py_XDECREF(oenc);
m = PyImport_AddModuleObject(mod_name);
d = PyModule_GetDict(m);
v = run_mod(mod, filename, d, d, flags, arena);
PyArena_Free(arena);
Py_DECREF(v);
flush_io();
return 0;
}
}}
入力からASTを作り、実行しています。PyParser_ASTFromFileOb...
#code(C){{
mod_ty
PyParser_ASTFromFileObject(FILE *fp, PyObject *filename, ...
int start, char *ps1,
char *ps2, PyCompilerFlags *fl...
PyArena *arena)
{
mod_ty mod;
perrdetail err;
int iflags = PARSER_FLAGS(flags);
node *n = PyParser_ParseFileObject(fp, filename, enc,
&_PyParser_Grammar,
start, ps1, ps2, &...
if (n) {
flags->cf_flags |= iflags & PyCF_MASK;
mod = PyAST_FromNodeObject(n, flags, filename, ar...
PyNode_Free(n);
}
err_free(&err);
return mod;
}
}}
run_mod。
#code(C){{
static PyObject *
run_mod(mod_ty mod, PyObject *filename, PyObject *globals...
PyCompilerFlags *flags, PyArena *arena)
{
PyCodeObject *co;
PyObject *v;
co = PyAST_CompileObject(mod, filename, flags, -1, ar...
v = PyEval_EvalCode((PyObject*)co, globals, locals);
Py_DECREF(co);
return v;
}
}}
というわけで、教科書のように以下の順番で処理が行われてい...
+スクリプトからノードへの変換:PyParser_ParseFileObject (...
+ノードからASTへの変換:PyAST_FromNodeObject (Python/ast.c)
+ASTからバイトコードへの変換:PyAST_CompileObject (Python...
+バイトコードの実行:PyEval_EvalCode (Python/ceval.c)
スクリプト解析は長くなるので[[別ページ>Python/スクリプト...
ここまでの感想、ってほどでもないですが、慣れてないせいかR...
ページ名: