In Files

  • proc.c

Method

Public Instance Methods

meth == other_meth => true or false click to toggle source

Two method objects are equal if that are bound to the same object and contain the same body.

 
               static VALUE
method_eq(VALUE method, VALUE other)
{
    struct METHOD *m1, *m2;

    if (TYPE(other) != T_DATA
        || RDATA(other)->dmark != (RUBY_DATA_FUNC) bm_mark)
        return Qfalse;
    if (CLASS_OF(method) != CLASS_OF(other))
        return Qfalse;

    Data_Get_Struct(method, struct METHOD, m1);
    Data_Get_Struct(other, struct METHOD, m2);

    if (m1->oclass != m2->oclass || m1->rclass != m2->rclass ||
        m1->recv != m2->recv || m1->body != m2->body)
        return Qfalse;

    return Qtrue;
}
            
meth[args, ...] => obj click to toggle source

Invokes the meth with the specified arguments, returning the method's return value.

m = 12.method("+")
m.call(3)    #=> 15
m.call(20)   #=> 32
 
               VALUE
rb_method_call(int argc, VALUE *argv, VALUE method)
{
    VALUE result = Qnil;        /* OK */
    struct METHOD *data;
    int state;
    volatile int safe = -1;

    Data_Get_Struct(method, struct METHOD, data);
    if (data->recv == Qundef) {
        rb_raise(rb_eTypeError, "can't call unbound method; bind first");
    }
    PUSH_TAG();
    if (OBJ_TAINTED(method)) {
        safe = rb_safe_level();
        if (rb_safe_level() < 4) {
            rb_set_safe_level_force(4);
        }
    }
    if ((state = EXEC_TAG()) == 0) {
        rb_thread_t *th = GET_THREAD();
        VALUE rb_vm_call(rb_thread_t * th, VALUE klass, VALUE recv, VALUE id, ID oid,
                         int argc, const VALUE *argv, const NODE *body, int nosuper);

        PASS_PASSED_BLOCK_TH(th);
        result = rb_vm_call(th, data->oclass, data->recv, data->id, data->oid,
                            argc, argv, data->body, 0);
    }
    POP_TAG();
    if (safe >= 0)
        rb_set_safe_level_force(safe);
    if (state)
        JUMP_TAG(state);
    return result;
}
            
arity => fixnum click to toggle source

Returns an indication of the number of arguments accepted by a method. Returns a nonnegative integer for methods that take a fixed number of arguments. For Ruby methods that take a variable number of arguments, returns -n-1, where n is the number of required arguments. For methods written in C, returns -1 if the call takes a variable number of arguments.

class C
  def one;    end
  def two(a); end
  def three(*a);  end
  def four(a, b); end
  def five(a, b, *c);    end
  def six(a, b, *c, &d); end
end
c = C.new
c.method(:one).arity     #=> 0
c.method(:two).arity     #=> 1
c.method(:three).arity   #=> -1
c.method(:four).arity    #=> 2
c.method(:five).arity    #=> -3
c.method(:six).arity     #=> -3

"cat".method(:size).arity      #=> 0
"cat".method(:replace).arity   #=> 1
"cat".method(:squeeze).arity   #=> -1
"cat".method(:count).arity     #=> -1
 
               static VALUE
method_arity_m(VALUE method)
{
    int n = method_arity(method);
    return INT2FIX(n);
}
            
call(args, ...) => obj click to toggle source

Invokes the meth with the specified arguments, returning the method's return value.

m = 12.method("+")
m.call(3)    #=> 15
m.call(20)   #=> 32
 
               VALUE
