2007/8/22, Joel VanderWerf <vjoel / path.berkeley.edu>:
> nraychaudhuri / gmail.com wrote:
> > Is there any way I can find all the classes that have been re-opened
> > in a project?
> >
>
> If you don't mind having a trace proc running while you classes are
> being loaded you can do this. (You can always set_trace_func(nil) later
> on if you want to stop wasting cpu cycles.)
>
> opened = {}
>
> class_tracer = proc do |event, file, line, id, binding, classname|
>    case event
>    when "class" # class or module definition
>      cl = eval("self", binding)
>      opened[cl] = true
>    when "c-call"
>      case id
>      when :class_eval, :module_eval
>        cl = eval("self", binding)
>        opened[cl] = true
>      end
>    end
> end
>
> set_trace_func(class_tracer)
>
> class Foo
> end
> class String
> end
> Array.class_eval {}
>
> p opened.keys # ==> [Foo, Array, String]

I thought of something similar but I would just dump out class names
as they come (probably to $stderr).  That way you can see when classes
are opened multiple times. Also, if you include all the info you get
during tracing you can easily locate the code:

RKlemme@padrklemme1 /cygdrive/c/Archives/jboss.org/jboss-4.2.1.GA-src
$ ruby -e 'set_trace_func lambda {|*a| p a if a.first == "class"};
class Foo; end'
["class", "-e", 1, nil, #<Binding:0x1002fdb8>, false]

Kind regards

robert