зеркало из 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
|
||||||
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
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{
|
||||||
|
|
Загрузка…
Ссылка в новой задаче