Bug #9321 » rb_mod_const_missing_with_tests.patch
test/ruby/test_settracefunc.rb | ||
---|---|---|
:b_return
|
||
], events)
|
||
end
|
||
def test_const_missing
|
||
bug59398 = '[ruby-core:59398]'
|
||
events = []
|
||
assert !defined?(MISSING_CONSTANT_59398)
|
||
TracePoint.new(:c_call, :c_return){|tp|
|
||
events << tp.event if tp.defined_class == Module && tp.method_id == :const_missing
|
||
}.enable{
|
||
MISSING_CONSTANT_59398 rescue nil
|
||
}
|
||
assert_equal([
|
||
:c_call,
|
||
:c_return
|
||
], events, bug59398)
|
||
end
|
||
end
|
variable.c | ||
---|---|---|
#include "constant.h"
|
||
#include "internal.h"
|
||
#include "id.h"
|
||
#include "vm_core.h"
|
||
st_table *rb_global_tbl;
|
||
static ID autoload, classpath, tmp_classpath, classid;
|
||
... | ... | |
VALUE
|
||
rb_mod_const_missing(VALUE klass, VALUE name)
|
||
{
|
||
rb_thread_t *th = GET_THREAD();
|
||
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, rb_cModule, idConst_missing, rb_cModule, Qnil);
|
||
rb_frame_pop(); /* pop frame for "const_missing" */
|
||
uninitialized_constant(klass, rb_to_id(name));
|
||