V8引擎之Binding

继上文

ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode)这个函数算是正式脱离webcore进入bingding模块了。先看下这个函数,再分析

// Evaluate a script file in the environment of this proxy.

ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode)

{

String sourceURL = sourceCode.url();

const String* savedSourceURL = m_sourceURL;

m_sourceURL = &sourceURL;

v8::HandleScope handleScope;

v8::Handle<v8::Context> v8Context = V8Proxy::mainWorldContext(m_proxy->frame());

if (v8Context.IsEmpty())

return ScriptValue();

v8::Context::Scope scope(v8Context);

RefPtr<Frame> protect(m_frame);

v8::Local<v8::Value> object = m_proxy->evaluate(sourceCode, 0);

// Evaluating the JavaScript could cause the frame to be deallocated

// so we start the keep alive timer here.

m_frame->keepAlive();

m_sourceURL = savedSourceURL;

if (object.IsEmpty())

return ScriptValue();

return ScriptValue(object);

}

这个函数里有很多重要的东西,关于使用V8,,无论是单独编译V8通过官方的测试用例还是在浏览器中使用都是大致相同的使用方法。现在挨着分析重要的部分:

1.先看这句:

v8::HandleScope handleScope;

以后遇到V8::这种,这个来源于V8中的很多源码都是用命名空间控制的,知道就行了:

namespace v8 {

namespace internal {//这个是V8里另一个常用的

......

.....

}

}

// Create a handle scope for all local handles.

这里创建handleScope对象,该对象销毁后,下面的所有handle就都销毁了。看似下面没有调用这个对象,实质这个对象创建了就已经起作用了。V8中后面还会这样创建handleScope,也是这样使用的。

看下HandleScope的构造函数:

HandleScope::HandleScope() {

i::Isolate* isolate = i::Isolate::Current();

API_ENTRY_CHECK(isolate, "HandleScope::HandleScope");

v8::ImplementationUtilities::HandleScopeData* current =

isolate->handle_scope_data();

isolate_ = isolate;

prev_next_ = current->next;

prev_limit_ = current->limit;

is_closed_ = false;

current->level++;

}

取当前的isolate,进入api层的相关检查(主要检查线程锁),这个构造函数里还有一个链表控制的object数据,所以每一样定义一个这样的对象,实质上已经起作用了,即使没有使用这个对象。

2.再看

v8::Handle<v8::Context> v8Context = V8Proxy::mainWorldContext(m_proxy->frame());

这里是创建当前frame的上下文,这个mainWorldContext(....)会检测传入的frame的proxy,再调用mainWorldContext()函数,这里面有一个比较重要的函数:

v8::Local<v8::Context> V8Proxy::mainWorldContext()

{

windowShell()->initContextIfNeeded();

return v8::Local<v8::Context>::New(windowShell()->context());

}

windowShell()->initContextIfNeeded();是一个比较重要的函数,下篇再专门分析下这个函数,根据windowshell初始化上下文。windowshell这个东西比较重要,在jsc中创建上下文也与它有关系,JSC中:

JSDOMWindowShell* shell = windowShell(world);

ExecState* exec = shell->window()->globalExec();

V8中:

V8DOMWindowShell* windowShell() const { return m_windowShell.get(); }

windowShell()->context()

3.再看

v8::Context::Scope scope(v8Context);

这里就是把创建的上下文放入作用域中,可以看下这个构造函数:

explicit inline Scope(Handle<Context> context):context_(context){

context_->Enter();

}

void Context::Enter() {

i::Handle<i::Context> env = Utils::OpenHandle(this);

i::Isolate* isolate = env->GetIsolate();

if (IsDeadCheck(isolate, "v8::Context::Enter()")) return;

ENTER_V8(isolate);

isolate->handle_scope_implementer()->EnterContext(env);

isolate->handle_scope_implementer()->SaveContext(isolate->context());

isolate->set_context(*env);

}

这里就是获取当前上下文环境,并将于作用域关联。

4.最后

v8::Local<v8::Value> object = m_proxy->evaluate(sourceCode, 0);

这里开始准备进入编译和执行源码了。

PS:这里面有一下数据关键和类的继承关系,下次另起一篇介绍

时间: 2024-08-27 18:40:15

V8引擎之Binding的相关文章

Chrome V8引擎系列随笔 (1):Math.Random()函数概览

先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分布更加的密集,也就是说Math.Random()函数能表示的数字更多了,大家在.NET中肯定也用过GUID吧,至于GUID为什么会永不重复,大家有没有想过呢? 还是让我们先来看看官方怎么解释Math.Random()吧,它是返回了一个正数,这个正数介于0~1之间,以伪随机的方式在这个范围内波动.Ma

