Project

General

Profile

Feature #11569

Optimize Proc#call

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

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-core:<unknown>]

Description

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)
}.call

# 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.

TracePoint.new(:a_call){|tp| p tp}.enable
->{}.call

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

# optimized
#<TracePoint:b_call@../../trunk/test.rb:2>

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
#1

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.
#2

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