aboutsummaryrefslogtreecommitdiffstats
path: root/vm_eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/vm_eval.c b/vm_eval.c
index b0249391bf..4a3b9e325f 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -33,6 +33,7 @@ typedef enum call_type {
CALL_FCALL,
CALL_VCALL,
CALL_PUBLIC_KW,
+ CALL_FCALL_KW,
CALL_TYPE_MAX
} call_type;
@@ -210,6 +211,12 @@ rb_vm_call(rb_execution_context_t *ec, VALUE recv, VALUE id, int argc, const VAL
return rb_vm_call0(ec, recv, id, argc, argv, me, VM_NO_KEYWORDS);
}
+VALUE
+rb_vm_call_kw(rb_execution_context_t *ec, VALUE recv, VALUE id, int argc, const VALUE *argv, const rb_callable_method_entry_t *me, int kw_splat)
+{
+ return rb_vm_call0(ec, recv, id, argc, argv, me, kw_splat);
+}
+
static inline VALUE
vm_call_super(rb_execution_context_t *ec, int argc, const VALUE *argv)
{
@@ -298,9 +305,17 @@ rb_call0(rb_execution_context_t *ec,
call_type scope = call_scope;
int kw_splat = VM_NO_KEYWORDS;
- if (scope == CALL_PUBLIC_KW) {
+ switch(scope) {
+ case(CALL_PUBLIC_KW):
scope = CALL_PUBLIC;
kw_splat = 1;
+ break;
+ case(CALL_FCALL_KW):
+ scope = CALL_FCALL;
+ kw_splat = 1;
+ break;
+ default:
+ break;
}
if (scope == CALL_PUBLIC) {
@@ -861,6 +876,12 @@ rb_funcallv(VALUE recv, ID mid, int argc, const VALUE *argv)
return rb_call(recv, mid, argc, argv, CALL_FCALL);
}
+VALUE
+rb_funcallv_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_splat)
+{
+ return rb_call(recv, mid, argc, argv, kw_splat ? CALL_FCALL_KW : CALL_FCALL);
+}
+
/*!
* Calls a method.
*