2011-04-07 17 views
6

He investigado getting the source code of a method si existe como un archivo, pero sin esta referencia de archivo, ¿es posible imprimir dinámicamente el código fuente de un método? Parece que puedo acceder a las firmas de métodos en la clase con self.methods y cada método .arity. Creo que la gema ri_for se refiere al archivo fuente original.¿Puedo hacer que Ruby imprima el código fuente de un método dinámico?

Una mejor manera de enmarcar esta pregunta: Si una clase se extiende en tiempo de ejecución, ¿está a salvo de ser investigada su fuente? ¿O la capacidad de investigar está limitada a la firma del método y los nombres de las variables de instancia, quizás las variables de clase?

Editar: Solución I utilizado: 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 

pega este en algún lugar y se puede obtener un buen comienzo en conseguir el código fuente de una clase definida en tiempo de ejecución.

Respuesta

2

Si una clase se extiende en tiempo de ejecución, es su fuente a salvo de ser investigados?

No, no es seguro. Por ejemplo, ParseTree podría usarse para determinar el código de tiempo de ejecución real para el método y aplicar ingeniería inversa a una implementación equivalente.

+0

+1, pero ¿es ParseTree o Ruby2Ruby? –

+0

Gracias, su respuesta me hizo ver SexpProcessor y desde allí pude extender la clase Module con un método ro_ruby que vacía todo el código fuente de la clase. – mike

5

Se ha hablado sobre un método Proc#to_source para MRI, pero AFAIK no salió de él (todavía). Sin embargo, existe la sourcify gema, usted debe echar un vistazo y ver si se ajusta a sus necesidades:

https://github.com/ngty/sourcify

Cuestiones relacionadas