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>;