Chromium 如何查找V8 引擎中JavaScript 标准内置对象

JavaScript 标准内置对象 - JavaScript | MDN (mozilla.org)

一、JavaScript 标准内置对象

本章介绍和说明了 JavaScript 中所有的标准内置对象、以及它们的方法和属性。

这里的术语“全局对象”(或标准内置对象)不应与 global 对象混淆。这里的“全局对象”指的是处在全局作用域里的多个对象

global 对象可以在全局作用域里通过使用 this 访问到(但只有在 ECMAScript 5 的非严格模式下才可以,在严格模式下得到的是 undefined)。其实全局作用域包含全局对象中的属性,包括它可能继承来的属性。

全局作用域中的其他对象则可由用户的脚本创建,或由宿主程序提供。浏览器环境中所提供的宿主对象的说明可以在这里找到:API 参考。

要了解关于 DOM 和核心 JavaScript 之间区别的更多信息,可参阅 JavaScript 技术概述。

 更多参考:JavaScript 标准内置对象 - JavaScript | MDN (mozilla.org)

二、JavaScript 标准内置对象在v8中位置如下:

以JSON内置对象为例:

 四个方法

  1. JSON.isRawJSON()
  2. JSON.parse()
  3. JSON.rawJSON()
  4. JSON.stringify()

所有v8内置对象都在此文件内:v8\src\init\bootstrapper.cc

1、 截取JSON对象注册部分

 (v8\src\init\bootstrapper.cc)

  {  // -- J S O NHandle<JSObject> json_object =factory->NewJSObject(isolate_->object_function(), AllocationType::kOld);JSObject::AddProperty(isolate_, global, "JSON", json_object, DONT_ENUM);SimpleInstallFunction(isolate_, json_object, "parse", Builtin::kJsonParse,2, false);SimpleInstallFunction(isolate_, json_object, "stringify",Builtin::kJsonStringify, 3, true);InstallToStringTag(isolate_, json_object, "JSON");native_context()->set_json_object(*json_object);}

2、JSON.parse等调用在

 src\v8\src\builtins\builtins-json.cc

// ES6 section 24.3.1 JSON.parse.
BUILTIN(JsonParse) {HandleScope scope(isolate);Handle<Object> source = args.atOrUndefined(isolate, 1);Handle<Object> reviver = args.atOrUndefined(isolate, 2);Handle<String> string;ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, string,Object::ToString(isolate, source));string = String::Flatten(isolate, string);RETURN_RESULT_OR_FAILURE(isolate, String::IsOneByteRepresentationUnderneath(*string)? JsonParser<uint8_t>::Parse(isolate, string, reviver): JsonParser<uint16_t>::Parse(isolate, string, reviver));
}// ES6 section 24.3.2 JSON.stringify.
BUILTIN(JsonStringify) {HandleScope scope(isolate);Handle<Object> object = args.atOrUndefined(isolate, 1);Handle<Object> replacer = args.atOrUndefined(isolate, 2);Handle<Object> indent = args.atOrUndefined(isolate, 3);RETURN_RESULT_OR_FAILURE(isolate,JsonStringify(isolate, object, replacer, indent));
}// https://tc39.es/proposal-json-parse-with-source/#sec-json.rawjson
BUILTIN(JsonRawJson) {HandleScope scope(isolate);Handle<Object> text = args.atOrUndefined(isolate, 1);RETURN_RESULT_OR_FAILURE(isolate, JSRawJson::Create(isolate, text));
}// https://tc39.es/proposal-json-parse-with-source/#sec-json.israwjson
BUILTIN(JsonIsRawJson) {HandleScope scope(isolate);Handle<Object> text = args.atOrUndefined(isolate, 1);return isolate->heap()->ToBoolean(IsJSRawJson(*text));
}

3、JSON对象实现部分:

v8\src\json\json-parser.h

v8\src\json\json-parser.cc

  V8_WARN_UNUSED_RESULT static MaybeHandle<Object> Parse(Isolate* isolate, Handle<String> source, Handle<Object> reviver) {HighAllocationThroughputScope high_throughput_scope(V8::GetCurrentPlatform());Handle<Object> result;MaybeHandle<Object> val_node;{JsonParser parser(isolate, source);ASSIGN_RETURN_ON_EXCEPTION(isolate, result, parser.ParseJson(reviver),Object);val_node = parser.parsed_val_node_;}if (IsCallable(*reviver)) {return JsonParseInternalizer::Internalize(isolate, result, reviver,source, val_node);}return result;}

