summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--error.c2
-rw-r--r--include/ruby/ruby.h11
-rw-r--r--numeric.c2
-rw-r--r--parse.y8
-rw-r--r--vm_eval.c1
5 files changed, 22 insertions, 2 deletions
diff --git a/error.c b/error.c
index 688642796d..e431a6f9b9 100644
--- a/error.c
+++ b/error.c
@@ -963,7 +963,7 @@ rb_get_backtrace(VALUE exc)
return Qnil;
return rb_check_backtrace(info);
}
- return rb_funcall(exc, mid, 0, 0);
+ return rb_funcallv(exc, mid, 0, 0);
}
/*
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 9cf0b4c6b0..0b277dce19 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -2450,6 +2450,17 @@ __extension__({ \
rb_varargs_argc_check(rb_yield_values_argc, rb_yield_values_nargs), \
rb_yield_values_args); \
})
+
+# define rb_funcall(recv, mid, argc, ...) \
+__extension__({ \
+ const int rb_funcall_argc = (argc); \
+ const VALUE rb_funcall_args[] = {__VA_ARGS__}; \
+ const int rb_funcall_nargs = \
+ (int)(sizeof(rb_funcall_args) / sizeof(VALUE)); \
+ rb_funcallv(recv, mid, \
+ rb_varargs_argc_check(rb_funcall_argc, rb_funcall_nargs), \
+ rb_funcall_args); \
+ })
#endif
#ifndef RUBY_DONT_SUBST
diff --git a/numeric.c b/numeric.c
index f66fdaef54..ad7c984241 100644
--- a/numeric.c
+++ b/numeric.c
@@ -362,7 +362,7 @@ num_funcall_op_0(VALUE x, VALUE arg, int recursive)
ID2SYM(func), x);
}
}
- return rb_funcall(x, func, 0, 0);
+ return rb_funcallv(x, func, 0, 0);
}
static VALUE
diff --git a/parse.y b/parse.y
index 44d96c35d0..6f91edfab3 100644
--- a/parse.y
+++ b/parse.y
@@ -831,10 +831,18 @@ static ID id_warn, id_warning, id_gets;
# define PRIsWARN "s"
# define WARN_ARGS(fmt,n) parser->value, id_warn, n, rb_usascii_str_new_lit(fmt)
# define WARN_ARGS_L(l,fmt,n) WARN_ARGS(fmt,n)
+# ifdef HAVE_VA_ARGS_MACRO
+# define WARN_CALL(args,...) rb_funcall(args,__VA_ARGS__)
+# else
# define WARN_CALL rb_funcall
+# endif
# define WARNING_ARGS(fmt,n) parser->value, id_warning, n, rb_usascii_str_new_lit(fmt)
# define WARNING_ARGS_L(l, fmt,n) WARNING_ARGS(fmt,n)
+# ifdef HAVE_VA_ARGS_MACRO
+# define WARNING_CALL(args,...) rb_funcall(args,__VA_ARGS__)
+# else
# define WARNING_CALL rb_funcall
+# endif
static void ripper_compile_error(struct parser_params*, const char *fmt, ...);
# define compile_error ripper_compile_error
# define PARSER_ARG parser,
diff --git a/vm_eval.c b/vm_eval.c
index d2a1d9754d..3ea0b8d921 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -804,6 +804,7 @@ rb_apply(VALUE recv, ID mid, VALUE args)
return rb_call(recv, mid, argc, argv, CALL_FCALL);
}
+#undef rb_funcall
/*!
* Calls a method
* \param recv receiver of the method