2011-04-07 37 views
6

我調查了getting the source code of a method如果它作爲一個文件存在,但沒有這個文件引用,是否有可能動態地打印一個方法的源代碼?看來我可以通過self.methods和每個方法的.arity訪問類中的方法簽名。我相信ri_for gem是指原始源文件。我可以讓ruby打印動態方法的源代碼嗎?

更好的方法來解決這個問題:如果一個類在運行時擴展,它的源是否安全無法被調查?或者是僅限於方法簽名和實例變量名稱的調查能力,可能是類變量?

編輯:解決方法我用:http://seattlerb.rubyforge.org/svn/ruby2ruby/1.2.1/lib/ruby2ruby.rb

class Ruby2Ruby < SexpProcessor 
    def self.translate(klass_or_str, method = nil) 
    sexp = ParseTree.translate(klass_or_str, method) 
    unifier = Unifier.new 
    unifier.processors.each do |p| 
     p.unsupported.delete :cfunc 
    end 
    sexp = unifier.process(sexp) 
    self.new.process(sexp) 
    end 
end 

class Module 
    def to_ruby 
    Ruby2Ruby.translate(self) 
    end 
end 

在某個地方粘貼這一點,你可以得到源代碼了在運行時定義的類中取得了不錯的開局。

回答

2

如果一個類在運行時延長,是它的源從安全的被調查?

不,它是不是安全。例如,ParseTree可用於確定該方法的實際運行時代碼,並對等效實施進行逆向工程。

+0

+1,但是它是ParseTree還是Ruby2Ruby? – 2011-04-07 23:44:09

+0

謝謝,你的回答讓我檢查出SexpProcessor,並從那裏我能夠擴展模塊類與一個ro_ruby方法,傾倒出整個類的源代碼。 – mike 2011-04-14 13:20:15

5

有關於MRI的Proc#to_source方法的討論,但AFAIK什麼也沒有(但)。然而,還有就是sourcify寶石,你應該看看,看看它是否適合您的需要:

https://github.com/ngty/sourcify

相關問題