gpt4 book ai didi

ruby - MRI 如何解析 `||=` 运算符?

转载 作者:数据小太阳 更新时间:2023-10-29 06:38:15 24 4
gpt4 key购买 nike

今天我试图向一位同事解释 ||= 在 MRI 中不是线程安全的。我想我应该看一下 Ruby 源代码,看看我是否可以指出 Ruby 调度程序可以切换线程上下文的位置,但是我在浏览代码时遇到了问题。我希望更有经验的人可以带我了解被命中的文件。

到目前为止,我知道 Bison 使用 parse.y 并生成一个调用一些底层函数的 parse.c 文件。我看到 || 被解析为 tOROP 但随后我对接下来发生的事情有点迷茫

另外,有没有像 Ripper 这样的工具可以让我更轻松地完成这个过程? (关于这一点,如果有人能指出 Ripper 源代码的定义位置,那将会很有帮助)

最佳答案

忘记解析器,如果您查看代码 in compile.c here,您将看到如何生成指令来处理赋值或操作。每次调用 ADD_INSNL 都会发出一条指令。在第 4553 行,您会看到一个 if 条件,它在通过调用第 4546 行的 COMPILE 宏发出的代码读取 LHS 的值后测试它的值,以便决定是否分配新的值(value)。在此期间,另一个线程可能会监督并更改读取的值,因此分配在不应该完成(或未完成)的时候完成。

至于如何创建 NODE_OP_ASGN_OR,请参阅函数 new_op_assign_gen() 中从 parse.y 调用对 NEW_OP_ASGN_OR(在 node.h 中定义)的调用。

希望行号不会更改得太快,并使这些 URL 无效。

关于ruby - MRI 如何解析 `||=` 运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32507997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com