第一次看到 Iterator.range 提案和其中的算法时,我不确定我是否能够破解它。作为 Outreachy 贡献者,我和其他贡献者将贡献一个月,然后将选择一名实习生来处理提案/规范。
贡献期的几天后,我被分配了指定给 Outreachy 贡献者的任务,但最重要的是,我被分配了 ErrorIsError TC39 提案。
在 SpiderMonkey(Mozilla JavaScript 引擎)中实现 TC39 提案的第一步是为其添加首选项。
这允许在运行时启用或禁用该功能,这很重要,因为我们不想默认启用某个功能,除非我们对其进行了足够的测试以确信它不会给我们的用户带来问题。在本例中,我们创建一个首选项并将值设置为 false。
如您所见,当使用 JavaScript 实现时,该提案非常简单,并且是最初的实现。然而,代码审查回来了,最好将提案实现为原生 C 函数,这对我来说是一个学习过程,无论是原因还是使用 C 。
在此过程中,我们遇到了一些有趣的挑战,涉及 JavaScript 引擎中的跨隔室包装器 (CCW) 和内部类型检查。
处理 Error 对象时,IsErrorObject 函数确定给定值是否是 ErrorObject 类型的实例。然而,当参数是来自另一个隔间的 ErrorObject 的跨隔间包装器 (CCW) 时,就会出现关键的边缘情况。 IsErrorObject 检查不直接考虑 CCW,因为它们掩盖了底层对象。
实现上下文: 在处理内部类型检查的代码中,intrinsic_IsInstanceOfBuiltin 函数用于检查对象是否属于特定类型。虽然它在应用于 this 值时有效;假设它已经打开;它不处理可能仍由 CCW 包装的参数。
为了解决这个问题,解决方案包括:
1.添加新的本机函数: 创建专用本机函数来透明地处理 CCW:
2。消除自托管的复杂性:
通过将这个新函数实现为 JSNative,我们可以简化流程,在单个本机函数中执行所有操作,而无需依赖自托管帮助程序。
处理非对象情况:新函数集成了在继续解包之前检查该值是否为对象的功能。
简化规范对齐:由于 CCW 是实现细节,而不是 TC39 JavaScript 规范的一部分,因此这些更改可确保行为与规范保持一致,同时避免差异。
上面包含 45 行代码,不包括两个测试文件:一个用于 JIT(即时)编译测试,另一个用于 Test262 测试/文件。然而,通过这 45 行代码,我能够:
在我的 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 返回的生成器的原型。
我接下来几周/几个月的工作包括但不限于:
解码开源:我在外展之旅中学到的词汇
想要进行自由软件的远程实习吗?
以上是导航 TCPProposals:从错误处理到 Iterator.range的详细内容。更多信息请关注PHP中文网其他相关文章!