rb_method_call(int argc, VALUE *argv, VALUE method)
{
    VALUE result = Qnil;        /* OK */
    struct METHOD *data;
    int state;
    volatile int safe = -1;

    Data_Get_Struct(method, struct METHOD, data);
    if (data->recv == Qundef) {
        rb_raise(rb_eTypeError, "can't call unbound method; bind first");
    }
    PUSH_TAG();
    if (OBJ_TAINTED(method)) {
        safe = rb_safe_level();
        if (rb_safe_level() < 4) {
            rb_set_safe_level_force(4);
        }
    }
    if ((state = EXEC_TAG()) == 0) {
        rb_thread_t *th = GET_THREAD();
        VALUE rb_vm_call(rb_thread_t * th, VALUE klass, VALUE recv, VALUE id, ID oid,
                         int argc, const VALUE *argv, const NODE *body, int nosuper);

        PASS_PASSED_BLOCK_TH(th);
        result = rb_vm_call(th, data->oclass, data->recv, data->id, data->oid,
                            argc, argv, data->body, 0);
    }
    POP_TAG();
    if (safe >= 0)
        rb_set_safe_level_force(safe);
    if (state)
        JUMP_TAG(state);
    return result;
}
            
clone() click to toggle source

MISSING: documentation

 
               static VALUE
method_clone(VALUE self)
{
    VALUE clone;
    struct METHOD *orig, *data;

    Data_Get_Struct(self, struct METHOD, orig);
    clone = Data_Make_Struct(CLASS_OF(self), struct METHOD, bm_mark, -1, data);
    CLONESETUP(clone, self);
    *data = *orig;

    return clone;
}
            
meth == other_meth => true or false click to toggle source

Two method objects are equal if that are bound to the same object and contain the same body.

 
               static VALUE
method_eq(VALUE method, VALUE other)
{
    struct METHOD *m1, *m2;

    if (TYPE(other) != T_DATA
        || RDATA(other)->dmark != (RUBY_DATA_FUNC) bm_mark)
        return Qfalse;
    if (CLASS_OF(method) != CLASS_OF(other))
        return Qfalse;

    Data_Get_Struct(method, struct METHOD, m1);
    Data_Get_Struct(other, struct METHOD, m2);

    if (m1->oclass != m2->oclass || m1->rclass != m2->rclass ||
        m1->recv != m2->recv || m1->body != m2->body)
        return Qfalse;

    return Qtrue;
}
            
hash => integer click to toggle source

Return a hash value corresponding to the method object.

 
               static VALUE
method_hash(VALUE method)
{
    struct METHOD *m;
    long hash;

    Data_Get_Struct(method, struct METHOD, m);
    hash = (long)m->oclass;
    hash ^= (long)m->rclass;
    hash ^= (long)m->recv;
    hash ^= (long)m->body;

    return INT2FIX(hash);
}
            
inspect => string click to toggle source

Show the name of the underlying method.

"cat".method(:count).inspect   #=> "#<Method: String#count>"
 
               static VALUE
method_inspect(VALUE method)
{
    struct METHOD *data;
    VALUE str;
    const char *s;
    const char *sharp = "#";

    Data_Get_Struct(method, struct METHOD, data);
    str = rb_str_buf_new2("#<");
    s = rb_obj_classname(method);
    rb_str_buf_cat2(str, s);
    rb_str_buf_cat2(str, ": ");

    if (FL_TEST(data->oclass, FL_SINGLETON)) {
        VALUE v = rb_iv_get(data->oclass, "__attached__");

        if (data->recv == Qundef) {
            rb_str_buf_append(str, rb_inspect(data->oclass));
        }
        else if (data->recv == v) {
            rb_str_buf_append(str, rb_inspect(v));
            sharp = ".";
        }
        else {
            rb_str_buf_append(str, rb_inspect(data->recv));
            rb_str_buf_cat2(str, "(");
            rb_str_buf_append(str, rb_inspect(v));
            rb_str_buf_cat2(str, ")");
            sharp = ".";
        }
    }
    else {
        rb_str_buf_cat2(str, rb_class2name(data->rclass));
        if (data->rclass != data->oclass) {
            rb_str_buf_cat2(str, "(");
            rb_str_buf_cat2(str, rb_class2name(data->oclass));
            rb_str_buf_cat2(str, ")");
        }
    }
    rb_str_buf_cat2(str, sharp);
    rb_str_append(str, rb_id2str(data->oid));
    rb_str_buf_cat2(str, ">");

    return str;
}
            
