зеркало из https://github.com/github/ruby.git
_mjit_compile_pc_and_sp.erb: always move pc
to fix the wrong line number on #caller_locations or rb_profile_frames. Actually we would be able to move it only when method call (of caller_locations) or C extension invocation (calling rb_profile_frames) can happen. This degrades performance. Optcarrot fps becomes... before: 71.78976052783555 after: 67.65429356624131 I think I can lazily move it and fix the performance issue, even improving the performance for the situation catch table exists. But let me fix this bug first... git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64283 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
92c03be888
Коммит
d5e27d7a5a
|
@ -795,6 +795,25 @@ class TestJIT < Test::Unit::TestCase
|
|||
end;
|
||||
end
|
||||
|
||||
def test_caller_locations_without_catch_table
|
||||
out, _ = eval_with_jit("#{<<~"begin;"}\n#{<<~"end;"}", min_calls: 1)
|
||||
begin;
|
||||
def b # 2
|
||||
caller_locations.first # 3
|
||||
end # 4
|
||||
# 5
|
||||
def a # 6
|
||||
print # <-- don't leave PC here # 7
|
||||
b # 8
|
||||
end
|
||||
puts a
|
||||
puts a
|
||||
end;
|
||||
lines = out.lines
|
||||
assert_equal("-e:8:in `a'\n", lines[0])
|
||||
assert_equal("-e:8:in `a'\n", lines[1])
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Some tests are stil failing on VC++.
|
||||
|
|
|
@ -7,9 +7,7 @@
|
|||
%
|
||||
% # JIT: Move pc so that catch table lookup condition is met. If the ISeq might not catch an exception,
|
||||
% # the pc motion is optimized away and thus pc should be set properly before `goto cancel`.
|
||||
if (body->catch_except_p) {
|
||||
fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
|
||||
}
|
||||
fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
|
||||
%
|
||||
% # JIT: move sp to use or preserve stack variables
|
||||
if (status->local_stack_p) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче