find opened classes

N

nraychaudhuri

Is there any way I can find all the classes that have been re-opened
in a project?
 
L

Logan Capaldo

Is there any way I can find all the classes that have been re-opened
in a project?

No fool proof way. Are there particular changes to a class you are
looking to track? For instance you can override method_added to see if
anyone adds any additional methods.
 
J

Joel VanderWerf

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]
 
R

Robert Klemme

2007/8/22 said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,264
Messages
2,571,316
Members
48,002
Latest member
DoloresMan

Latest Threads

Top