diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-08-08 07:52:19 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-08-08 07:52:19 +0000 |
commit | 93b6f8d6195564d0884ee00f536a951f4c26288c (patch) | |
tree | ab922f8c850c7dda9d155e52b078026b6006dcb3 /compile.c | |
parent | 8637eac4066dedd2c716f385e22a9d31100b68c7 (diff) | |
download | ruby-93b6f8d6195564d0884ee00f536a951f4c26288c.tar.gz |
* compile.c, insns.def (checkmatch):
remove checkincludearray instruction and
add new instruction checkmatch.
This change is to solve
[Bug #4438] "rescue args type check omitted".
* iseq.c: increment ISEQ_MAJOR_VERSION because removal of
checkincludearray instruction.
* vm_core.h: add several definitions for
the checkmatch instruction.
* vm_insnhelper.c (check_match): added.
* bootstraptest/test_exception.rb: add a test.
* test/ruby/test_exception.rb: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36658 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 25 |
1 files changed, 12 insertions, 13 deletions
@@ -2458,6 +2458,8 @@ when_vals(rb_iseq_t *iseq, LINK_ANCHOR *cond_seq, NODE *vals, LABEL *l1, int onl } } + ADD_INSN(cond_seq, nd_line(val), dup); /* dup target */ + if (nd_type(val) == NODE_STR) { debugp_param("nd_lit", val->nd_lit); OBJ_FREEZE(val->nd_lit); @@ -2466,8 +2468,8 @@ when_vals(rb_iseq_t *iseq, LINK_ANCHOR *cond_seq, NODE *vals, LABEL *l1, int onl else { COMPILE(cond_seq, "when cond", val); } - ADD_INSN1(cond_seq, nd_line(val), topn, INT2FIX(1)); - ADD_SEND(cond_seq, nd_line(val), ID2SYM(idEqq), INT2FIX(1)); + + ADD_INSN1(cond_seq, nd_line(vals), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE)); ADD_INSNL(cond_seq, nd_line(val), branchif, l1); vals = vals->nd_next; } @@ -3207,8 +3209,9 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) case NODE_ARGSCAT: case NODE_ARGSPUSH: only_special_literals = 0; + ADD_INSN (cond_seq, nd_line(vals), dup); COMPILE(cond_seq, "when/cond splat", vals); - ADD_INSN1(cond_seq, nd_line(vals), checkincludearray, Qtrue); + ADD_INSN1(cond_seq, nd_line(vals), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE | VM_CHECKMATCH_ARRAY)); ADD_INSNL(cond_seq, nd_line(vals), branchif, l1); break; default: @@ -3289,8 +3292,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) case NODE_ARGSPUSH: ADD_INSN(ret, nd_line(vals), putnil); COMPILE(ret, "when2/cond splat", vals); - ADD_INSN1(ret, nd_line(vals), checkincludearray, Qfalse); - ADD_INSN(ret, nd_line(vals), pop); + ADD_INSN1(ret, nd_line(vals), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_WHEN | VM_CHECKMATCH_ARRAY)); ADD_INSNL(ret, nd_line(vals), branchif, l1); break; default: @@ -3687,9 +3689,9 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) switch (nd_type(narg)) { case NODE_ARRAY: while (narg) { - COMPILE(ret, "rescue arg", narg->nd_head); ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(2), INT2FIX(0)); - ADD_SEND(ret, nd_line(node), ID2SYM(idEqq), INT2FIX(1)); + COMPILE(ret, "rescue arg", narg->nd_head); + ADD_INSN1(ret, nd_line(node), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); ADD_INSNL(ret, nd_line(node), branchif, label_hit); narg = narg->nd_next; } @@ -3699,9 +3701,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) case NODE_ARGSPUSH: ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(2), INT2FIX(0)); COMPILE(ret, "rescue/cond splat", narg); - ADD_INSN1(ret, nd_line(node), checkincludearray, Qtrue); - ADD_INSN(ret, nd_line(node), swap); - ADD_INSN(ret, nd_line(node), pop); + ADD_INSN1(ret, nd_line(node), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE | VM_CHECKMATCH_ARRAY)); ADD_INSNL(ret, nd_line(node), branchif, label_hit); break; default: @@ -3710,10 +3710,9 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) } } else { - ADD_INSN1(ret, nd_line(node), putobject, - rb_eStandardError); ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(2), INT2FIX(0)); - ADD_SEND(ret, nd_line(node), ID2SYM(idEqq), INT2FIX(1)); + ADD_INSN1(ret, nd_line(node), putobject, rb_eStandardError); + ADD_INSN1(ret, nd_line(node), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); ADD_INSNL(ret, nd_line(node), branchif, label_hit); } ADD_INSNL(ret, nd_line(node), jump, label_miss); |