V8 Binding 笔记

JS Binding 技术(1) Lynx 作为一个基于 JavaScript 语言(后续简称 JS )的跨平台开发框架,与 JS 的通信是”与生俱来”的,框架和 JS 引擎打交道是必不可少的能力。JS 引擎提供了 Extension 功能,提供接入方间接和 JS 通信的桥梁,Lynx 的 JS Binding 正是基于这个能力进行了封装,构建一套基础的 JS API,将能力开放给前端开发者。 阅读详情

读于此:https://docs.google.com/presentation/d/1OFG81taxgjOGU43sv9WHvPZkt5--KnM6gSijWN8NMcU/edit?disco=AAAAAECHbXY&pli=1#slide=id.p


Web IDL定义了DOM(Webkit) 与 ECMAScript(V8, JavaScriptCore, ObjectC,GObject,CPP)的绑定规范。
如何添加一个 新的绑定,有三个步骤:
假如实现了HTMLElement
Step1:需要在WebKit中实现HTMLElement
-WebCore/html/HTMLElement.{h,cpp}, etc
Step2:需要编写一个相应的IDL 文件
-WebCore/html/HTMLElement.idl
Step3:Build 绑定代码会自动生成。

e.g

Step1: Write an IDL file

//Node.idl
interface Node{
  attribute Node firstChild;
  ...;
};

Step2: generate the binding code
-Perl scripts in WebCore/binding/scripts parse the IDL file and auto-generate the binding code

IDL files CodeGeneratorV8.pm *.h,*.cpp
    | CodeGeneratorJS.pm *.h,*.cpp IDLParser.pm-> CodeGeneratorObjC.pm *.h,*.cpp
CodeGeneratorGObject.pm *.h,*.cpp
CodeGeneratorCPP.pm *.h,*.cpp

Step3:

-An example of the generate code
//V8 calls back this method when div.firstChild is evaluated
static v8:Handle<v8::Value>
firstChildAttrGetter(..., const v8::AccessorInfo& info)
{
	//Retrieve a Dom object from a V8 object.
	Node* imp = V8Node::toNative(info.Holder());
	//Call a WebKit method.
	Node* firstChild = imp->firstChild();
	//Convert a DOM object to a V8 object, and return.
	return toV8(firstChild, ...);
}


********************************
Where you should check.
-IDL parser:
-WebCore/bindings/scripts/IDLParser.pm
-Code generators:
-WebCore/bindings/scripts/CodeGenerator{V8,JS,ObjeC,GObject,CPP}.pm
-Helper Perl scripts:
WebCore/bindings/scripts/*.pm


-Generated code for V8:
-src/out/{Release,Debug}/obj/gen/webkit/bindings/*.h
-src/out/{Release,Debug}/obj,gen/webcore/bindings/*.cpp
*************************
V8 Data 
v8::Handle<v8::Value> value;
v8:Value==> Data Type: Value, Integer, Boolean, String, Object, Function or ...etc
v8:Handle==>Data allocated: Handle, Local, Persistent.


当使用V8 传递数据时,数据类型尽量使用Value,容器尽量使用Handle,也就是说尽量使用
V8::Handle<v8::Value>
容器:
1) Local 
-Will be auto-deallocated when the current scope exits
-Don't hold the Local data on heap
2)Persistent
-Never deallocated unless you explicitly call Persistent::Dispose()
-Persistent::New() must be balanced with Persistent::Dispose()
3)Handle 是Local 与 Persistent 的父类


数据类型: Value 是根类
Object 和 Primitive 继承于Value
Object 包含:Array, Function, Date, RegExp, BooleanObject, StringObject and NumberObject
Primitive 包含:Boolean, Number, String, Integer, Int32 and Uint32

Summary
V8 API Document in v8.h 

V8 utility methods are documented in V8Binding.h

DOM Object:

V8XXX::toNative(): Wrapper => DOM
toV8(): DOM => Wrapper

Garbage Collection
V8/JSC knows te JavaScript object graph only
WebKit knows the DOM trees only
Bindings are responsible for managing the relationship between the two graphs.

How to tell the reachability to V8
(1) Override visitDOMWrapper() in your custom binding

(2) Add the reachability by v8::V8::AddImplicitReferences()

void V8NodeList::visitDOMWrapper(DOMDataStore* store, void* object, v8::Persistent<v8::Object> wrapper) {
  NodeList* impl = static_cast<NodeList*>(object);
  Node* owner = ... // Get the owner Node of impl
  v8::Persistent<v8::Object> ownerWrapper = ... // Get the wrapper object of owner
  if (/* the wrapper object exists */)
   v8::V8::AddImplicitReferences(ownerWrapper, &wrapper, 1);
}

You need to add the references by visitDOMWrapper() and AddImplicitReferences()


V8 GC Design

