summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compile.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/compile.c b/compile.c
index bd41fef..3e34994 100644
--- a/compile.c
+++ b/compile.c
@@ -2001,11 +2001,19 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
}
if (iobj->insn_id == BIN(pop)) {
+ /*
+ * putself / putnil / putobject obj / putstring "..."
+ * pop
+ * =>
+ * # do nothing
+ */
LINK_ELEMENT *prev = iobj->link.prev;
if (prev->type == ISEQ_ELEMENT_INSN) {
enum ruby_vminsn_type previ = ((INSN *)prev)->insn_id;
if (previ == BIN(putobject) || previ == BIN(putnil) ||
previ == BIN(putself) || previ == BIN(putstring)) {
+ /* just push operand or static value and pop soon, no
+ * side effects */
REMOVE_ELEM(prev);
REMOVE_ELEM(&iobj->link);
}