上一篇其实想讲初始化的第二步,但是内容比较无聊,所以换了一个话题,谈了谈v8的命名空间和宏,稍微轻松一下。

在这里还是接着说说初始化过程,毕竟写博客的初衷是对自己努力的记录,不是为了吸粉,这篇没图,对代码本身没有兴趣的可以跳过了。

再多说几句,讲一下我怎么看的源码吧。源码的一些方法涉及很多类和文件,所以我都会统一标注在弄到一个文件里,这样后期复盘可以比较方便,就像图中这样。

文件名代表源码的方法、类别、逻辑等等,就像vue的源码也被分割为diff、virtual-dom、parse等等模块一样。不过v8可不会给你搞这些,所以就需要自己去整理了。内容里,每一个方法、类构造的跳转都会进行标记,前面贴代码也能看到,就是1-1、1-2这些,后期考虑有没有别的更好方法。

就像上面这样,基本上每一个小点也会进行注释,毕竟C++平时工作不会用上,语法什么的容易忘。而且C++的类型是真的很随意,到处都是using、typedef,有可能这只是一个整数类型,但是为了语义化类型搞得跟类一样,比较典型的就是win的DWORD,实际上就是unsigned long,第一次见还以为是个多复杂的结构体,标注之后会视觉上的复杂性会减少很多。

目前先用这个来整理思路和学习,感觉还不错。最近是因为比较闲所以才写的多,如果比较繁忙,碎片时间看源码就会凸显一个很严重的问题,就是思路断档。之前尝试分析v8对JS代码的compile的时候就发现了,其过程十分的长,第一天看了一半,第二天忘了一部分后就接不上了。后面就暂时放弃过于繁琐的部分,并且开始寻找一个好方法可以整理源码。

开始贴代码环节,上一篇说过第二步的嵌入,实际上只是命名空间的转移,也就是将生成的platform赋值到另一个namespace中。

v8::Platform* V8::platform_ = nullptr;

void V8::InitializePlatform(v8::Platform* platform) {
CHECK(!platform_);
CHECK(platform);
// 将普通的platform对象转移到v8::platform命名空间下
platform_ = platform;
// 1-1
v8::base::SetPrintStackTrace(platform_->GetStackTracePrinter());
// 1-2
v8::tracing::TracingCategoryObserver::SetUp();
}

如上所示,v8::Platform的命名空间下声明了一个platform类型的变量,这里只是简单的进行赋值。但肯定不仅仅这么一点,后面还有两步内容,分别是设置调用栈打印方法和调用栈追踪类的初始化。

第一个设置也是很简单的命名空间转移,函数已经在默认Platform上定义好了,如下。

// v8::platform
// 预定义
void PrintStackTrace() {
v8::base::debug::StackTrace trace;
trace.Print();
// Avoid dumping duplicate stack trace on abort signal.
v8::base::debug::DisableSignalStackDump();
}
Platform::StackTracePrinter DefaultPlatform::GetStackTracePrinter() {
return PrintStackTrace;
} // v8::base
void (*g_print_stack_trace)() = nullptr;
void SetPrintStackTrace(void (*print_stack_trace)()) {
g_print_stack_trace = print_stack_trace;
}

这个方法后面专门来讲,初始化时候只是赋值,并没有调用。

第二步的初始化也比较简单。

// v8::tracing
TracingCategoryObserver* TracingCategoryObserver::instance_ = nullptr;
void TracingCategoryObserver::SetUp() {// 生成一个新的Observer 这个类构造函数没什么特殊
TracingCategoryObserver::instance_ = new TracingCategoryObserver();// v8::platform::tracing
i::V8::GetCurrentPlatform()->GetTracingController()->AddTraceStateObserver(TracingCategoryObserver::instance_);
} void TracingController::AddTraceStateObserver(v8::TracingController::TraceStateObserver* observer) {
{
base::MutexGuard lock(mutex_.get());
// TracingController的属性std::unordered_set<v8::TracingController::TraceStateObserver*> observers_;
// insert是unordered_set的插入方法
observers_.insert(observer);
if (!recording_.load(std::memory_order_acquire)) return;
}// Fire the observer if recording is already in progress.
observer->OnTraceEnabled();
}

在前面的platform属性介绍里讲过,除了线程相关,还有两个工具类,一个就是这里的TracingController。这里生成了一个调用栈的观察者对象,并将其加入类的一个无序SET属性中。

