V8
文章平均质量分 71
sunbxonline
这个作者很懒,什么都没留下…
展开
-
v8::internal::Parser中的Expression解析
首先需要参考Ecma-262文档中的附录A.3Expression中的产生式,v8中的代码是据此进行语法分析的,它采用的算符优先的语法分析方法,在token.h中给出了各种算符的precedence,关于算符优先算法,wiki中给出如下的伪代码http://en.wikipedia.org/wiki/Operator-precedence_parserparse_expression原创 2014-03-02 21:44:06 · 701 阅读 · 0 评论 -
v8中的visitor模式
在设计模式中,有一种visitor模式,它给出了一种在编译器构造时使用的经典模式,如下图所示:语法树的节点存在不同的类型,在不同的编译阶段对这些节点的操作是不同的,为了避免操作与数据的耦合,产生了visitor模式,如下图所示:实际上,基于以下的矩形空间考虑,可以理解的更加清楚 AssignmentNodeVariableNodeType原创 2014-03-02 21:45:03 · 1300 阅读 · 0 评论 -
v8::StringObject的内存布局
使用该内存布局来查看内存数据,编译器watch中看不到这样的对象特别需要说明的是length字段,它是一个smi对象,注意不是对象指针,而是对象,该类在objects.h中定义,对于32bit系统,它的最低位必须是0,也就是说它的取值需要右移一位。例如,在编译js过程中,使用到了source->length(),其中source是Handle,该函数调用如下:SMI_ACCESSO原创 2014-03-02 21:43:10 · 1572 阅读 · 0 评论 -
v8的Zone内存机制
在编译过程中使用的内存分配机制,不同于javascript运行期的垃圾回收机制,由于在编译过程中,尤其是生成AST(Abstract Syntax Tree)的过程中,要使用大量的小内存,V8使用了Zone类,它通过malloc得到一块内存,然后从中分配小内存给用户,并对这些内存进行管理,用 户不需要释放这些内存,而是统一由Zone类进行释放。Zone本身通过Segment类来管理内存,实际上Zo原创 2014-03-02 21:40:45 · 1323 阅读 · 0 评论 -
v8中builtins的初始化
builtins定义于builtins.h,它的实例存在于isolate中,在isolate的init函数中,调用builtins.SetUp函数初始化builtins,builtins内部有一个Object* builtins_[builtin_count],所有的初始化操作,主要就是为了初始化这个对象指针数组,这个数组的每个指针指向的都是一个Code对象,也就是它是一段被编译过的代码。一.原创 2014-03-02 21:52:06 · 2106 阅读 · 0 评论 -
v8的HeapObject解析
一.HeapObject之内存结构v8使用HeapObject作为js object的基类,其优点是一方面可以加快访问速度,另外还可以通过垃圾回收进行管理,所有从HeapObject派生的类,都是原始的struct结构,它使用四字节作为一个字段,第一个四字节字段是map指针,指向一个map对象,当然这个map对象也是从HeapObject派生的,我们可以从这样的派生类定义中看到其内存结构。以S原创 2014-03-02 21:49:44 · 2464 阅读 · 1 评论 -
v8::internal::Utf16CharaterStream类
Ecma-262中规定要求使用utf16来分析javascript,如上的一系列类就是把源数据作为一个流输入。基类Utf16CharacterStream提供基本的advance和pushback,seekforward方法,BufferedUtf16CharacterStream类中加入了一个buffer用于缓冲从数据中的读取到的数据GenericStringUtf16Character原创 2014-03-02 21:41:53 · 691 阅读 · 0 评论 -
v8的Frame
一.何为frameframe是一个代码运行期的概念,同时,在编译期又会用到它,它是一个active record,它记录了函数当前运行的信息。我们使用IDE进行调试的时候,用到的call stack,就是通过frame链表得到的。简单来说,每次的函数调用就会在栈上形成一个frame,同时该frame会连接到frame链表中成为当前的frame。一般来说,cpu会有一个专门的寄存器来保存当前fr原创 2014-03-02 21:54:54 · 2134 阅读 · 2 评论 -
v8的Heap中RootObject的初始化
Heap类中有一个Object* root_[],这个数组是在Heap::CreateHeapObjects方法中初始化的,root_数组非常重要,其中包含了各种类的Map对象,和其他非常重要的全局对象。对于root_数组的存取,Heap一以贯之的使用了宏定义的方式1.root_数组的索引 enum RootListIndex {#define ROOT_INDEX_DECLARAT原创 2014-03-02 21:51:15 · 1325 阅读 · 0 评论 -
v8中Heap的初始化
一.Heap中的sizeHeap实例存在于Isolate中,它的构造函数和ConfigureHeap函数对以下一些重要的size进行了初始化: // Returns the maximum amount of memory reserved for the heap. For // the young generation, we reserve 4 times the amou原创 2014-03-02 21:48:25 · 1373 阅读 · 0 评论 -
v8的Handle
Handle是v8中最为基础的类,v8为了保证数据访问的正确性和垃圾回收,设计了Handle类涉及的文件:include/v8.hsrc/handles.hsrc/handles-inl.hsrc/handles.ccsrc/global-handles.hsrc/global-handles.ccsrc/api.hHandle的分类原创 2014-03-02 21:46:30 · 3789 阅读 · 0 评论 -
JSReceiver及其派生类的内存布局
对象属性的访问,可参看 HeapObject解析,看类的派生关系这些类的内存布局依次如下:在JSFunction类中,有一个shared字段,它指向一个SharedFunctionInfo实例,该类主要是存储JSFunction实例中一些共同的内容原创 2014-03-02 21:53:17 · 1480 阅读 · 0 评论