name => symbol click to toggle source

Returns the name of the method.

 
               static VALUE
method_name(VALUE obj)
{
    struct METHOD *data;

    Data_Get_Struct(obj, struct METHOD, data);
    return ID2SYM(data->id);
}
            
owner => class_or_module click to toggle source

Returns the class or module that defines the method.

 
               static VALUE
method_owner(VALUE obj)
{
    struct METHOD *data;

    Data_Get_Struct(obj, struct METHOD, data);
    return data->oclass;
}
            
receiver => object click to toggle source

Returns the bound receiver of the method object.

 
               static VALUE
method_receiver(VALUE obj)
{
    struct METHOD *data;

    Data_Get_Struct(obj, struct METHOD, data);
    return data->recv;
}
            
source_location => [String, Fixnum] click to toggle source

returns the ruby source filename and line number containing this method or nil if this method was not defined in ruby (i.e. native)

 
               VALUE
rb_method_location(VALUE method)
{
    return iseq_location(get_method_iseq(method));
}
            
to_proc => prc click to toggle source

Returns a Proc object corresponding to this method.

 
               static VALUE
method_proc(VALUE method)
{
    VALUE procval;
    rb_proc_t *proc;
    /*
     * class Method
     *   def to_proc
     *     proc{|*args|
     *       self.call(*args)
     *     }
     *   end
     * end
     */
    procval = rb_iterate(mlambda, 0, bmcall, method);
    GetProcPtr(procval, proc);
    proc->is_from_method = 1;
    return procval;
}
            
to_s => string click to toggle source

Show the name of the underlying method.

"cat".method(:count).inspect   #=> "#<Method: String#count>"
 
               static VALUE
method_inspect(VALUE method)
{
    struct METHOD *data;
    VALUE str;
    const char *s;
    const char *sharp = "#";

    Data_Get_Struct(method, struct METHOD, data);
    str = rb_str_buf_new2("#<");
    s = rb_obj_classname(method);
    rb_str_buf_cat2(str, s);
    rb_str_buf_cat2(str, ": ");

    if (FL_TEST(data->oclass, FL_SINGLETON)) {
        VALUE v = rb_iv_get(data->oclass, "__attached__");

        if (data->recv == Qundef) {
            rb_str_buf_append(str, rb_inspect(data->oclass));
        }
        else if (data->recv == v) {
            rb_str_buf_append(str, rb_inspect(v));
            sharp = ".";
        }
        else {
            rb_str_buf_append(str, rb_inspect(data->recv));
            rb_str_buf_cat2(str, "(");
            rb_str_buf_append(str, rb_inspect(v));
            rb_str_buf_cat2(str, ")");
            sharp = ".";
        }
    }
    else {
        rb_str_buf_cat2(str, rb_class2name(data->rclass));
        if (data->rclass != data->oclass) {
            rb_str_buf_cat2(str, "(");
            rb_str_buf_cat2(str, rb_class2name(data->oclass));
            rb_str_buf_cat2(str, ")");
        }
    }
    rb_str_buf_cat2(str, sharp);
    rb_str_append(str, rb_id2str(data->oid));
    rb_str_buf_cat2(str, ">");

    return str;
}
            
unbind => unbound_method click to toggle source

Dissociates meth from it's current receiver. The resulting UnboundMethod can subsequently be bound to a new object of the same class (see UnboundMethod).

 
               static VALUE
method_unbind(VALUE obj)
{
    VALUE method;
    struct METHOD *orig, *data;

    Data_Get_Struct(obj, struct METHOD, orig);
    method =
        Data_Make_Struct(rb_cUnboundMethod, struct METHOD, bm_mark, -1, data);
    data->oclass = orig->oclass;
    data->recv = Qundef;
    data->id = orig->id;
    data->body = orig->body;
    data->rclass = orig->rclass;
    data->oid = orig->oid;
    OBJ_INFECT(method, obj);

    return method;
}