diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-12-18 15:11:17 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-12-18 15:11:17 +0000 |
commit | a80cc953aae32d34f40cd5428bd769ac16733f4d (patch) | |
tree | fbcee201288ac5c3b9744d3bfd0ff87658a0183c /vm_method.c | |
parent | 011bee2d320d59eb81b27a0e68ec071700e07f75 (diff) | |
download | ruby-a80cc953aae32d34f40cd5428bd769ac16733f4d.tar.gz |
Expand cross-recursion to a loop
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66442 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_method.c')
-rw-r--r-- | vm_method.c | 47 |
1 files changed, 17 insertions, 30 deletions
diff --git a/vm_method.c b/vm_method.c index 8fe5c0868f..677c3b7ec9 100644 --- a/vm_method.c +++ b/vm_method.c @@ -922,49 +922,36 @@ rb_callable_method_entry_without_refinements(VALUE klass, ID id, VALUE *defined_ } static const rb_method_entry_t * -refined_method_original_method_entry(VALUE refinements, const rb_method_entry_t *me, VALUE *defined_class_ptr) -{ - VALUE super; - - if (me->def->body.refined.orig_me) { - if (defined_class_ptr) *defined_class_ptr = me->def->body.refined.orig_me->defined_class; - return me->def->body.refined.orig_me; - } - else if (!(super = RCLASS_SUPER(me->owner))) { - return 0; - } - else { - rb_method_entry_t *tmp_me; - tmp_me = method_entry_get(super, me->called_id, defined_class_ptr); - return resolve_refined_method(refinements, tmp_me, defined_class_ptr); - } -} - -static const rb_method_entry_t * resolve_refined_method(VALUE refinements, const rb_method_entry_t *me, VALUE *defined_class_ptr) { - if (me && me->def->type == VM_METHOD_TYPE_REFINED) { + while (me && me->def->type == VM_METHOD_TYPE_REFINED) { VALUE refinement; rb_method_entry_t *tmp_me; + VALUE super; refinement = find_refinement(refinements, me->owner); - if (NIL_P(refinement)) { - return refined_method_original_method_entry(refinements, me, defined_class_ptr); - } - else { + if (!NIL_P(refinement)) { tmp_me = method_entry_get(refinement, me->called_id, defined_class_ptr); if (tmp_me && tmp_me->def->type != VM_METHOD_TYPE_REFINED) { return tmp_me; } - else { - return refined_method_original_method_entry(refinements, me, defined_class_ptr); - } } + + tmp_me = me->def->body.refined.orig_me; + if (tmp_me) { + if (defined_class_ptr) *defined_class_ptr = tmp_me->defined_class; + return tmp_me; + } + + super = RCLASS_SUPER(me->owner); + if (!super) { + return 0; + } + + me = method_entry_get(super, me->called_id, defined_class_ptr); } - else { - return me; - } + return me; } const rb_method_entry_t * |