summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-18 15:11:17 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-18 15:11:17 +0000
commita80cc953aae32d34f40cd5428bd769ac16733f4d (patch)
treefbcee201288ac5c3b9744d3bfd0ff87658a0183c /vm_method.c
parent011bee2d320d59eb81b27a0e68ec071700e07f75 (diff)
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.c47
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 *