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
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)
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, SINGLE_NOARG_LEAF);
disasm_builtin_attr(str, iseq, INLINE_BLOCK);
disasm_builtin_attr(str, iseq, C_TRACE);
}
rb_str_cat2(str, "\n");

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

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

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

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

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

@ -209,8 +209,9 @@ class TestProfileFrames < Test::Unit::TestCase
profile_frames.shift
# 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 label in "Array#each" | "Array#map" # ...except for :c_trace method frames
err_msg = "#{i}th frame"
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|
2: events << [event, line, file, klass, id, binding&.eval('self'), binding&.eval("_local_var")] if file == 'xyzzy'
3: })
4: [1].map{|;_local_var| _local_var = :inner
4: [1].map!{|;_local_var| _local_var = :inner
5: tap{}
6: }
7: class XYZZY
@ -1062,7 +1062,7 @@ CODE
/return/ =~ tp.event ? tp.return_value : nil
]
}.enable{
[1].map{
[1].map!{
3
}
method_for_test_tracepoint_block{
@ -1072,10 +1072,10 @@ CODE
# pp events
# expected_events =
[[: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_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],
[:b_call, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, nil],
[:b_return, :test_tracepoint_block, TestSetTraceFunc, TestSetTraceFunc, 4],
@ -1382,7 +1382,7 @@ CODE
events << tp.event
log << "| event:#{ tp.event } method_id:#{ tp.method_id } #{ tp.path }:#{ tp.lineno }"
}.enable{
[1].map{
[1].map!{
3
}
method_for_test_tracepoint_block{
@ -1406,7 +1406,7 @@ CODE
events << tp.event
log << "| event:#{ tp.event } method_id:#{ tp.method_id } #{ tp.path }:#{ tp.lineno }"
}.enable{
[1].map{
[1].map!{
3
}
method_for_test_tracepoint_block{