导航 TCPProposals:从错误处理到 Iterator.range
实习生的 SpiderMonkey 和 JavaScript 引擎增强之旅
第一次看到 Iterator.range 提案和其中的算法时,我不确定我是否能够破解它。作为 Outreachy 贡献者,我和其他贡献者将贡献一个月,然后将选择一名实习生来处理提案/规范。
前言
贡献期的几天后,我被分配了指定给 Outreachy 贡献者的任务,但最重要的是,我被分配了 ErrorIsError TC39 提案。
在 SpiderMonkey(Mozilla JavaScript 引擎)中实现 TC39 提案的第一步是为其添加首选项。
这允许在运行时启用或禁用该功能,这很重要,因为我们不想默认启用某个功能,除非我们对其进行了足够的测试以确信它不会给我们的用户带来问题。在本例中,我们创建一个首选项并将值设置为 false。
如您所见,当使用 JavaScript 实现时,该提案非常简单,并且是最初的实现。然而,代码审查回来了,最好将提案实现为原生 C 函数,这对我来说是一个学习过程,无论是原因还是使用 C 。
在此过程中,我们遇到了一些有趣的挑战,涉及 JavaScript 引擎中的跨隔室包装器 (CCW) 和内部类型检查。
跨隔室包装器和 ErrorObject 检查的问题
处理 Error 对象时,IsErrorObject 函数确定给定值是否是 ErrorObject 类型的实例。然而,当参数是来自另一个隔间的 ErrorObject 的跨隔间包装器 (CCW) 时,就会出现关键的边缘情况。 IsErrorObject 检查不直接考虑 CCW,因为它们掩盖了底层对象。
实现上下文: 在处理内部类型检查的代码中,intrinsic_IsInstanceOfBuiltin 函数用于检查对象是否属于特定类型。虽然它在应用于 this 值时有效;假设它已经打开;它不处理可能仍由 CCW 包装的参数。
建议的解决方案:专用的本机函数
为了解决这个问题,解决方案包括:
1.添加新的本机函数: 创建专用本机函数来透明地处理 CCW:
- 打开特定常规武器。
- 测试展开的对象是否属于 ErrorObject 类型。
- 在一个内聚操作中验证对象类型。
2。消除自托管的复杂性:
通过将这个新函数实现为 JSNative,我们可以简化流程,在单个本机函数中执行所有操作,而无需依赖自托管帮助程序。
为什么采用这种方法?
处理非对象情况:新函数集成了在继续解包之前检查该值是否为对象的功能。
简化规范对齐:由于 CCW 是实现细节,而不是 TC39 JavaScript 规范的一部分,因此这些更改可确保行为与规范保持一致,同时避免差异。
上面包含 45 行代码,不包括两个测试文件:一个用于 JIT(即时)编译测试,另一个用于 Test262 测试/文件。然而,通过这 45 行代码,我能够:
- 了解预定义错误消息在 Mozilla 代码库中的位置以及如何使用它们。当我需要为 Iterator.range 定义错误消息时,这被证明很方便。
- 了解夜间和夜间构建。
- 代码一致性:定制我的代码以满足 TC39 规范,并避免按照 Mozilla 标准对新添加的代码进行简写。
我目前正在做的事情:Iterator.range
在我的 Outreachy 贡献期间深入研究了跨隔室包装器的复杂性并增强了 ErrorObject 处理之后,我将注意力转向了同样令人兴奋的事情:我的 Mozilla Outreachy 实习的 Iterator.range 提案。
对于那些不熟悉的人来说,Iterator.range 是 JavaScript TC39 提案的补充,旨在使迭代器更加通用。此方法引入了一种生成值范围的有效方法,这在日常编程中特别有用,例如迭代数字序列或创建基于步骤的循环。
这个概念本身可能看起来很简单;从起点到终点生成一系列值,但在 SpiderMonkey 中实现它被证明是一个巨大的挑战。
与之前的 ErrorObject 工作不同,Iterator.range 需要深入了解 JavaScript 迭代器的内部工作方式以及 SpiderMonkey 如何在引擎级别集成这些功能。
当我开始研究 Iterator.range 时,与我为 ErrorIsError 提案所做的类似的初始实现 - 已经完成,即;添加对提案的首选项并使内置可在 JavaScript shell 中访问。
Iterator.range 只是返回 false,这是一个存根,表明 Iterator.range 的实际实现正在开发中或尚未完全实现,这就是我进来的地方。
首先,我创建了一个 CreateNumericRangeIterator 函数,该函数委托给 Iterator.range 函数。接下来,我在 Iterator.range 函数中实现了前三个步骤。
接下来,我在 CreateNumericRangeIterator 函数中初始化了 NUMBER-RANGE 数据类型的变量和参数。
我专注于实现加一的序列,例如 Iterator.range(0, 10)。我还更新了 CreateNumericRangeIterator 函数,以使用适当的参数调用 IteratorRangeGenerator(它处理 Range Proposal 规范的步骤 18),与规范的步骤 19 保持一致,并添加了测试来验证其功能。
本周,我正在探索如何正确设置 Iterator.range 返回的生成器的原型。
我接下来几周/几个月的工作包括但不限于:
- 为 Iterator.range 返回的生成器设置正确的原型。
- Iterator.range 支持 BigInt。
- 支持其他序列,因为我目前只介绍了加一的序列。
- 为上述内容添加足够的测试。
您可能还喜欢:
解码开源:我在外展之旅中学到的词汇
想要进行自由软件的远程实习吗?
以上是导航 TCPProposals:从错误处理到 Iterator.range的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

JavaScript在网站、移动应用、桌面应用和服务器端编程中均有广泛应用。1)在网站开发中,JavaScript与HTML、CSS一起操作DOM,实现动态效果,并支持如jQuery、React等框架。2)通过ReactNative和Ionic,JavaScript用于开发跨平台移动应用。3)Electron框架使JavaScript能构建桌面应用。4)Node.js让JavaScript在服务器端运行,支持高并发请求。
