Co-Authored-By: Aaron Patterson <tenderlove@ruby-lang.org>
This commit is contained in:
Takashi Kokubun 2024-11-12 20:47:48 -08:00
Родитель c9a5a71695
Коммит 01db456196
6 изменённых файлов: 43 добавлений и 12 удалений

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

@ -233,6 +233,31 @@ class Array
end end
end end
if Primitive.rb_builtin_basic_definition_p(:map)
undef :map
def map # :nodoc:
Primitive.attr! :inline_block, :c_trace
unless defined?(yield)
return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)'
end
_i = 0
value = nil
result = Primitive.ary_sized_alloc
while Primitive.cexpr!(%q{ ary_fetch_next(self, LOCAL_PTR(_i), LOCAL_PTR(value)) })
result << yield(value)
end
result
end
if Primitive.rb_builtin_basic_definition_p(:collect)
undef :collect
alias collect map
end
end
if Primitive.rb_builtin_basic_definition_p(:select) if Primitive.rb_builtin_basic_definition_p(:select)
undef :select undef :select

1
iseq.c
Просмотреть файл

@ -2749,6 +2749,7 @@ rb_iseq_disasm_recursive(const rb_iseq_t *iseq, VALUE indent)
disasm_builtin_attr(str, iseq, LEAF); disasm_builtin_attr(str, iseq, LEAF);
disasm_builtin_attr(str, iseq, SINGLE_NOARG_LEAF); disasm_builtin_attr(str, iseq, SINGLE_NOARG_LEAF);
disasm_builtin_attr(str, iseq, INLINE_BLOCK); disasm_builtin_attr(str, iseq, INLINE_BLOCK);
disasm_builtin_attr(str, iseq, C_TRACE);
} }
rb_str_cat2(str, "\n"); rb_str_cat2(str, "\n");

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

@ -338,6 +338,7 @@ class Integer
yield from yield from
from = from.pred from = from.pred
end end
self
end end
end end
end end

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

@ -26,11 +26,14 @@ class TestDebug < Test::Unit::TestCase
count[:iseq] += 1 count[:iseq] += 1
assert_instance_of(RubyVM::InstructionSequence, iseq, msg) assert_instance_of(RubyVM::InstructionSequence, iseq, msg)
# check same location # Backtraces and source locations don't match for :c_trace methods
assert_equal(loc.path, iseq.path, msg) unless iseq.disasm.include?('C_TRACE')
assert_equal(loc.absolute_path, iseq.absolute_path, msg) # check same location
#assert_equal(loc.label, iseq.label, msg) assert_equal(loc.path, iseq.path, msg)
assert_operator(loc.lineno, :>=, iseq.first_lineno, msg) assert_equal(loc.absolute_path, iseq.absolute_path, msg)
#assert_equal(loc.label, iseq.label, msg)
assert_operator(loc.lineno, :>=, iseq.first_lineno, msg)
end
end end
assert_instance_of(Thread::Backtrace::Location, loc, msg) assert_instance_of(Thread::Backtrace::Location, loc, msg)

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

@ -209,8 +209,9 @@ class TestProfileFrames < Test::Unit::TestCase
profile_frames.shift profile_frames.shift
# The rest of the stack is expected to look the same... # The rest of the stack is expected to look the same...
backtrace_locations.zip(profile_frames).each.with_index do |(location, (path, absolute_path, _, base_label, _, _, _, _, _, _, lineno)), i| backtrace_locations.zip(profile_frames).each.with_index do |(location, (path, absolute_path, _, base_label, label, _, _, _, _, _, lineno)), i|
next if absolute_path == "<cfunc>" # ...except for cfunc frames next if absolute_path == "<cfunc>" # ...except for cfunc frames
next if label in "Array#each" | "Array#map" # ...except for :c_trace method frames
err_msg = "#{i}th frame" err_msg = "#{i}th frame"
assert_equal(location.absolute_path, absolute_path, err_msg) assert_equal(location.absolute_path, absolute_path, err_msg)

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

@ -658,7 +658,7 @@ CODE
1: set_trace_func(lambda{|event, file, line, id, binding, klass| 1: set_trace_func(lambda{|event, file, line, id, binding, klass|
2: events << [event, line, file, klass, id, binding&.eval('self'), binding&.eval("_local_var")] if file == 'xyzzy' 2: events << [event, line, file, klass, id, binding&.eval('self'), binding&.eval("_local_var")] if file == 'xyzzy'
3: }) 3: })
4: [1].map{|;_local_var| _local_var = :inner 4: [1].map!{|;_local_var| _local_var = :inner
5: tap{} 5: tap{}
6: } 6: }
7: class XYZZY 7: class XYZZY
@ -1062,7 +1062,7 @@ CODE
/return/ =~ tp.event ? tp.return_value : nil /return/ =~ tp.event ? tp.return_value : nil
] ]
}.enable{ }.enable{
[1].map{ [1].map!{
3 3
} }
method_for_test_tracepoint_block{ method_for_test_tracepoint_block{
@ -1072,10 +1072,10 @@ CODE
# pp events # pp events
# expected_events = # expected_events =
[[:b_call, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, nil], [[:b_call, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, nil],
[:c_call, :map, Array, Array, nil], [:c_call, :map!, Array, Array, nil],
[:b_call, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, nil], [:b_call, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, nil],
[:b_return, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, 3], [:b_return, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, 3],
[:c_return, :map, Array, Array, [3]], [:c_return, :map!, Array, Array, [3]],
[:call, :method_for_test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, nil], [:call, :method_for_test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, nil],
[:b_call, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, nil], [:b_call, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, nil],
[:b_return, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, 4], [:b_return, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, 4],
@ -1382,7 +1382,7 @@ CODE
events << tp.event events << tp.event
log << "| event:#{ tp.event } method_id:#{ tp.method_id } #{ tp.path }:#{ tp.lineno }" log << "| event:#{ tp.event } method_id:#{ tp.method_id } #{ tp.path }:#{ tp.lineno }"
}.enable{ }.enable{
[1].map{ [1].map!{
3 3
} }
method_for_test_tracepoint_block{ method_for_test_tracepoint_block{
@ -1406,7 +1406,7 @@ CODE
events << tp.event events << tp.event
log << "| event:#{ tp.event } method_id:#{ tp.method_id } #{ tp.path }:#{ tp.lineno }" log << "| event:#{ tp.event } method_id:#{ tp.method_id } #{ tp.path }:#{ tp.lineno }"
}.enable{ }.enable{
[1].map{ [1].map!{
3 3
} }
method_for_test_tracepoint_block{ method_for_test_tracepoint_block{