MJIT: Handle JIT failure properly

This commit is contained in:
Takashi Kokubun 2022-06-15 15:57:27 -07:00
Родитель 1e8fed2d2a
Коммит 5310147bb8
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 6FFC433B12EE23DD
2 изменённых файлов: 21 добавлений и 1 удалений

10
mjit.c
Просмотреть файл

@ -244,7 +244,15 @@ check_unit_queue(void)
current_cc_ms = real_ms_time(); current_cc_ms = real_ms_time();
current_cc_unit = unit; current_cc_unit = unit;
current_cc_pid = start_mjit_compile(unit); current_cc_pid = start_mjit_compile(unit);
// TODO: handle -1
// JIT failure
if (current_cc_pid == -1) {
current_cc_pid = 0;
current_cc_unit->iseq->body->jit_func = (mjit_func_t)NOT_COMPILED_JIT_ISEQ_FUNC;
current_cc_unit = NULL;
return;
}
if (mjit_opts.wait) { if (mjit_opts.wait) {
mjit_wait(unit->iseq->body); mjit_wait(unit->iseq->body);
} }

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

@ -1198,6 +1198,18 @@ class TestMJIT < Test::Unit::TestCase
end end
end if defined?(fork) end if defined?(fork)
def test_jit_failure
_, err = eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", min_calls: 1, verbose: 1)
begin;
1.times do
class A
end
end
end;
assert_match(/^MJIT warning: .+ unsupported instruction: defineclass/, err)
assert_match(/^JIT failure: block in <main>/, err)
end
private private
# The shortest way to test one proc # The shortest way to test one proc