Skip to content

Commit 68b4f62

Browse files
tenderloveKaanOzkan
authored andcommitted
specialize 1 param 1 local
1 parent c8eaf88 commit 68b4f62

1 file changed

Lines changed: 32 additions & 2 deletions

File tree

vm_insnhelper.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5274,6 +5274,28 @@ vm_invoke_iseq_block(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
52745274
return Qundef;
52755275
}
52765276

5277+
static VALUE
5278+
vm_invoke_iseq_block_cc_param_1_local_1(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
5279+
struct rb_calling_info *calling) {
5280+
VALUE block_handler = VM_CF_BLOCK_HANDLER(GET_CFP());
5281+
const struct rb_captured_block *captured = VM_BH_TO_ISEQ_BLOCK(block_handler);
5282+
const rb_iseq_t *iseq = rb_iseq_check(captured->code.iseq);
5283+
const int arg_size = 1;
5284+
VALUE * const rsp = GET_SP() - 1;
5285+
5286+
SET_SP(rsp);
5287+
5288+
vm_push_frame(ec, iseq,
5289+
VM_FRAME_MAGIC_BLOCK,
5290+
captured->self,
5291+
VM_GUARDED_PREV_EP(captured->ep), 0,
5292+
ISEQ_BODY(iseq)->iseq_encoded,
5293+
rsp + arg_size,
5294+
1 - arg_size, ISEQ_BODY(iseq)->stack_max);
5295+
5296+
return Qundef;
5297+
}
5298+
52775299
static VALUE
52785300
vm_invoke_iseq_block_cc(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp,
52795301
struct rb_calling_info *calling) {
@@ -5999,8 +6021,9 @@ vm_invokeblock_fastpath(struct rb_execution_context_struct *ec,
59996021
else {
60006022
if (rb_simple_iseq_p(callee_iseq) &&
60016023
(vm_ci_flag(ci) & VM_CALL_ARGS_SIMPLE) &&
6002-
vm_ci_argc(ci) == (unsigned int)ISEQ_BODY(callee_iseq)->param.lead_num &&
6024+
vm_ci_argc(ci) == (unsigned int)ISEQ_BODY(callee_iseq)->param.size &&
60036025
ISEQ_BODY(callee_iseq)->param.flags.ambiguous_param0) {
6026+
60046027
if (!ISEQ_BODY(callee_iseq)->block_ccs) {
60056028
ISEQ_BODY(callee_iseq)->block_ccs = ZALLOC(struct rb_class_cc_entries);
60066029
}
@@ -6014,7 +6037,14 @@ vm_invokeblock_fastpath(struct rb_execution_context_struct *ec,
60146037
return ccs->entries[i].cc;
60156038
}
60166039
}
6017-
ret = vm_cc_new((VALUE)callee_iseq, NULL, vm_invoke_iseq_block_cc, cc_type_block);
6040+
6041+
if (argc == 1 && ISEQ_BODY(callee_iseq)->local_table_size == 1) {
6042+
ret = vm_cc_new((VALUE)callee_iseq, NULL, vm_invoke_iseq_block_cc_param_1_local_1, cc_type_block);
6043+
}
6044+
else {
6045+
ret = vm_cc_new((VALUE)callee_iseq, NULL, vm_invoke_iseq_block_cc, cc_type_block);
6046+
}
6047+
60186048
cd->cc = ret;
60196049
RB_OBJ_WRITTEN(reg_cfp->iseq, Qundef, ret);
60206050
vm_ccs_push((VALUE)callee_iseq, ISEQ_BODY(callee_iseq)->block_ccs, ci, ret);

0 commit comments

Comments
 (0)