mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Split mnew
into unbound and callable
It always branches by `obj` is `Qundef` or not, which is invariant for each functions; `obj_method` is the latter, and the other two are the former.
This commit is contained in:
parent
e44870c225
commit
22b8ddfd10
1 changed files with 16 additions and 10 deletions
26
proc.c
26
proc.c
|
@ -1709,20 +1709,26 @@ mnew_from_me(const rb_method_entry_t *me, VALUE klass, VALUE iclass,
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
mnew(VALUE klass, VALUE obj, ID id, VALUE mclass, int scope)
|
mnew_callable(VALUE klass, VALUE obj, ID id, VALUE mclass, int scope)
|
||||||
{
|
{
|
||||||
const rb_method_entry_t *me;
|
const rb_method_entry_t *me;
|
||||||
VALUE iclass = Qnil;
|
VALUE iclass = Qnil;
|
||||||
|
|
||||||
if (obj == Qundef) { /* UnboundMethod */
|
ASSUME(obj != Qundef);
|
||||||
me = rb_method_entry_with_refinements(klass, id, &iclass);
|
me = (rb_method_entry_t *)rb_callable_method_entry_with_refinements(klass, id, &iclass);
|
||||||
}
|
|
||||||
else {
|
|
||||||
me = (rb_method_entry_t *)rb_callable_method_entry_with_refinements(klass, id, &iclass);
|
|
||||||
}
|
|
||||||
return mnew_from_me(me, klass, iclass, obj, id, mclass, scope);
|
return mnew_from_me(me, klass, iclass, obj, id, mclass, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
mnew_unbound(VALUE klass, ID id, VALUE mclass, int scope)
|
||||||
|
{
|
||||||
|
const rb_method_entry_t *me;
|
||||||
|
VALUE iclass = Qnil;
|
||||||
|
|
||||||
|
me = rb_method_entry_with_refinements(klass, id, &iclass);
|
||||||
|
return mnew_from_me(me, klass, iclass, Qundef, id, mclass, scope);
|
||||||
|
}
|
||||||
|
|
||||||
static inline VALUE
|
static inline VALUE
|
||||||
method_entry_defined_class(const rb_method_entry_t *me)
|
method_entry_defined_class(const rb_method_entry_t *me)
|
||||||
{
|
{
|
||||||
|
@ -1960,7 +1966,7 @@ obj_method(VALUE obj, VALUE vid, int scope)
|
||||||
if (m) return m;
|
if (m) return m;
|
||||||
rb_method_name_error(klass, vid);
|
rb_method_name_error(klass, vid);
|
||||||
}
|
}
|
||||||
return mnew(klass, obj, id, mclass, scope);
|
return mnew_callable(klass, obj, id, mclass, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2121,7 +2127,7 @@ rb_mod_instance_method(VALUE mod, VALUE vid)
|
||||||
if (!id) {
|
if (!id) {
|
||||||
rb_method_name_error(mod, vid);
|
rb_method_name_error(mod, vid);
|
||||||
}
|
}
|
||||||
return mnew(mod, Qundef, id, rb_cUnboundMethod, FALSE);
|
return mnew_unbound(mod, id, rb_cUnboundMethod, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2138,7 +2144,7 @@ rb_mod_public_instance_method(VALUE mod, VALUE vid)
|
||||||
if (!id) {
|
if (!id) {
|
||||||
rb_method_name_error(mod, vid);
|
rb_method_name_error(mod, vid);
|
||||||
}
|
}
|
||||||
return mnew(mod, Qundef, id, rb_cUnboundMethod, TRUE);
|
return mnew_unbound(mod, id, rb_cUnboundMethod, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue