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