2

我正在尝试(为了乐趣和利润)添加在 ruby​​ 中检查对象并发现它们的源代码的能力。不是生成的字节码,也不是内部表示的一些反编译版本,而是被解析以创建该对象的实际源。

我学习 Rubinius 的时间很晚,虽然我还没有完全理解它,但我认为我已经取得了一些进展。

不过,我很难弄清楚如何做到这一点。我的第一种方法是简单地将另一个实例属性添加到 AST 结构(例如,一个 ClosedScope 对象)。然后,当在运行时解释字节码时,以某种方式再次提取该属性。

这看起来是一种合理的方法吗?

4

3 回答 3

5

正如塞缪尔先生所说,您可以使用 pry and do show-source foo。但也许您想知道它在幕后是如何工作的。

Ruby 提供了两个有用的东西:首先,您可以获得对象上所有方法的列表。只要打电话foo.methods。其次,它为每个方法提供了一个 file_name 和 line_number 属性。

为了找到一个对象的完整源代码,我们浏览了所有的方法,并按照定义的位置对它们进行分组。然后我们将文件扫描回来,直到我们看到classmodule其他一些 ruby​​ists 用来定义方法的方式。然后我们在每个文件中向前扫描,直到我们识别出整个类/模块定义。

正如 dgitized 指出的那样,如果人们有猴子修补的核心对象,我们通常会得到多个这样的定义。默认情况下,pry 只显示包含大多数方法的模块定义;但你可以用show-source -a.

于 2012-11-18T06:21:57.217 回答
2

你调查过撬吗?它是一个 Ruby 解释器/调试器,声称能够完成您所要求的工作。

于 2012-11-18T04:37:36.353 回答
-1

你试过 set_trace_func 吗?它不是 rubinius 特定的,而是按照你的要求做的,而不是基于 pry 或其他一些宝石。

http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-set_trace_func

于 2012-11-18T07:26:55.750 回答