深入V8引擎-初始化之InitPlatform
上一篇其实想讲初始化的第二步,但是内容比较无聊,所以换了一个话题,谈了谈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的更多相关文章
- 深入V8引擎-初始化默认Platform
本来寻思着写一篇"'Hello' + ', World'"是怎么从JS代码编译然后输出的,然而compile过程的复杂性远超我的想象,强上怕会走火入魔,还是老老实实先回家种田,找点 ...
- 浅谈V8引擎中的垃圾回收机制
最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...
- 精读《V8 引擎 Lazy Parsing》
1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...
- google v8引擎常见问题
最近在项目中使用v8来进行扩展,下面简单说一下使用v8过程中遇到的一些问题. v8的多线程调用 最初调研v8的测试代码是单线程的,后来一个项目在多线程中使用,出现了一些问题,后来看到参考3中的才恍 ...
- Javascript的V8引擎研究
1.针对上下文的Snapshot技术 什么是上下文(Contexts)?实际是JS应用程序的运行环境,避免应用程序的修改相互影响,例如一个页面js修改内置对象方法toString,不应该影响到另外页面 ...
- Google V8 引擎 原理详解
V8 引擎概览 V8 引擎简介 Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流 操作系统中,甚至可以运行在移动终端 ( 基于 ARM ...
- JavaScript工作机制:V8 引擎内部机制及如何编写优化代码的5个诀窍
概述 JavaScript引擎是一个执行JavaScript代码的程序或解释器.JavaScript引擎可以被实现为标准解释器,或者实现为以某种形式将JavaScript编译为字节码的即时编译器. 下 ...
- Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...
- V8 引擎是如何工作的?
V8 引擎是如何工作的? 本文翻译自:How the V8 engine works? V8是谷歌德国开发中心构建的一个JavaScript引擎.它是由C++编写的开源项目,同时被客户端(谷歌浏览 ...
随机推荐
- Arthas实践--抽丝剥茧排查线上应用日志打满问题
现象 在应用的 service_stdout.log里一直输出下面的日志,直接把磁盘打满了: 23:07:34.441 [TAIRCLIENT-1-thread-1] DEBUG io.netty.c ...
- Linux计划任务,定时清空日志
以Ubuntu为例,利用系统自带计划任务,即cron ,计划任务,是任务在约定的时间执行已经计划好的工作,这是表面的意思.在Linux中,我们经常用到 cron 服务器来完成这项工作.cron服务器可 ...
- 一条SELECT查询语句在数据库里执行时都经历了什么
每天都在跟 mysql 打交道,你知道执行一条简单的 select 语句,都经历了哪些过程吗? 首先,mysql 主要是由 server 层和存储层两部分构成的.server 层主要包括连接器.查询缓 ...
- Docker容器服务(三)
一.创建容器 容器是Docker的另一个核心概念. 简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层. 1.1创建一个容器 使用docker create命令创建的容器处于停止状 ...
- 未加载opencv_world330.pdb
根据设置下载对应的pdb文件. 无法查找或打开pdb文件
- 如何隐藏WooCommerce Shop Page页面的标题
有时我们不想显示WooCommerce Shop Page页面标题,如下图所示,需要如何操作呢?随ytkah一起来看看吧.在主题function.php文件中添加下面的代码就可以隐藏了 add_fil ...
- JDOJ 2174 忠诚
JDOJ 2174 忠诚 https://neooj.com/oldoj/problem.php?id=2174 洛谷 P1816 忠诚 https://www.luogu.org/problemne ...
- ibatis<iterate>标签
<iterate property="" 从传入的参数集合中使用属性名去获取值, 这个必须是一个List类型, 否则会出现OutofRangeException, ...
- Spring Cloud版本 version命名说明 (Edgware)
Spring Cloud版本 version命名说明 (Edgware) 版权声明:guofangsky 版权所有,转载不究. https://blog.csdn.net/guofangsky/a ...
- ESP8266 AT指令开发(基于STC89C52单片机): 硬件使用说明
实物图 硬件说明 开发板板载说明: 1.主控芯片: STC89C52 2.Wi-Fi模块: ESP8266 3.温湿度传感器: DHT11 4.液晶屏: IIC OLED 5.继电器: 220V 10 ...