dav*_*ola 2 ruby compiler-construction rubinius
我试图(为了娱乐和利润)添加检查ruby中的对象并发现其源代码的能力.不是生成的字节码,也不是内部表示的某些反编译版本,而是解析为创建该对象的实际源.
我很快就学习了Rubinius,虽然我还没有充分了解它,但我认为我已经取得了一些进展.
不过,我无法弄清楚如何做到这一点.我的第一种方法是简单地向AST结构添加另一个实例属性(例如,一个ClosedScope对象).然后,当在运行时解释字节码时,以某种方式再次拉出该属性.
这看起来像一个合理的方法吗?
正如塞缪尔先生所说,你可以使用撬起来做show-source foo
.但也许你想知道它是如何工作的.
Ruby提供了两个有用的东西:首先,您可以获得对象上所有方法的列表.打电话吧foo.methods
.其次,它为每个方法提供了file_name和line_number属性.
为了找到对象的完整源代码,我们扫描所有方法并按定义它们的位置对它们进行分组.然后我们将文件向上扫描,直到我们看到class
或者module
使用rubyists定义方法的其他几种方式.然后,我们在每个文件中向前扫描,直到我们确定了整个类/模块定义.
正如dgitized指出的那样,如果人们使用猴子修补核心对象,我们通常会得到多个这样的定义.默认情况下,pry仅显示包含大多数方法的模块定义; 但你可以请求其他人show-source -a
.