* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),

vm_insnhelper.c (vm_search_method): revert r37616 because it's too
  slow.  [ruby-dev:46477]

* test/ruby/test_refinement.rb (test_inline_method_cache): skip
  the test until the bug is fixed efficiently.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37627 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shugo 2012-11-12 07:00:12 +00:00
Родитель 6483a1057a
Коммит afdfbde4e7
5 изменённых файлов: 13 добавлений и 16 удалений

Просмотреть файл

@ -1,3 +1,12 @@
Mon Nov 12 15:59:38 2012 Shugo Maeda <shugo@ruby-lang.org>
* vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo),
vm_insnhelper.c (vm_search_method): revert r37616 because it's too
slow. [ruby-dev:46477]
* test/ruby/test_refinement.rb (test_inline_method_cache): skip
the test until the bug is fixed efficiently.
Mon Nov 12 14:28:01 2012 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/mkexports.rb (each_export): skip garbages generated by VS2012's

Просмотреть файл

@ -954,7 +954,6 @@ new_callinfo(rb_iseq_t *iseq, ID mid, int argc, VALUE block, unsigned long flag)
}
}
ci->vmstat = 0;
ci->refinements = Qundef;
ci->blockptr = 0;
ci->recv = Qundef;
ci->call = 0; /* TODO: should set default function? */

Просмотреть файл

@ -726,6 +726,7 @@ class TestRefinement < Test::Unit::TestCase
end
def test_inline_method_cache
skip "can't implement efficiently with the current implementation of refinements"
c = InlineMethodCache::C.new
f = Proc.new { c.foo }
assert_equal("original", f.call)

Просмотреть файл

@ -153,7 +153,6 @@ typedef struct rb_call_info_struct {
/* inline cache: keys */
VALUE vmstat;
VALUE klass;
VALUE refinements;
/* inline cache: values */
const rb_method_entry_t *me;

Просмотреть файл

@ -843,30 +843,19 @@ static void
vm_search_method(rb_call_info_t *ci, VALUE recv)
{
VALUE klass = CLASS_OF(recv);
NODE *cref = rb_vm_cref();
VALUE refinements = Qnil;
if (cref && !NIL_P(cref->nd_refinements)) {
refinements = cref->nd_refinements;
}
#if OPT_INLINE_METHOD_CACHE
if (LIKELY(GET_VM_STATE_VERSION() == ci->vmstat && klass == ci->klass &&
refinements == ci->refinements)) {
if (LIKELY(GET_VM_STATE_VERSION() == ci->vmstat && klass == ci->klass)) {
/* cache hit! */
}
else {
ci->me = rb_method_entry_get_with_refinements(refinements, klass,
ci->mid,
&ci->defined_class);
ci->me = rb_method_entry(klass, ci->mid, &ci->defined_class);
ci->klass = klass;
ci->refinements = refinements;
ci->vmstat = GET_VM_STATE_VERSION();
ci->call = vm_call_general;
}
#else
ci->me = rb_method_entry_get_with_refinements(refinements, klass, ci->mid,
&ci->defined_class);
ci->me = rb_method_entry(klass, ci->mid, &ci->defined_class);
ci->call = vm_call_general;
ci->klass = klass;
#endif