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;
}
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;
}
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);
}
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;
}
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;
}
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;
}
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);
}
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;
}
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);
}
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;
}
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;
}
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));
}
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;
}
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;
}
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;
}