v8汇编过程
根据抽象语法树FunctionLiteral创建Code对象(内含机器指令),返回JSFunction对象.
MakeCode():
1.增加返回语句: Rewriter::Process(FunctionLiteral) 向抽象语法树的语句数 组Body_添加ReturnStatement(返回语句)
2.优化AST: Rewriter::Optimize(FunctionLiteral)优化抽象语法树
3.产生机器码(机器指令)
1.创建代码产生器FullCodeGenerator(AstVisitor的子类 ):
内含汇编器MacroAssembler(根据硬件架构宏来选择相应的汇编器对象).
v8目前支持4个硬件架构: V8_TARGET_ARCH_IA32
V8_TARGET_ARCH_X84
V8_TARGET_ARCH_ARM
V8_TARGET_ARCH_MIPS
2.调用FullCodeGenerator::Generate(CompilationInfo*,Mode)开始汇编
(1)代码产生器访问AST ,根据语义调用汇编器(MacroAssembler)产生相应的机器指令并放入汇编器的缓冲区.
共有5个步骤:
---- 若Mode为PRIMARY,则 Allocate locals
Allocate local context
Allocate arguments object
----Declarations:汇编抽象语法树的Scope中变量和函数声明对象(ZoneList<Declaration*>)
---- Stack check:汇编栈检验语句
---- Body:汇编非声明语句(语句数组的所有语句)
---- return:汇编返回语句
(2)创建一个CodeDesc对象描述产生的机器指令,再创建Code对象Factory::NewCode(….)
struct CodeDesc { byte* buffer; //缓冲地址
int buffer_size; //缓冲大小
int instr_size; //指令总长度
int reloc_size; //重定位信息长度
Assembler* origin; //汇编器
};
|<--------------- buffer_size ---------------->|
|<-- instr_size -->| |<-- reloc_size -->|
+==================+========+==================+
机器指令缓冲 | instructions | free | reloc info |
+==================+========+==================+
4.结尾操作
根据 抽象语法树FunctionLiteral+Code+CompilationInfo创建SharedFunctionInfo ,
再创建JSFunction对象,Handle<JSFunction>转化为API Handle<Script>,返回