最后一步是根据默认参数来启动Observer对不同状态runtime的追踪,全是宏,太麻烦了,有兴趣的自己去研究吧。

深入V8引擎-初始化之InitPlatform的更多相关文章

  1. 深入V8引擎-初始化默认Platform

    本来寻思着写一篇"'Hello' + ', World'"是怎么从JS代码编译然后输出的,然而compile过程的复杂性远超我的想象,强上怕会走火入魔,还是老老实实先回家种田,找点 ...

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

    最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...

  3. 精读《V8 引擎 Lazy Parsing》

    1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...

  4. google v8引擎常见问题

    最近在项目中使用v8来进行扩展,下面简单说一下使用v8过程中遇到的一些问题.   v8的多线程调用 最初调研v8的测试代码是单线程的,后来一个项目在多线程中使用,出现了一些问题,后来看到参考3中的才恍 ...

  5. Javascript的V8引擎研究

    1.针对上下文的Snapshot技术 什么是上下文(Contexts)?实际是JS应用程序的运行环境,避免应用程序的修改相互影响,例如一个页面js修改内置对象方法toString,不应该影响到另外页面 ...

  6. Google V8 引擎 原理详解

    V8 引擎概览 V8 引擎简介 Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流 操作系统中,甚至可以运行在移动终端 ( 基于 ARM ...

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

    概述 JavaScript引擎是一个执行JavaScript代码的程序或解释器.JavaScript引擎可以被实现为标准解释器,或者实现为以某种形式将JavaScript编译为字节码的即时编译器. 下 ...

  8. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  9. V8 引擎是如何工作的?

    V8 引擎是如何工作的? 本文翻译自:How the V8 engine works? ​ V8是谷歌德国开发中心构建的一个JavaScript引擎.它是由C++编写的开源项目,同时被客户端(谷歌浏览 ...

随机推荐

  1. 动态改变伪元素样式的方(用:after和:before生成的元素)

    自己查资料总结的两种方法 一.纯css改变 a:hover:before{left:-20%;} a:hover:after{right:-20%;} a:before{ left:-100%; } ...

  2. (转)linux内核虚拟文件系统浅析【转】

    转自:https://www.cnblogs.com/woainilsr/p/3590716.html 转自http://hi.baidu.com/_kouu/item/4e9db8758032824 ...

  3. C语言之double

    #include<stdio.h> int main(void) { printf("请分别输入身高的英尺和英寸,""如输入\"5 7\" ...

  4. java修饰符的总结

    引言:Java的修饰符根据修饰的对象不同,分为类修饰符.方法修饰符.变量修饰符,其中每种修饰符又分为访问控制修饰符和非访问控制修饰符.访问控制存在的原因:a.让客户端程序员无法触及他们不应该触及的部分 ...

  5. k8s集群搭建 2019

    参考,https://github.com/qxl1231/2019-k8s-centos 事实上k8s集群的搭建很简单,笔者在搭建的过程中遇到的主要问题是镜像无法下载的问题. 如果发现教程中提供的镜 ...

  6. ubuntu16.04安装docker图形管理界面portainer

    下载镜像 docker pull portainer/portainer 单机版运行 docker run -d --name portainer \ -p 9000:9000 \ --restart ...

  7. Associatively Segmenting Instances and Semantics in Point Clouds

    论文引入一个简单且灵活的框架同时分割点云中的实例和语义,进一步提出两种方法让两个任务从彼此受益. 代码: https://github.com/WXinlong/ASIS 论文: https://ar ...

  8. Python-numpy包中多维数组转置,transpose.swapaxes的轴编号(axis)的理解

    transpose()中三个轴编号的位置变化理解 transpose(a,b,c)其中a轴编号即为参考编号,垂直于a的平面即为所有平面,该平面上的数据再根据b,c相对于(0,1,2)的位置关系进行改变 ...

  9. bdd框架之lettuce

    安装 执行 :lettuce  (需要在特定的文件夹下) 结果指定到文件中

  10. Large Margin Softmax Loss for Speaker Verification

    [INTERSPEECH 2019接收] 链接:https://arxiv.org/pdf/1904.03479.pdf 这篇文章在会议的speaker session中.本文主要讨论了说话人验证中的 ...