8.3 实例化一个编译器
在编译器启动前,会创建出一个全局编译器状态。编译器状态(compiler
类型)结构体包含了编译器使用的属性,如:编译器标志、栈以及 PyArena
。它还包括了到其他数据结构的链接,如:符号表。
以下是编译器状态中的属性:
字段 | 类型 | 用途 |
---|---|---|
c_arena | PyArena * | 指向内存分配区的指针 |
c_const_cache | PyObject * (dict) | 保存所有常量以及 |
c_do_not_emit_bytecode | int | 关闭字节码编译的标志 |
c_filename | PyObject *(str) | 正在被编译的文件名 |
c_flags | PyCompilerFlags * | 继承的编译器标志(请参见“编译器标志”章节内容) |
c_future | PyFutureFeatures * | 指向模块的 |
c_interactive | int | 交互模式标志 |
c_nestlevel | int | 当前嵌套级别 |
c_optimize | int | 优化级别 |
c_st | symtable * | 编译器符号表 |
c_stack | PyObject * (list) | 保存 |
u | compiler_unit * | 当前块的编译器状态 |
在 PyAST_CompileObject()
中实例化编译器状态:
如果模块没有文档字符串属性(
__doc__
),则在此处创建一个空的属性,就像__annotations__
属性一样;PyAST_CompileObject()
将传递的值设置为编译器状态文件名,其用于堆栈跟踪和异常处理;编译器的内存分配区设置成解释器也在使用的内存分配区;有关内存分配区的更多信息请参阅“内存管理”章节中的“自定义内存分配区”;
在编译代码前,会配置所有未来标志。
Last updated