GitHub

Original file line numberDiff line numberDiff line change

@@ -1834,7 +1834,6 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *begin_proc, const mrb_code *iseq

18341834
18351835

CASE(OP_SSEND, BBB) {

18361836

regs[a] = regs[0];

1837-

insn = OP_SEND;

18381837

}

18391838

goto L_SENDB;

18401839

@@ -1886,7 +1885,7 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *begin_proc, const mrb_code *iseq

18861885

}

18871886
18881887

mrb_assert(bidx < irep->nregs);

1889-

if (insn == OP_SEND) {

1888+

if (insn == OP_SEND || insn == OP_SSEND) {

18901889

/* clear block argument */

18911890

SET_NIL_VALUE(regs[new_bidx]);

18921891

SET_NIL_VALUE(blk);

@@ -1907,6 +1906,16 @@ mrb_vm_exec(mrb_state *mrb, const struct RProc *begin_proc, const mrb_code *iseq

19071906

else {

19081907

ci->mid = mid;

19091908

}

1909+

if (insn == OP_SEND || insn == OP_SENDB) {

1910+

if (m.flags & MRB_METHOD_PRIVATE_FL) {

1911+

mrb_value args = (ci->n == 15) ? regs[1] : mrb_ary_new_from_values(mrb, ci->n, regs+1);

1912+

mrb_no_method_error(mrb, mid, args, "private method '%n' called for %T", mid, recv);

1913+

}

1914+

else if ((m.flags & MRB_METHOD_PROTECTED_FL) && mrb_obj_is_kind_of(mrb, recv, ci->u.target_class)) {

1915+

mrb_value args = (ci->n == 15) ? regs[1] : mrb_ary_new_from_values(mrb, ci->n, regs+1);

1916+

mrb_no_method_error(mrb, mid, args, "proteced method '%n' called for %T", mid, recv);

1917+

}

1918+

}

19101919

ci->cci = CINFO_NONE;

19111920
19121921

if (MRB_METHOD_PROC_P(m)) {

Read the original on github.com ↗