Feature #11569

Optimize Proc#call

Added by ko1 (Koichi Sasada) about 5 years ago. Updated about 5 years ago.

Target version:


Some years ago, I added optimized Proc#call that skips construction of a method frame for Proc#call and call block directly.
That time, test-all shows some failures.

However, I tried it now it doesn't show any errors.
So that I will enable it.

This change introduces incompatibilities.

(1) Backtrace doesn't show Proc#call line.

  puts caller(0)

# current
test.rb:4:in `block in <main>'
test.rb:5:in `call'
test.rb:5:in `<main>'

# optimized
../../trunk/test.rb:4:in `block in <main>'
../../trunk/test.rb:5:in `<main>'

(2) TracePoint ignores Proc#call call.{|tp| p tp}.enable

# current
#<TracePoint:c_call `call'@test.rb:2>

# optimized

Let me know if you have trouble with these incompatibilities.

BTW, Object#send has already same technique (and behavior with (1), (2)).

Related issues

Related to Ruby master - Bug #12332: [PATCH] proc.c: fix RDoc of Proc#===/call/yield/[]ClosedActions

Updated by ko1 (Koichi Sasada) about 5 years ago

  • Status changed from Open to Closed

Applied in changeset r52050.

  • proc.c: enable optimization of Proc#call. [Feature #11569]
  • NEWS: write about this optimization and incompatibilities.
  • test/ruby/test_backtrace.rb: catch up this fix.

Updated by usa (Usaku NAKAMURA) over 4 years ago

  • Related to Bug #12332: [PATCH] proc.c: fix RDoc of Proc#===/call/yield/[] added

Also available in: Atom PDF