mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
vm.c: add RubyVM.stat for accessing cache serials
* vm.c (ruby_vm_stat): add RubyVM.stat() for access to internal cache counters. this methods behaves like GC.stat, accepting an optional hash or symbol argument. [Bug #9190] [ruby-core:58750] * test/ruby/test_rubyvm.rb: test for new method git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44062 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2aa57843f2
commit
cc1063092b
3 changed files with 89 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
Sun Dec 8 13:01:11 2013 Aman Gupta <ruby@tmm1.net>
|
||||||
|
|
||||||
|
* vm.c (ruby_vm_stat): add RubyVM.stat() for access to internal cache
|
||||||
|
counters. this methods behaves like GC.stat, accepting an optional
|
||||||
|
hash or symbol argument. [Bug #9190] [ruby-core:58750]
|
||||||
|
* test/ruby/test_rubyvm.rb: test for new method
|
||||||
|
|
||||||
Sun Dec 8 11:59:40 2013 Aman Gupta <ruby@tmm1.net>
|
Sun Dec 8 11:59:40 2013 Aman Gupta <ruby@tmm1.net>
|
||||||
|
|
||||||
* hash.c (rb_hash_replace): add a write barrier to fix GC mark miss on
|
* hash.c (rb_hash_replace): add a write barrier to fix GC mark miss on
|
||||||
|
|
16
test/ruby/test_rubyvm.rb
Normal file
16
test/ruby/test_rubyvm.rb
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
require 'test/unit'
|
||||||
|
|
||||||
|
class TestRubyVM < Test::Unit::TestCase
|
||||||
|
def test_stat
|
||||||
|
assert_kind_of Hash, RubyVM.stat
|
||||||
|
assert_kind_of Fixnum, RubyVM.stat[:method_serial]
|
||||||
|
|
||||||
|
RubyVM.stat(stat = {})
|
||||||
|
assert_not_empty stat
|
||||||
|
assert_equal stat[:method_serial], RubyVM.stat(:method_serial)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_stat_unknown
|
||||||
|
assert_raise(ArgumentError){ RubyVM.stat(:unknown) }
|
||||||
|
end
|
||||||
|
end
|
66
vm.c
66
vm.c
|
@ -113,6 +113,71 @@ rb_vm_inc_const_missing_count(void)
|
||||||
ruby_vm_const_missing_count +=1;
|
ruby_vm_const_missing_count +=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* RubyVM.stat -> Hash
|
||||||
|
* RubyVM.stat(hsh) -> hsh
|
||||||
|
* RubyVM.stat(Symbol) -> Numeric
|
||||||
|
*
|
||||||
|
* Returns a Hash containing implementation-dependent counters inside the VM.
|
||||||
|
*
|
||||||
|
* This hash includes information about method/constant cache serials:
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* :method_serial=>251,
|
||||||
|
* :constant_serial=>481,
|
||||||
|
* :class_serial=>9029
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* The contents of the hash are implementation specific and may be changed in
|
||||||
|
* the future.
|
||||||
|
*
|
||||||
|
* This method is only expected to work on C Ruby.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
ruby_vm_stat(int argc, VALUE *argv, VALUE self)
|
||||||
|
{
|
||||||
|
static VALUE sym_method_serial, sym_constant_serial, sym_class_serial;
|
||||||
|
VALUE arg = Qnil;
|
||||||
|
VALUE hash = Qnil, key = Qnil;
|
||||||
|
|
||||||
|
if (rb_scan_args(argc, argv, "01", &arg) == 1) {
|
||||||
|
if (SYMBOL_P(arg))
|
||||||
|
key = arg;
|
||||||
|
else if (RB_TYPE_P(arg, T_HASH))
|
||||||
|
hash = arg;
|
||||||
|
else
|
||||||
|
rb_raise(rb_eTypeError, "non-hash or symbol given");
|
||||||
|
} else if (arg == Qnil) {
|
||||||
|
hash = rb_hash_new();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sym_method_serial == 0) {
|
||||||
|
#define S(s) sym_##s = ID2SYM(rb_intern_const(#s))
|
||||||
|
S(method_serial);
|
||||||
|
S(constant_serial);
|
||||||
|
S(class_serial);
|
||||||
|
#undef S
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SET(name, attr) \
|
||||||
|
if (key == sym_##name) \
|
||||||
|
return SIZET2NUM(attr); \
|
||||||
|
else if (hash != Qnil) \
|
||||||
|
rb_hash_aset(hash, sym_##name, SIZET2NUM(attr));
|
||||||
|
|
||||||
|
SET(method_serial, ruby_vm_method_serial);
|
||||||
|
SET(constant_serial, ruby_vm_constant_serial);
|
||||||
|
SET(class_serial, ruby_vm_class_serial);
|
||||||
|
#undef SET
|
||||||
|
|
||||||
|
if (key != Qnil) /* matched key should return above */
|
||||||
|
rb_raise(rb_eArgError, "unknown key: %s", RSTRING_PTR(rb_id2str(SYM2ID(key))));
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
/* control stack frame */
|
/* control stack frame */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2295,6 +2360,7 @@ Init_VM(void)
|
||||||
rb_cRubyVM = rb_define_class("RubyVM", rb_cObject);
|
rb_cRubyVM = rb_define_class("RubyVM", rb_cObject);
|
||||||
rb_undef_alloc_func(rb_cRubyVM);
|
rb_undef_alloc_func(rb_cRubyVM);
|
||||||
rb_undef_method(CLASS_OF(rb_cRubyVM), "new");
|
rb_undef_method(CLASS_OF(rb_cRubyVM), "new");
|
||||||
|
rb_define_singleton_method(rb_cRubyVM, "stat", ruby_vm_stat, -1);
|
||||||
|
|
||||||
/* FrozenCore (hidden) */
|
/* FrozenCore (hidden) */
|
||||||
fcore = rb_class_new(rb_cBasicObject);
|
fcore = rb_class_new(rb_cBasicObject);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue