35 #define IS_METHOD_PROC_NODE(node) (nd_type(node) == NODE_IFUNC && (node)->nd_cfnc == bmcall)
372 rb_scan_args(argc, argv,
"12", &args[0], &args[2], &args[3]);
397 rb_warn(
"tried to create Proc object without a block");
402 "tried to create Proc object without a block");
406 procval = block->
proc;
409 if (
RBASIC(procval)->klass == klass) {
414 RBASIC(newprocval)->klass = klass;
485 rb_warn(
"rb_f_lambda() is deprecated; use rb_block_proc() instead");
542 VALUE passed_procval;
551 blockptr = &passed_proc->
block;
556 argc, argv, blockptr);
559 #if SIZEOF_LONG > SIZEOF_INT
563 if (argc > INT_MAX || argc < 0) {
565 (
unsigned long)argc);
570 #define check_argc(argc) (argc)
589 if (!
NIL_P(pass_procval)) {
592 block = &pass_proc->
block;
654 #define get_proc_iseq rb_proc_get_iseq
664 if (is_proc) *is_proc = !proc->
is_lambda;
671 if (is_proc) *is_proc = 0;
682 if (!iseq)
return Qnil;
711 int n = (arity < 0) ? ~arity : arity;
813 const char *is_lambda;
817 is_lambda = proc->
is_lambda ?
" (lambda)" :
"";
825 str =
rb_sprintf(
"#<%s:%p@%s:%d%s>", cname, (
void *)
self,
858 struct METHOD *data = ptr;
867 struct METHOD *data = ptr;
870 ume->
next =
GET_VM()->unlinked_method_entry_list;
871 GET_VM()->unlinked_method_entry_list = ume;
878 return ptr ?
sizeof(
struct METHOD) : 0;
905 VALUE rclass = klass;
943 switch (flag & NOEX_MASK) {
962 while (rclass != klass &&
968 klass =
RBASIC(klass)->klass;
1078 struct METHOD *orig, *data;
1084 data->
id = orig->
id;
1086 *data->
me = *orig->
me;
1288 else if (argc == 2) {
1293 "wrong argument type %s (expected Proc/Method)",
1307 "can't bind singleton method to a different class");
1311 "bind argument must be a subclass of %s",
1380 struct METHOD *orig, *data;
1387 *data->
me = *orig->
me;
1420 volatile int safe = -1;
1437 if (!
NIL_P(pass_procval)) {
1440 block = &pass_proc->
block;
1548 struct METHOD *data, *bound;
1555 "singleton method called for a different object");
1566 *bound->
me = *data->
me;
1580 switch (def->
type) {
1609 case OPTIMIZED_METHOD_TYPE_SEND:
1616 rb_bug(
"rb_method_entry_arity: invalid method entry type (%d)", def->
type);
1687 return data->
me->
def;
1693 switch (def->
type) {
1762 const char *sharp =
"#";
1776 else if (data->
recv == v) {
1963 VALUE proc, passed, arity;
1972 if (!
NIL_P(passed_proc)) {
1973 rb_warn(
"given block not used");
2033 marity = -marity - 1;
2043 if (
rb_proc_lambda_p(
self) && (sarity < marity || (sarity > marity && !opt))) {
2122 (
void *)OPTIMIZED_METHOD_TYPE_CALL, 0);
2124 (
void *)OPTIMIZED_METHOD_TYPE_CALL, 0);
2126 (
void *)OPTIMIZED_METHOD_TYPE_CALL, 0);
2128 (
void *)OPTIMIZED_METHOD_TYPE_CALL, 0);