Mark pattern labels as unremoveable

Peephole optimization doesn't play well with find pattern at
least. The only case when a pattern matching could have
unreachable patterns is when we have lasgn/dasgn node, which
shouldn't happen in real-life.

Fixes https://bugs.ruby-lang.org/issues/17534
This commit is contained in:
Vladimir Dementyev 2021-01-19 00:00:52 +03:00 коммит произвёл Nobuyoshi Nakada
Родитель 9d1475c621
Коммит 1b89b99941
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 7CD2805BFA3770C6
2 изменённых файлов: 11 добавлений и 1 удалений

Просмотреть файл

@ -6408,11 +6408,11 @@ compile_case3(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const orig_no
int pat_line = nd_line(pattern);
LABEL *next_pat = NEW_LABEL(pat_line);
ADD_INSN (cond_seq, pat_line, dup);
// NOTE: set deconstructed_pos to the current cached value location
// (it's "under" the matchee value, so it's position is 2)
CHECK(iseq_compile_pattern_each(iseq, cond_seq, pattern, l1, next_pat, FALSE, 2));
ADD_LABEL(cond_seq, next_pat);
LABEL_UNREMOVABLE(next_pat);
}
else {
COMPILE_ERROR(ERROR_ARGS "unexpected node");

Просмотреть файл

@ -791,6 +791,16 @@ END
true
end
end
# https://bugs.ruby-lang.org/issues/17534
assert_block do
case [0, 1, 2]
in x
true
in [*, 2, *]
false
end
end
end
def test_hash_pattern