Node.js背后的V8引擎优化技术

Node.js的执行速度远超Ruby.Python等脚本语言,这背后都是V8引擎的功劳.本文将介绍如何编写高性能Node.js代码.V8是Chrome背后的JavaScript引擎,因此本文的相关优化经验也适用于基于Chrome浏览器的JavaScript引擎. V8优化技术概述 V8引擎在虚拟机与语言性能优化上做了很多工作.不过按照Lars Bak的说法,所有这些优化技术都不是他们创造的,只是在前人的基础上做的改进. 隐藏类(Hidden Class) 为了减少JavaScript中访问属性所

JavaScript工作机制:V8 引擎内部机制及如何编写优化代码的5个诀窍

概述 JavaScript引擎是一个执行JavaScript代码的程序或解释器.JavaScript引擎可以被实现为标准解释器,或者实现为以某种形式将JavaScript编译为字节码的即时编译器. 下面是实现了JavaScript引擎的一个热门项目列表: V8- 开源,由Google开发,用C++编写的 Rhino - 由Mozilla基金所管理,开源,完全用Java开发 SpiderMonkey-第一个JavaScript引擎,最早用在Netscape Navigator上,现在用在Firef

V8引擎介绍

V8是什么? V8是谷歌在德国研发中心开发的一个JavaScript引擎.开源并且用C++实现.可以用于运行于客户端和服务端的Javascript程序. V8设计的初衷是为了提高浏览器上JavaScript脚本的执行效率.为了提高速度,V8把JavaScript代码转换成更有效率的机器代码执行,而不像以往是通过解释器执行.像现在大多数的JavaScript引擎一样,比如SpiderMonkey 或者 Rhino (Mozilla),V8实现了一个JIT (Just-In-Time) 编译器,可以

Javascript的V8引擎研究

1.针对上下文的Snapshot技术 什么是上下文(Contexts)?实际是JS应用程序的运行环境,避免应用程序的修改相互影响,例如一个页面js修改内置对象方法toString,不应该影响到另外页面.chrome浏览器每个process只有一个V8引擎实例,浏览器中的每个窗口.iframe都对应一个上下文. ‍ V8启动时(在执行client js前),需要对全局上下文(第一个context)初始化,读取和解析自实现的内置JS代码(另一种技术,第2点),建立起function.array.st

浅谈Chrome V8引擎中的垃圾回收机制

垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带来的内存泄露问题.但使用了垃圾回收即意味着程序员将无法掌控内存.ECMAScript没有暴露任何垃圾回收器的接口.我们无法强迫其进 行垃圾回收,更无法干预内存管理 内存管理问题 在浏览器中,Chrome V8引擎实例的生命周期不会很长(谁没事一个页面开着几天几个月不关),而且运行在用户的机器上.如果

JavaScript V8引擎

一.浏览器内核-渲染引擎 渲染,就是根据描述或者定义构建数学模型,生成图像的过程. 浏览器内核主要的作用是将页面转变成可视化/可听化的多媒体结果,通常也被称为渲染引擎.将HTML/CSS/JavaScript文本及其他相应的媒体类型资源文件转换成网页. 上图中实线框内模块是所有移植的共有部分,虚线框内不同的厂商可以自己实现.下面进行介绍: WebCore 是各个浏览器使用的共享部分,包括HTML解析器.CSS解析器.DOM和SVG等. JavaScriptCore是WebKit的默认引擎,在谷歌

V8引擎——详解

前言 JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力.编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进行完全编译,而解释型语言一边编译一边执行,很明显解释型语言的执行速度是慢于编译型语言的,而JavaScript就是一种解释型脚本语言,支持动态类型.弱类型.基于原型的语言,内置支持类型.鉴于JavaScript都是在前端执行,而且需要及时响应用户,这就要求JavaScript可以快速的解析及执行.

一些V8引擎相关的概念

一:Google的V8引擎的简化模型 如下,包含一个内存堆和函数调用栈.内存堆用于分配内存,函数调用栈用于记录当前程序的运行路径.当网页在chrome中运行报错时,控制台会输出一串错误信息,其来源就是函数调用栈.所以当函数声明时,其函数体存在于堆中,当函数被调用时,其信息存于call stack栈顶. 参考:an overview of the engine, the runtime, and the call stack 二.基于V8引擎在创建对象和为对象添加或去除属性时使用的隐形类机制,in