AssignmentNode | VariableNode | |
TypeChecking |
TypeChecking-AssignmentNode
|
TypeChecking-VariableNode
|
CodeGenerate |
CodeGenerate-AssignmentNode
|
CodeGenerate-VariableNode
|
Processor类从AstVisitor继承,它在rewriter中调用,负责遍历list中的statement,并改写它们
void Processor::Process(ZoneList<Statement*>* statements) {
for (int i = statements->length() - 1; i >= 0; --i) {
Visit(statements->at(i));
}
}
我们来看Visit函数的实现,它本身是AstVisitor类的虚函数,其定义如下:
virtual void Visit(AstNode* node) { \
if (!CheckStackOverflow()) node->Accept(this); \
}
我们看到Processor把功能委托给AstNode来实现,这是我们在区分不同对象不同处理的时候,常用的方法之一,AstNode::Accept是个虚函数,在ast.cc中给出了统一的定义
#define DECL_ACCEPT(type) \
void type::Accept(AstVisitor* v) { v->Visit##type(this); }
AST_NODE_LIST(DECL_ACCEPT)
#undef DECL_ACCEPT
这里是visitor模式的关键,v8通过宏定义的形式定义了AstNode一系列继承类的Accept虚函数,注意它的实现,v->Visit##type(this); ,即调用了visitor的相应的Visit##type函数,这里采用了一种编译期的类型区分,它不同于虚函数,虚函数是运行期的类型区分,具体到Processor而言,就是调用了Processor的对应的Visit##type函数,在Processor类中,我们看到很多形如这样的函数,对于AstNode是ExpressionStatement而言,对应的函数如下:
void Processor::VisitExpressionStatement(ExpressionStatement* node) {
// Rewrite : <x>; -> .result = <x>;
if (!is_set_ && !node->expression()->IsThrow()) {
node->set_expression(SetResult(node->expression()));
if (!in_try_) is_set_ = true;
}
}
此时Node中存放着一个Expression,这里通过改写把它变成一个赋值表达式,如注释所言,
Rewrite : <x>; -> .result = <x>;