зеркало из https://github.com/github/ruby.git
Move Array#map to Ruby
Co-Authored-By: Aaron Patterson <tenderlove@ruby-lang.org>
This commit is contained in:
Родитель
c9a5a71695
Коммит
01db456196
25
array.rb
25
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
|
||||
|
||||
|
|
1
iseq.c
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{
|
||||
|
|
Загрузка…
Ссылка в новой задаче