1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Avoid jumping to a wrong destination

when the next insn is already compiled by former branches.
This commit is contained in:
Takashi Kokubun 2020-02-18 23:16:19 -08:00
parent f0b815dc67
commit c4794ed73a
No known key found for this signature in database
GPG key ID: 6FFC433B12EE23DD
2 changed files with 17 additions and 2 deletions

View file

@ -828,6 +828,16 @@ class TestJIT < Test::Unit::TestCase
end;
end
def test_jump_to_precompiled_branch
assert_eval_with_jit("#{<<~'begin;'}\n#{<<~'end;'}", stdout: ".0", success_count: 1, min_calls: 1)
begin;
def test(foo)
".#{foo unless foo == 1}" if true
end
print test(0)
end;
end
def test_clean_so
if RUBY_PLATFORM.match?(/mswin/)
skip 'Removing so file is randomly failing on AppVeyor/RubyCI mswin due to Permission Denied.'

View file

@ -76,9 +76,14 @@
}
fprintf(f, "}\n");
%
% # compiler: If insn has conditional JUMP, the branch which is not targeted by JUMP should be compiled too.
% # compiler: If insn has conditional JUMP, the code should go to the branch not targeted by JUMP next.
% if insn.expr.expr =~ /if\s+\([^{}]+\)\s+\{[^{}]+JUMP\([^)]+\);[^{}]+\}/
compile_insns(f, body, b->stack_size, pos + insn_len(insn), status);
if (ALREADY_COMPILED_P(status, pos + insn_len(insn))) {
fprintf(f, "goto label_%d;\n", pos + insn_len(insn));
}
else {
compile_insns(f, body, b->stack_size, pos + insn_len(insn), status);
}
% end
%
% # compiler: If insn returns (leave) or does longjmp (throw), the branch should no longer be compiled. TODO: create attr for it?