Skip to content

Commit b0db0bd

Browse files
committed
vm.c: add checks for visibility (private, protected); close #1835
1 parent aba9a7d commit b0db0bd

1 file changed

Lines changed: 11 additions & 2 deletions

File tree

src/vm.c

Lines changed: 11 additions & 2 deletions
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)) {

0 commit comments

Comments
 (0)