From 56b1b93a0c504b93f7536effca155c0fdeebeb8e Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 7 Oct 2021 11:01:37 -0400 Subject: Feedback, tests, and rebase for kwargs --- bootstraptest/test_yjit.rb | 77 ++++++++++++++++++++++++++++++---------------- yjit.c | 5 +++ yjit_codegen.c | 6 ++-- 3 files changed, 58 insertions(+), 30 deletions(-) diff --git a/bootstraptest/test_yjit.rb b/bootstraptest/test_yjit.rb index cf4a65fea2..100cb99cee 100644 --- a/bootstraptest/test_yjit.rb +++ b/bootstraptest/test_yjit.rb @@ -2074,37 +2074,60 @@ assert_equal '["sub", "sub"]', %q{ [foo(sub), foo(sub)] } -assert_equal '[[1, 2, 3, 4]]', %q{ - def four(a:, b:, c:, d:) - [a, b, c, d] +# leading and keyword arguments are swapped into the right order +assert_equal '[[1, 2, 3, 4, 5, 6]]', %q{ + def kwargs(five, six, a:, b:, c:, d:) + [a, b, c, d, five, six] end 5.times.flat_map do [ - four(a: 1, b: 2, c: 3, d: 4), - four(a: 1, b: 2, d: 4, c: 3), - four(a: 1, c: 3, b: 2, d: 4), - four(a: 1, c: 3, d: 4, b: 2), - four(a: 1, d: 4, b: 2, c: 3), - four(a: 1, d: 4, c: 3, b: 2), - four(b: 2, a: 1, c: 3, d: 4), - four(b: 2, a: 1, d: 4, c: 3), - four(b: 2, c: 3, a: 1, d: 4), - four(b: 2, c: 3, d: 4, a: 1), - four(b: 2, d: 4, a: 1, c: 3), - four(b: 2, d: 4, c: 3, a: 1), - four(c: 3, a: 1, b: 2, d: 4), - four(c: 3, a: 1, d: 4, b: 2), - four(c: 3, b: 2, a: 1, d: 4), - four(c: 3, b: 2, d: 4, a: 1), - four(c: 3, d: 4, a: 1, b: 2), - four(c: 3, d: 4, b: 2, a: 1), - four(d: 4, a: 1, b: 2, c: 3), - four(d: 4, a: 1, c: 3, b: 2), - four(d: 4, b: 2, a: 1, c: 3), - four(d: 4, b: 2, c: 3, a: 1), - four(d: 4, c: 3, a: 1, b: 2), - four(d: 4, c: 3, b: 2, a: 1) + kwargs(5, 6, a: 1, b: 2, c: 3, d: 4), + kwargs(5, 6, a: 1, b: 2, d: 4, c: 3), + kwargs(5, 6, a: 1, c: 3, b: 2, d: 4), + kwargs(5, 6, a: 1, c: 3, d: 4, b: 2), + kwargs(5, 6, a: 1, d: 4, b: 2, c: 3), + kwargs(5, 6, a: 1, d: 4, c: 3, b: 2), + kwargs(5, 6, b: 2, a: 1, c: 3, d: 4), + kwargs(5, 6, b: 2, a: 1, d: 4, c: 3), + kwargs(5, 6, b: 2, c: 3, a: 1, d: 4), + kwargs(5, 6, b: 2, c: 3, d: 4, a: 1), + kwargs(5, 6, b: 2, d: 4, a: 1, c: 3), + kwargs(5, 6, b: 2, d: 4, c: 3, a: 1), + kwargs(5, 6, c: 3, a: 1, b: 2, d: 4), + kwargs(5, 6, c: 3, a: 1, d: 4, b: 2), + kwargs(5, 6, c: 3, b: 2, a: 1, d: 4), + kwargs(5, 6, c: 3, b: 2, d: 4, a: 1), + kwargs(5, 6, c: 3, d: 4, a: 1, b: 2), + kwargs(5, 6, c: 3, d: 4, b: 2, a: 1), + kwargs(5, 6, d: 4, a: 1, b: 2, c: 3), + kwargs(5, 6, d: 4, a: 1, c: 3, b: 2), + kwargs(5, 6, d: 4, b: 2, a: 1, c: 3), + kwargs(5, 6, d: 4, b: 2, c: 3, a: 1), + kwargs(5, 6, d: 4, c: 3, a: 1, b: 2), + kwargs(5, 6, d: 4, c: 3, b: 2, a: 1) ] end.uniq } + +# implicit hashes get skipped and don't break compilation +assert_equal '[[:key]]', %q{ + def implicit(hash) + hash.keys + end + + 5.times.map { implicit(key: :value) }.uniq +} + +# default values on keywords don't mess up argument order +assert_equal '[2]', %q{ + def default_value + 1 + end + + def default_expression(value: default_value) + value + end + + 5.times.map { default_expression(value: 2) }.uniq +} diff --git a/yjit.c b/yjit.c index 8b2de85b08..dbd9bea25a 100644 --- a/yjit.c +++ b/yjit.c @@ -73,9 +73,14 @@ YJIT_DECLARE_COUNTERS( send_cfunc_argc_mismatch, send_cfunc_toomany_args, send_cfunc_tracing, + send_cfunc_kwargs, + send_attrset_kwargs, send_iseq_tailcall, send_iseq_arity_error, send_iseq_only_keywords, + send_iseq_kwargs_req_and_opt_missing, + send_iseq_kwargs_none_passed, + send_iseq_kwargs_mismatch, send_iseq_complex_callee, send_not_implemented_method, send_getter_arity, diff --git a/yjit_codegen.c b/yjit_codegen.c index 8f49a358cf..fa48df755b 100644 --- a/yjit_codegen.c +++ b/yjit_codegen.c @@ -775,7 +775,7 @@ gen_dupn(jitstate_t *jit, ctx_t *ctx, codeblock_t *cb) } static void -stack_swap(ctx_t* ctx, codeblock_t* cb, int offset0, int offset1, x86opnd_t reg0, x86opnd_t reg1) +stack_swap(ctx_t *ctx, codeblock_t *cb, int offset0, int offset1, x86opnd_t reg0, x86opnd_t reg1) { x86opnd_t opnd0 = ctx_stack_opnd(ctx, offset0); x86opnd_t opnd1 = ctx_stack_opnd(ctx, offset1); @@ -794,7 +794,7 @@ stack_swap(ctx_t* ctx, codeblock_t* cb, int offset0, int offset1, x86opnd_t reg0 // Swap top 2 stack entries static codegen_status_t -gen_swap(jitstate_t* jit, ctx_t* ctx, codeblock_t* cb) +gen_swap(jitstate_t *jit, ctx_t *ctx, codeblock_t *cb) { stack_swap(ctx , cb, 0, 1, REG0, REG1); return YJIT_KEEP_COMPILING; @@ -3819,7 +3819,7 @@ gen_send_general(jitstate_t *jit, ctx_t *ctx, struct rb_call_data *cd, rb_iseq_t } case VM_METHOD_TYPE_ATTRSET: if ((vm_ci_flag(ci) & VM_CALL_KWARG) != 0) { - GEN_COUNTER_INC(cb, send_attrset_keywords); + GEN_COUNTER_INC(cb, send_attrset_kwargs); return YJIT_CANT_COMPILE; } else if (argc != 1 || !RB_TYPE_P(comptime_recv, T_OBJECT)) { GEN_COUNTER_INC(cb, send_ivar_set_method); -- cgit v1.2.3