Redesigning V8 Garbage Collection for DOM Objects
https://docs.google.com/document/d/1OMG0fXB3DDvBaQ2YgxWLzzKjn9nWp8y_oTdQqFkBWhw/edit?pli=1
webkit如何实现JS DOM binding—基于V8分析 一个web页面需要使用到JS的场景 Parser阶段 HTMLDocumentParser 中的HTMLTokenizer在解析到开始标签时,创建HTMLScriptElement对象,在解 析时,开始解析JS代码啊,如果中含有src,那么发出一个异步请求(在异步请求过程中,parser会中断,等待JS的解析结果,期间Webkit会来做一些 DNS预取,资源预解析等工作,总之WebKi 阅读详情

相关推荐

V8 Binding Explained

本ppt讲解了v8 javascript引擎和webkit内核绑定的原理,以及v8引擎的一些知识。

V8引擎之Binding

继上文 ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode)这个函数算是正式脱离webcore进入bingding模块了。先看下这个函数,再分析 // Evaluate a script file in the environment of this proxy. ScriptValue Scri

一天 一小步 1856

HT7533与1117稳压芯片动态特性对比:实测分析与优化策略

本文深入对比了HT7533与1117稳压芯片的动态特性,包括电压过冲和瞬态响应能力,并提供了实测数据与优化策略。HT7533适合低功耗设备,而1117在大电流和稳定性要求高的场景表现更优。文章还分享了PCB布局和电容选择的实用建议,帮助工程师根据项目需求选择合适的稳压芯片。

weixin_28454475的博客 610

Rusty V8 Binding:为Rust开发者解锁V8引擎的强大力量

**Rusty V8 Binding** 是一个为Rust语言提供的高质量V8引擎绑定库。V8引擎是Google开发的高性能JavaScript和WebAssembly引擎,广泛应用于Chrome浏览器和其他JavaScript运行时环境中。Rusty V8 Binding的目标是为Rust开发者提供一个与V8 C++ API紧密匹配的接口,同时确保不引入额外的调用开销。 ## 项目技术分析 ...

gitblog_00004的博客 467

什么是plm系统?-数字化转型网

当今世界,产品研发能力是企业在激烈的市场竞争中保持战略优势的核心竞争力之一。如何有效地缩短产品研发周期、改善产品服务的设计迭代流程、有效降低产品的研发成本,也是企业面临的主要问题之一。PLM(Product Lifecycle Management,产品生命周期管理)在优化产品研发的全管理流程、增强企业产品的市场竞争力方面具有关键的作用。

cxo17757154043的博客 883

pandas,构造MultiIndex的四种方法:from_tuples、from_arrays、from_product、from_frame

1、from_tuples:通过 “元组对” 构造MultiIndex """ 一对元组,为一个索引 """ tuples = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')] pd.MultiIndex.from_tuples(tuples, names=('number', 'color')) 2、from_arrays:通过 “列表元素的组合” 构造MultiIndex """ 列中表的元素,按位置 对应组合,形成索引 """ arrays

jieru_liu的博客 5387

V8引擎之从webcore到V8

这里不想讲什么是V8,请自行百度。自己搞webkit,故以后的V8学习研究都是基于webkit与V8的结合(目前没有研究blink,仅仅是把webkit官方的JavaScriptCore引擎换作了V8),不是纯粹的V8。 这里仅介绍从webcore的入口处 1.先从webcore的js入口说起,在html词法解析的时候,有一个这个函数: bool HTMLDocumentParser::ca

一天 一小步 1730

【MFRC522】STM32与MFRC522的SPI通信优化及常见问题解析

本文深入解析了STM32与MFRC522进行SPI通信的优化方法与常见问题。从基础的硬件连接到SPI时序优化,再到关键的寄存器配置(如RFCfgReg设为0x4F以提升读卡稳定性),文章提供了详细的调试技巧和实战排坑指南,帮助开发者实现稳定高效的IC读卡应用。

yhn45678901的博客 841

V8 引擎使用心得

<br /><br />在公司一直负责一个界面引擎的模块的设计开发工作,主要使用XML和JavaScript两种技术。<br />最初我们使用的是MS的JS引擎(由IActiveScript及一些相关接口组成,下称MS-JS),后来由于一些问题,将MS-JS替换成Google才推出不久的JS引擎V8(下称V8-JS)。<br />MS-JS不知道多久没更新了,不过也还好用,文档写得也清楚。<br />V8-JS是Google的Chrome浏览器中的一个亮点,刚推出不久,还在不断更新中,性能据说比MS的高过不

king_road的专栏 1999

全面解析量化价值投资多因子模型的原理

明明知道“买便宜的好公司”是价值投资的核心,但面对3000+只A股,如何快速筛选出“便宜又好”的标的?主观判断总被情绪干扰——明明PE很低的股票,买了却不涨;或者因为“感觉”错过牛股?想规模化投资,但手动分析100只股票就要花一周,根本无法覆盖全市场?量化价值投资的多因子模型,正是解决这些问题的钥匙。它将价值投资的核心逻辑(“便宜”“好公司”)转化为可量化的因子,用数学模型替代主观判断,实现系统化筛选、可回测验证、规模化复制的投资决策。为什么多因子模型能有效预测股票收益?