3、运行测试用例看下调用堆栈:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body><h2>为 JSON 字符串创建对象</h2>
<p id="demo"></p>
<script>
var text = '{ "sites" : [' +'{ "name":"Runoob" , "url":"www.runoob.com" },' +'{ "name":"Google" , "url":"www.google.com" },' +'{ "name":"Taobao" , "url":"www.taobao.com" } ]}';obj = JSON.parse(text);
document.getElementById("demo").innerHTML = obj.sites[1].name + " " + obj.sites[1].url;
</script></body>
</html>

三、总结:

 1、所有JavaScript内置对象都在v8\src\init\bootstrapper.cc里面注册,直接在此文件搜前端对象字符串即可。eg:“JSON”

2、注册的对象会在src\v8\src\builtins目录下生成对应文件:

 src\v8\src\builtins目录下的文件对应该对象的源码实现关系:

例如:

BUILTIN(JsonParse) {JSON.parse} 调用 JsonParser<uint8_t>::Parse 就可以找到最终解析json源码

v8\src\json\json-parser.h

v8\src\json\json-parser.cc

// ES6 section 24.3.1 JSON.parse.
BUILTIN(JsonParse) {HandleScope scope(isolate);Handle<Object> source = args.atOrUndefined(isolate, 1);Handle<Object> reviver = args.atOrUndefined(isolate, 2);Handle<String> string;ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, string,Object::ToString(isolate, source));string = String::Flatten(isolate, string);RETURN_RESULT_OR_FAILURE(isolate, String::IsOneByteRepresentationUnderneath(*string)? JsonParser<uint8_t>::Parse(isolate, string, reviver): JsonParser<uint16_t>::Parse(isolate, string, reviver));
}

3、附上v8介绍官网CodeStubAssembler 内置 ·V8 系列

    此链接是在v8添加一个内置函数例子。或者直接搜索SimpleInstallFunction也可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/445470.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

出海快报 | “三消+短剧”手游横空出世,黄油相机“出圈”日本市场,从Q1看日本手游市场趋势和机会

编者按&#xff1a;TopOn出海快报栏目为互联网出海从业者梳理出海热点&#xff0c;供大家了解行业最新发展态势。 1.“三消短剧”横空出世&#xff0c;融合创新手游表现亮眼 随着竞争的加剧&#xff0c;新产品想要突出重围&#xff0c;只能在游戏中加入额外的元素。第一次打开…

Spring Boot项目的创建与使用

1.SpringBoot初识 SpringBoot是什么 介绍 ​ 为了简化 Spring 应用的搭建和开发过程&#xff0c;Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架&#xff0c;它就是 Spring Boot。 Spring Boot是由Pivotal团队提供的全新&#xff0c;其设计目的是用来新应用的初始…

Java JWT:原理、机制及案例示范

一、什么是JWT&#xff1f; 1.1 JWT的基本概念 JWT&#xff08;JSON Web Token&#xff09;是一种用于在各方之间传递JSON格式信息的紧凑、URL安全的令牌&#xff08;Token&#xff09;。JWT的主要作用是验证用户身份或权限。它由三部分组成&#xff1a; Header&#xff08;…

Ubuntu 上安装 MySQL 并且实现远程登录

目录 1. 安装MySQL 2. 安全配置MySQL 3. 配置MySQL远程登录 3.1. 允许远程连接 3.2. 重启MySQL服务 3.3. 为用户分配远程访问权限 进入MySQL后&#xff0c;执行以下命令&#xff1a; 3.4. 创建新用户 3.5. 授予权限 3.6. 刷新权限 3.7. 退出 MySQL 控制台 4. 配置防火…

大数据新视界 --大数据大厂之大数据驱动下的物流供应链优化:实时追踪与智能调配

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

科研绘图系列:R语言蝴蝶图(Butterfly Chart)

文章目录 介绍加载R包数据函数画图系统信息介绍 蝴蝶图(Butterfly Chart),也被称为龙卷风图(Tornado Chart)或双轴图(Dual-Axis Chart),是一种用于展示两组对比数据的图表。这种图表通过在中心轴两侧分别展示两组数据的条形图,形似蝴蝶的翅膀,因此得名。蝴蝶图的特点…

汉语言文学做大数据七年实际工作经验分享普通人快来围观

&#xff08;一&#xff09;没有人带你 社会上&#xff0c;都很现实。就是进了公司&#xff0c;有师傅&#xff0c;师傅也没空带你&#xff0c;最多就是有空的时候帮你解决问题。 无论是做啥工作&#xff0c;都要靠自己努力。努力不会成为笑话&#xff0c;不努力就是笑话。就…

