上一篇其实想讲初始化的第二步,但是内容比较无聊,所以换了一个话题,谈了谈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. springCloud搭建微服务集群+Zuul服务器端负载均衡

    概述 最近研究了一下springCloud的微服务集群,主要用到了SpringCloud的服务发现和服务器端负载均衡,所有的项目都是用的springboot,可以和springCloud无缝对接. 技 ...

  2. 8.了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?

    作者:中华石杉 面试题 了解什么是 redis 的雪崩.穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透? 面试官心理分析 其实这是问到缓存必问的,因为缓 ...

  3. 使用python实现后台系统的JWT认证

    介绍 JWT协议似乎已经应用十分广泛,JSON Web Token--一种基于token的json格式web认证方法.基本的原理是,第一次认证通过用户名密码,服务端签发一个json格式的token.后 ...

  4. 三层架构介绍和MVC设计模型介绍

    springmvc是什么? Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层 进行职责解耦,基于请 ...

  5. python 函数,模块知识点运用示例

    给定验证码长度n,生成随机验证码,验证码由数字.字母组成(参考chr()内置方法) # 给定验证码长度n,生成随机验证码,验证码由数字.字母组成(参考chr()内置方法) # 第33-126号(共94 ...

  6. centos用手机号无法登入安全狗的解决方法

    前面我们安装好了安全狗,需要加服务器加入服云中,通常用sdcloud –u 用户名就可以,但如果是手机号的话就可能无法登陆,我们用sdcloud -h命令查看帮助,如下图所示 我们看到输入账号可以用- ...

  7. eclipse打可运行的jar

    参考:https://www.cnblogs.com/wangzhisdu/p/7832666.html 用eclipse打包可运行的jar比较坑的地方: 3.1 从下拉框选择该jar的入口文件,即m ...

  8. Ant下载与安装

    1.登录http://ant.apache.org/bindownload.cgi 站点下载Ant最新版建议Windows平台下载*.zip压缩包 2.将下载到的压缩文件压缩到(G:software\ ...

  9. node端console.log输出不同颜色文字

    我们知道console.log直接输出是按着终端的默认颜色来显示的, console.log('message') 那么如何指定他们的颜色显示呢?很简单,直接再加一个参数就可以了,例如: consol ...

  10. VIJOS-P1450 包裹快递

    洛谷 P1542 包裹快递 https://www.luogu.org/problem/P1542 JDOJ 1527: VIJOS-P1450 包裹快递 https://neooj.com/oldo ...