summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-06-11 04:52:35 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-06-11 04:52:35 +0000
commit0f11cda48ca73fdcdbbe9f72e185d017d218d196 (patch)
tree3ba6fa12639efff4d80631963f7d3aa024d1908c
parent2d2b6460f48f82bdf7bee6a396293e2dc942e1a9 (diff)
forwardable.rb: optimize awy __send__
* lib/forwardable.rb (_delegator_method): remove __send__ call if possible, so that more optimizations will be enabled. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55376 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--lib/forwardable.rb12
2 files changed, 16 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index acf0d73..848d50a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Jun 11 13:52:33 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/forwardable.rb (_delegator_method): remove __send__ call if
+ possible, so that more optimizations will be enabled.
+
Sat Jun 11 11:24:36 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* enc/iso_8859.h (SHARP_s): name frequently used codepoint.
diff --git a/lib/forwardable.rb b/lib/forwardable.rb
index 26c5bf7..fce560d 100644
--- a/lib/forwardable.rb
+++ b/lib/forwardable.rb
@@ -195,13 +195,23 @@ module Forwardable
accessor = "#{accessor}()"
end
+ unless begin
+ iseq = RubyVM::InstructionSequence
+ .compile("().#{method}", nil, nil, 0, false)
+ rescue SyntaxError
+ else
+ iseq.to_a.dig(-1, 1, 1, :mid) == method.to_sym
+ end
+ method = "__send__ :#{method},"
+ end
+
line_no = __LINE__+1; str = "#{<<-"begin;"}\n#{<<-"end;"}"
begin;
proc do
def #{ali}(*args, &block)
begin
#{accessor}
- end.__send__ :#{method}, *args, &block
+ end.#{method} *args, &block
end
end
end;