STM32 QSPI接口驱动GD/W25Qxx配置简要

STM32 QSPI接口GD/W25Qxx配置简要 &#x1f4dd;本篇会具体涉及介绍Winbond&#xff08;华邦&#xff09;和GD(兆易创新) NOR flash相关型号指令差异。由于网络上可以搜索到很多相关QSPI相关知识内容&#xff0c;不对QSPI通讯协议做深度解析。 &#x1f516;首先确保所使用的ST…

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…

闯关leetcode——88. Merge Sorted Array

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/merge-sorted-array/description/ 内容 You are given two integer arrays nums1 and nums2, sorted in non-decreasing order, and two integers m and n, representing the number of elements …

为什么人工智能用 Python?

人工智能领域倾向于使用Python&#xff0c;主要归因于Python的多个显著优势&#xff1a; 简洁性与可读性&#xff1a;Python的语法设计简洁明了&#xff0c;代码易于阅读和理解&#xff0c;这对于涉及复杂算法和逻辑的人工智能项目尤为重要。它降低了编程门槛&#xff0c;使得…

Unity3D 单例模式

Unity3D 泛型单例 单例模式 单例模式是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c;提供访问实例的全局节点。 通常会把一些管理类设置成单例&#xff0c;例如 GameManager、UIManager 等&#xff0c;可以很方便地使用这些管理类单例&#xff0c;…

DGX的优势

NVIDIA DGX 的 AI 领导力 文章目录 前言一、概述推动跨行业的 AI 创新二、优势客户体验到哪些好处?1. 利用生成式 AI 释放研究人员的潜力2. 加快现代应用程序的上市时间3. 利用 AI 改善客户体验三、性能性能很重要1. 为世界上最先进的超级计算机提供动力2. 打破世界纪录3. 提高…

Go编译为可执行文件

在window下打包成其他系统可运行的文件 1.在window下打包成window下可执行文件 在项目main.go同级目录下&#xff0c;逐条执行以下命令 set CGO_ENABLED0 set GOOSwindows set GOARCHamd64 go build -o main-windows.exe main.go 2.在window下打包成linux 在项目main.go同级目…

Python从入门到高手6.3节-字符串操作方法

目录 6.3.1 字符串常用操作方法 6.3.2 获取字符串长度 6.3.3 字符串的大小写操作 6.3.4 删除字符串中的指定字符 6.3.5 字符串的子串查找 6.3.6 字符串的子串统计 6.3.7 字符串的子串替换 6.3.8 字符串的拆分函数 6.3.9 字符串的前缀与后缀 6.3.10 你一定要成为高手 …

FLINK内存管理解析,taskmanager、jobmanager

1、在 Flink 中设置内存的方法是配置以下两个选项之一&#xff1a; 1&#xff09;Total Flink memory&#xff1a;taskmanager.memory.flink.sizejobmanager.memory.flink.size 2&#xff09;Total process memory&#xff1a;taskmanager.memory.process.sizejobmanager.mem…

Linux驱动开发(速记版)--设备模型

第八十章 设备模型基本框架-kobject 和 kset 80.1 什么是设备模型 设备模型使Linux内核处理复杂设备更高效。 字符设备驱动适用于简单设备&#xff0c;但对于电源管理和热插拔&#xff0c;不够灵活。 设备模型允许开发人员以高级方式描述硬件及关系&#xff0c;提供API处理设备…

vue3学习之插槽slot

关于slot web组件内部的占位符&#xff0c;可以使用自己的标记填充这个占位符 &#xff0c;具名插槽就是在slot标签上添加name属性&#xff08;https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/slot&#xff09; vue3官方文档&#xff1a;https://cn.vuejs.org/gui…

论文阅读 BLIP-2

Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 使用冻结的图像编码器和大型语言模型进行语言-图像预训练的引导 BLIP-2 通过一个轻量级的查询变换器弥合了模态之间的差距。 Querying Transformer 第一阶段通过冻结的图像编…

构建流媒体管道:利用 Docker 部署 Nginx-RTMP 从 FFmpeg RTMP 推流到 HLS 播放的完整流程

最近要实现一个类似导播台的功能&#xff0c;于是我先用 FFmpeg 实现一个参考对照的 Demo&#xff0c;我将其整理为一篇文章&#xff0c;方便后续大家或者和自己参考&#xff01; 1、软件工具介绍 本次部署相关软件 / 工具如下&#xff1a; FFmpeg&#xff1a;全称是 Fast Fo…