summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-04-30 07:09:56 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-04-30 07:09:56 +0000
commit13ed57b4a269e630e28aff1bcfb813f81b246b95 (patch)
tree3667196bec4d434ebbd9492fa1e39a34dca3d173
parent20d4a375e2df9bde23b027581099ca5c8515950d (diff)
merge revision(s) 45320,45321: [Backport #9622]
* vm_insnhelper.c (vm_callee_setup_arg): turn a macro into an inline function. * vm_insnhelper.c (vm_callee_setup_arg): disable fastpath if splat argument, since argc may differ for each calls. [ruby-core:61422] [Bug #9622] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@45748 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--test/ruby/test_call.rb15
-rw-r--r--version.h2
-rw-r--r--vm_insnhelper.c36
4 files changed, 44 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index d9c9b6b02a..3b5d23b344 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Apr 30 16:09:18 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_callee_setup_arg): turn a macro into an
+ inline function.
+
Wed Apr 30 15:20:44 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set.
diff --git a/test/ruby/test_call.rb b/test/ruby/test_call.rb
index 8f861d96a1..5b81eb187a 100644
--- a/test/ruby/test_call.rb
+++ b/test/ruby/test_call.rb
@@ -16,4 +16,19 @@ class TestCall < Test::Unit::TestCase
assert_equal([1, 2, 3, 4], aaa(1, 2, 3, 4))
assert_equal([1, 2, 3, 4], aaa(1, *[2, 3, 4]))
end
+
+ def test_callinfo
+ bug9622 = '[ruby-core:61422] [Bug #9622]'
+ o = Class.new do
+ def foo(*args)
+ bar(:foo, *args)
+ end
+ def bar(name)
+ name
+ end
+ end.new
+ e = assert_raise(ArgumentError) {o.foo(100)}
+ assert_nothing_raised(ArgumentError) {o.foo}
+ assert_raise_with_message(ArgumentError, e.message, bug9622) {o.foo(100)}
+ end
end
diff --git a/version.h b/version.h
index 739a05ce67..51ad7e9273 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.0.0"
#define RUBY_RELEASE_DATE "2014-04-30"
-#define RUBY_PATCHLEVEL 468
+#define RUBY_PATCHLEVEL 469
#define RUBY_RELEASE_YEAR 2014
#define RUBY_RELEASE_MONTH 4
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index b3d62bc246..253515c63f 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1231,23 +1231,33 @@ static VALUE vm_call_iseq_setup_2(rb_thread_t *th, rb_control_frame_t *cfp, rb_c
static inline VALUE vm_call_iseq_setup_normal(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci);
static inline VALUE vm_call_iseq_setup_tailcall(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci);
-#define VM_CALLEE_SETUP_ARG(th, ci, iseq, argv, is_lambda) \
- if (LIKELY((iseq)->arg_simple & 0x01)) { \
- /* simple check */ \
- if ((ci)->argc != (iseq)->argc) { \
- argument_error((iseq), ((ci)->argc), (iseq)->argc, (iseq)->argc); \
- } \
- (ci)->aux.opt_pc = 0; \
- CI_SET_FASTPATH((ci), UNLIKELY((ci)->flag & VM_CALL_TAILCALL) ? vm_call_iseq_setup_tailcall : vm_call_iseq_setup_normal, !(is_lambda) && !((ci)->me->flag & NOEX_PROTECTED)); \
- } \
- else { \
- (ci)->aux.opt_pc = vm_callee_setup_arg_complex((th), (ci), (iseq), (argv)); \
+static inline void
+vm_callee_setup_arg(rb_thread_t *th, rb_call_info_t *ci, const rb_iseq_t *iseq,
+ VALUE *argv, int is_lambda)
+{
+ if (LIKELY(iseq->arg_simple & 0x01)) {
+ /* simple check */
+ if (ci->argc != iseq->argc) {
+ argument_error(iseq, ci->argc, iseq->argc, iseq->argc);
+ }
+ ci->aux.opt_pc = 0;
+ CI_SET_FASTPATH(ci,
+ (UNLIKELY(ci->flag & VM_CALL_TAILCALL) ?
+ vm_call_iseq_setup_tailcall :
+ vm_call_iseq_setup_normal),
+ (!is_lambda &&
+ !(ci->flag & VM_CALL_ARGS_SPLAT) && /* argc may differ for each calls */
+ !(ci->me->flag & NOEX_PROTECTED)));
+ }
+ else {
+ ci->aux.opt_pc = vm_callee_setup_arg_complex(th, ci, iseq, argv);
}
+}
static VALUE
vm_call_iseq_setup(rb_thread_t *th, rb_control_frame_t *cfp, rb_call_info_t *ci)
{
- VM_CALLEE_SETUP_ARG(th, ci, ci->me->def->body.iseq, cfp->sp - ci->argc, 0);
+ vm_callee_setup_arg(th, ci, ci->me->def->body.iseq, cfp->sp - ci->argc, 0);
return vm_call_iseq_setup_2(th, cfp, ci);
}
@@ -2303,7 +2313,7 @@ vm_yield_setup_args(rb_thread_t * const th, const rb_iseq_t *iseq,
ci_entry.flag = 0;
ci_entry.argc = argc;
ci_entry.blockptr = (rb_block_t *)blockptr;
- VM_CALLEE_SETUP_ARG(th, &ci_entry, iseq, argv, 1);
+ vm_callee_setup_arg(th, &ci_entry, iseq, argv, 1);
return ci_entry.aux.opt_pc;
}
else {