summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2024-11-12 20:47:48 -0800
committerTakashi Kokubun <[email protected]>2024-11-13 12:27:26 -0800
commit01db456196e17eb067f70eb1d4fceba143a51c01 (patch)
tree93676cc4ad94e59998f8b273cd18bfecc08b517f
parentc9a5a71695af4596346e70f29dddb9ddb6106177 (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.rb25
-rw-r--r--iseq.c1
-rw-r--r--numeric.rb1
-rw-r--r--test/-ext-/debug/test_debug.rb13
-rw-r--r--test/-ext-/debug/test_profile_frames.rb3
-rw-r--r--test/ruby/test_settracefunc.rb12
6 files changed, 43 insertions, 12 deletions
diff --git a/array.rb b/array.rb
index ec204c2478..638a6b4674 100644
--- a/array.rb
+++ b/array.rb
@@ -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
diff --git a/iseq.c b/iseq.c
index 9faf01e613..7f59ea0ceb 100644
--- a/iseq.c
+++ b/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");
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{