summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-11-18 02:08:17 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-11-18 02:08:17 +0000
commite4fc85dfcf3b089ce8522f8dc694d7ed338603ee (patch)
treefc0aedbc5597150c1a539e8046c1722246a4fef9
parentd8e1939232b5f12ae79aca0975ef222008f4454b (diff)
compile.c: check type before checking insn_id
* compile.c (iseq_peephole_optimize): check element type before checking insn_id which is valid only for INSN elements. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52632 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--compile.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/compile.c b/compile.c
index 2d47082618..f66f12e94b 100644
--- a/compile.c
+++ b/compile.c
@@ -1998,7 +1998,13 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
*/
INSN *nobj = (INSN *)get_destination_insn(iobj);
INSN *pobj = (INSN *)iobj->link.prev;
- int prev_dup = (pobj && pobj->insn_id == BIN(dup));
+ int prev_dup = 0;
+ if (pobj) {
+ if (pobj->link.type != ISEQ_ELEMENT_INSN)
+ pobj = 0;
+ else if (pobj->insn_id == BIN(dup))
+ prev_dup = 1;
+ }
for (;;) {
if (nobj->insn_id == BIN(jump)) {