diff options
author | Takashi Kokubun <[email protected]> | 2024-11-12 20:47:48 -0800 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2024-11-13 12:27:26 -0800 |
commit | 01db456196e17eb067f70eb1d4fceba143a51c01 (patch) | |
tree | 93676cc4ad94e59998f8b273cd18bfecc08b517f | |
parent | c9a5a71695af4596346e70f29dddb9ddb6106177 (diff) |
Move Array#map to Ruby
Co-Authored-By: Aaron Patterson <[email protected]>
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/12074
-rw-r--r-- | array.rb | 25 | ||||
-rw-r--r-- | iseq.c | 1 | ||||
-rw-r--r-- | numeric.rb | 1 | ||||
-rw-r--r-- | test/-ext-/debug/test_debug.rb | 13 | ||||
-rw-r--r-- | test/-ext-/debug/test_profile_frames.rb | 3 | ||||
-rw-r--r-- | test/ruby/test_settracefunc.rb | 12 |
6 files changed, 43 insertions, 12 deletions
@@ -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 @@ -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"); diff --git a/numeric.rb b/numeric.rb index 9b134a35ae..571f9b6314 100644 --- a/numeric.rb +++ b/numeric.rb @@ -338,6 +338,7 @@ class Integer yield from from = from.pred end + self end end end diff --git a/test/-ext-/debug/test_debug.rb b/test/-ext-/debug/test_debug.rb index b244eb41ea..98e178e34f 100644 --- a/test/-ext-/debug/test_debug.rb +++ b/test/-ext-/debug/test_debug.rb @@ -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) diff --git a/test/-ext-/debug/test_profile_frames.rb b/test/-ext-/debug/test_profile_frames.rb index bd819266df..d79c94c468 100644 --- a/test/-ext-/debug/test_profile_frames.rb +++ b/test/-ext-/debug/test_profile_frames.rb @@ -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) diff --git a/test/ruby/test_settracefunc.rb b/test/ruby/test_settracefunc.rb index 868015947e..472d66fbba 100644 --- a/test/ruby/test_settracefunc.rb +++ b/test/ruby/test_settracefunc.rb @@ -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{ |