Skip to content

Commit 61703c6

Browse files
committed
WIP
1 parent f86909e commit 61703c6

File tree

3 files changed

+21
-12
lines changed

3 files changed

+21
-12
lines changed

compile.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1442,7 +1442,7 @@ new_insn_body(rb_iseq_t *iseq, const NODE *const line_node, enum ruby_vminsn_typ
14421442
}
14431443

14441444
static const struct rb_callinfo *
1445-
new_callinfo(rb_iseq_t *iseq, ID mid, int argc, unsigned int flag, struct rb_callinfo_kwarg *kw_arg, int has_blockiseq)
1445+
new_callinfo(rb_iseq_t *iseq, ID mid, int argc, unsigned int flag, const struct rb_callinfo_kwarg *kw_arg, int has_blockiseq)
14461446
{
14471447
VM_ASSERT(argc >= 0);
14481448

@@ -3933,12 +3933,16 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
39333933
switch (vm_ci_mid(ci)) {
39343934
case idNew:
39353935
iobj->insn_id = BIN(opt_new);
3936+
fprintf(stderr, "operand_size = %d\n", iobj->operand_size);
39363937
// TODO: add a second call_data for `#initialize`
3938+
//
3939+
// const struct rb_callinfo * new_ci = (struct rb_callinfo *)iobj->operands[0];
3940+
iobj->operands[1] = (VALUE)new_callinfo(iseq, idInitialize, vm_ci_argc(ci), vm_ci_flag(ci) | VM_CALL_FCALL, vm_ci_kwarg(ci), FALSE);
39373941
break;
39383942
default:
39393943
iobj->insn_id = BIN(opt_send_without_block);
3944+
iobj->operand_size = insn_len(iobj->insn_id) - 1;
39403945
}
3941-
iobj->operand_size = insn_len(iobj->insn_id) - 1;
39423946
}
39433947
}
39443948
#undef SP_INSN

defs/id.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ firstline, predefined = __LINE__+1, %[\
55
hash
66
freeze
77
nil?
8+
new
89
inspect
910
intern
1011
object_id

insns.def

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ opt_send_without_block
831831
/* Invoke constructor */
832832
DEFINE_INSN
833833
opt_new
834-
(CALL_DATA cd)
834+
(CALL_DATA cd, CALL_DATA cd_initialize)
835835
(...)
836836
(VALUE val)
837837
// attr bool handles_sp = true;
@@ -842,20 +842,24 @@ opt_new
842842

843843
val = vm_opt_new_alloc(GET_ISEQ(), recv, cd);
844844
if (val != Qundef) {
845+
TOPN(vm_ci_argc(cd->ci)) = val;
845846
fprintf(stderr, "opt!\n");
846-
// TODO: call initialize (need a second CALL_DATA).
847+
if (vm_sendish(ec, GET_CFP(), cd_initialize, VM_BLOCK_HANDLER_NONE, mexp_search_method) == Qundef) {
848+
val = Qundef;
849+
}
847850
}
848-
else {
851+
852+
if (val == Qundef) {
849853
fprintf(stderr, "de-opt!\n");
850-
}
851854

852-
VALUE bh = VM_BLOCK_HANDLER_NONE;
853-
val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method);
854-
JIT_EXEC(ec, val);
855+
VALUE bh = VM_BLOCK_HANDLER_NONE;
856+
val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method);
857+
JIT_EXEC(ec, val);
855858

856-
if (val == Qundef) {
857-
RESTORE_REGS();
858-
NEXT_INSN();
859+
if (val == Qundef) {
860+
RESTORE_REGS();
861+
NEXT_INSN();
862+
}
859863
}
860864
}
861865

0 commit comments

Comments
 (0)