V8引擎之从webcore到V8

这里不想讲什么是V8,请自行百度。自己搞webkit,故以后的V8学习研究都是基于webkit与V8的结合(目前没有研究blink,仅仅是把webkit官方的JavaScriptCore引擎换作了V8),不是纯粹的V8。

这里仅介绍从webcore的入口处


先从webcore的js入口说起,在html词法解析的时候,有一个这个函数:

bool HTMLDocumentParser::canTakeNextToken(SynchronousMode mode, PumpSession& session)

这个会判断当前是否继续解析,而其中:

   // If we‘re paused waiting for a script, we try to execute scripts before continuing.
        bool shouldContinueParsing = runScriptsForPausedTreeBuilder();

这里正是解析的入口,继续下去直到dom模块的一个void ScriptElement::executeScript(const ScriptSourceCode& sourceCode)这个函数

void ScriptElement::executeScript(const ScriptSourceCode& sourceCode)
{
    ASSERT(m_alreadyStarted);


    if (sourceCode.isEmpty())
        return;


    if (!m_isExternalScript && !m_element->document()->contentSecurityPolicy()->allowInlineScript())
        return;


    RefPtr<Document> document = m_element->document();
    ASSERT(document);
    if (Frame* frame = document->frame()) {
        {
            IgnoreDestructiveWriteCountIncrementer ignoreDesctructiveWriteCountIncrementer(m_isExternalScript ? document.get() : 0);
            // Create a script from the script element node, using the script
            // block‘s source and the script block‘s type.
            // Note: This is where the script is compiled and actually executed.
            frame->script()->evaluate(sourceCode);
        }


        Document::updateStyleForAllDocuments();
    }
}

看见了吧,注释已经写的很清楚,从这里开始离开webcore准备进入js引擎了

  frame->script()->evaluate(sourceCode);这里调用binding模块的脚本控制器scriptcontroler,开始进入binding模块,这binding模块JSC和V8其实有很大的相似之处。下篇再专门分析下v8的binding模块

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。