AI天才研究院 1058

主成分分析(Principal Component Analysis,PCA)

主成分分析1.主成分分析1.1 降维(Dimensionality Reduction)1.2 均值(Mean)1.3 方差(Variance)1.4 协方差(Covariance)1.5 协方差矩阵(Covariance Matrix)1.6 线性变换(Linear Transformation)1.7 主成分分析(PCA)1.8 PCA和SVD的关系 1.主成分分析 关于PCA的介绍:用最直观的方式告诉你:什么是主成分分析PCA 笔记来源:Principal Component Analysis (PC

一个搬运知识的笨小孩 3230

Google V8编程详解(五)JS调用C++

最近由于忙着解决个人单身的问题,时隔这么久才更新第五章。 上一章主要讲了Google V8的Context概念。那么其实Google V8的基本概念还有FunctionTemplate, ObjectTemplate等比较重要的基本概念,这些概念将在后续章节中进行渗透。 本章主要来讲讲如何通过V8来实现JS调用C++。JS调用C++,分为JS调用C++函数(全局),和调用C++类。 JS调用

Legend(谭海燕)的专栏 3万+

Android功耗系列专题分析之四:待机概率性功耗高的失效分析

本文分析了Android设备待机功耗异常高的问题。通过日志发现系统休眠失败,原因是PowerManagerService.Display唤醒锁未被释放。进一步排查发现,指纹解锁功能在灭屏时未正确释放屏幕锁定,导致DisplayReady状态异常。解决方案是将指纹功能的背光控制与DisplayReady状态控制分离,使用两个变量独立管理。经验表明,快速定位问题比解决问题更重要,修改原生流程时需谨慎评估风险。

451

Google V8扩展利器发布:v8-native-binding-generator

用C++扩展Google V8很简单,但是类比较多时还是很烦的。前段时间开发cantk-runtime-v8时,我写了一个代码产生器v8-native-binding-generator,让扩展Google V8变得非常方便,甚至无需要了解V8本身。

国产开源 GUI 引擎 AWTK 9704

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Google V8扩展利器发布 v8-native-binding-generator

Google V8扩展利器发布 v8-native-binding-generator

jggyff的博客 625

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WebKit之如何实现JS DOM binding—基于V8分析

一个web页面需要使用到JS的场景 Parser阶段 HTMLDocumentParser 中的HTMLTokenizer在解析到开始标签时,创建HTMLScriptElement对象,在解 析时,开始解析JS代码啊,如果中含有src,那么发出一个异步请求(在异步请求过程中,parser会中断,等待JS的解析结果,期间Webkit会来做一些 DNS预取,资源预解析等工作,总之WebKi

1648

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深度解析qml引擎---(2)绑定(binding)

                                                      强烈的希望是人生中比任何欢乐更大的兴奋剂。——尼采 上一篇文章讲了QML引擎加载qml文件的过程,大体过程是,解析qml文件,然后为文件中的每个元素创建对应的c++对象。例如,qml文件中如果使用了Text类型,引擎会创建对应的QQuickText类的实例。 qml文件被引擎加载之后,在...

Peace 2721

从零开始的Android新项目8 - Data Binding高级篇

承接上篇,本篇继续讲解一些Data Binding更加进阶的内容,包括:列表绑定、自定义属性、双向绑定、表达式链、Lambda表达式、动画、Component注入(测试)等。Demo源码库:DataBindingSample。列表绑定App中经常用到列表展示,Data Binding在列表中一样可以扮演重要的作用,直接绑定数据和事件到每一个列表的item。RecyclerView过去我们往往会使用L

马克宅只是个码农 6406

控制网页frame vba_V8 bindings 设计isolate,context,world,frame之间的关系(翻译)

前言最近看了下V8 binding相关的技术文档,主要是学习下chrome如何使用V8的isolate和context,所以就看了下英文文档,顺便翻译一下。英文文档链接https://chromium.googlesource.com/chromium/src/+/master/third_party/blink/renderer/bindings/core/v8/V8BindingDesign....

weixin_39618121的博客 441

GO/Gin 使用自定义验证器 V8 V10

使用V8版本 package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "gopkg.in/go-playground/validator.v8" "net/http" "reflect" "time" ) //binding 绑定一些验证请求参数,自定义标签bookabledate表示可预约的时期 type Booking struct { CheckIn time.T

2166

v8插件编译使用

参考https://github.com/TooTallNate/node-gyp 目的通过c++扩展新模块。 例子代码  wget http://nodejs.org/dist/v0.8.8/node-v0.8.8.tar.gz           解压后在./node-v0.8.8/test/addons/hello-world  一、编写模块: 点击(此处)折叠或打

上善若水的专栏 1654
上一篇: 调试shell脚本
下一篇: sed 替换单引号问题
Superr爬爬虫
博客等级 码龄19年 72粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值