[前][次][番号順一覧][スレッド一覧]

ruby-changes:44775

From: nobu <ko1@a...>
Date: Sun, 20 Nov 2016 11:12:52 +0900 (JST)
Subject: [ruby-changes:44775] nobu:r56848 (trunk): forwardable/impl.rb

nobu	2016-11-20 11:12:48 +0900 (Sun, 20 Nov 2016)

  New Revision: 56848

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=56848

  Log:
    forwardable/impl.rb
    
    * lib/forwardable/impl.rb (_valid_method?, _compile_method):
      extract to separate implementation specific part.
      [ruby-core:78138] [Bug #12938]

  Added directories:
    trunk/ext/rubyvm/
    trunk/ext/rubyvm/lib/
    trunk/ext/rubyvm/lib/forwardable/
    trunk/lib/forwardable/
  Added files:
    trunk/ext/rubyvm/extconf.rb
    trunk/ext/rubyvm/lib/forwardable/impl.rb
    trunk/lib/forwardable/impl.rb
  Modified files:
    trunk/lib/forwardable.rb
Index: lib/forwardable/impl.rb
===================================================================
--- lib/forwardable/impl.rb	(revision 0)
+++ lib/forwardable/impl.rb	(revision 56848)
@@ -0,0 +1,24 @@ https://github.com/ruby/ruby/blob/trunk/lib/forwardable/impl.rb#L1
+# :stopdoc:
+module Forwardable
+  FILE_REGEXP = %r"#{Regexp.quote(File.dirname(__FILE__))}"
+  FILTER_EXCEPTION = <<-'END'
+
+        rescue ::Exception
+          $@.delete_if {|s| ::Forwardable::FILE_REGEXP =~ s} unless ::Forwardable::debug
+          ::Kernel::raise
+  END
+
+  def self._valid_method?(method)
+    catch {|tag|
+      eval("BEGIN{throw tag}; ().#{method}", binding, __FILE__, __LINE__)
+    }
+  rescue SyntaxError
+    false
+  else
+    true
+  end
+
+  def self._compile_method(src, file, line)
+    eval(src, nil, file, line)
+  end
+end

Property changes on: lib/forwardable/impl.rb
___________________________________________________________________
Added: svn:eol-style
   + LF

Index: lib/forwardable.rb
===================================================================
--- lib/forwardable.rb	(revision 56847)
+++ lib/forwardable.rb	(revision 56848)
@@ -110,8 +110,10 @@ https://github.com/ruby/ruby/blob/trunk/lib/forwardable.rb#L110
 # +delegate.rb+.
 #
 module Forwardable
+  require 'forwardable/impl'
+
   # Version of +forwardable.rb+
-  FORWARDABLE_VERSION = "1.1.0"
+  FORWARDABLE_VERSION = "1.2.0"
 
   @debug = nil
   class << self
@@ -195,14 +197,8 @@ module Forwardable https://github.com/ruby/ruby/blob/trunk/lib/forwardable.rb#L197
       accessor = "#{accessor}()"
     end
 
-    vm = RubyVM::InstructionSequence
     method_call = ".__send__(:#{method}, *args, &block)"
-    if begin
-         iseq = vm.compile("().#{method}", nil, nil, 0, false)
-       rescue SyntaxError
-       else
-         iseq.to_a.dig(-1, 1, 1, :mid) == method.to_sym
-       end
+    if _valid_method?(method)
       loc, = caller_locations(2,1)
       pre = "_ ="
       mesg = "#{Module === obj ? obj : obj.class}\##{ali} at #{loc.path}:#{loc.lineno} forwarding to private method "
@@ -217,22 +213,17 @@ module Forwardable https://github.com/ruby/ruby/blob/trunk/lib/forwardable.rb#L213
         end;
     end
 
-    line_no = __LINE__+1; str = "#{<<-"begin;"}\n#{<<-"end;"}"
+    _compile_method("#{<<-"begin;"}\n#{<<-"end;"}", __FILE__, __LINE__+1)
     begin;
       proc do
         def #{ali}(*args, &block)
           #{pre}
           begin
             #{accessor}
-          end#{method_call}
+          end#{method_call}#{FILTER_EXCEPTION}
         end
       end
     end;
-
-    vm.compile(str, __FILE__, __FILE__, line_no,
-               trace_instruction: false,
-               tailcall_optimization: true)
-      .eval
   end
 end
 
Index: ext/rubyvm/lib/forwardable/impl.rb
===================================================================
--- ext/rubyvm/lib/forwardable/impl.rb	(revision 0)
+++ ext/rubyvm/lib/forwardable/impl.rb	(revision 56848)
@@ -0,0 +1,19 @@ https://github.com/ruby/ruby/blob/trunk/ext/rubyvm/lib/forwardable/impl.rb#L1
+# :stopdoc:
+module Forwardable
+  FILTER_EXCEPTION = ""
+
+  def self._valid_method?(method)
+    iseq = RubyVM::InstructionSequence.compile("().#{method}", nil, nil, 0, false)
+  rescue SyntaxError => e
+    false
+  else
+    iseq.to_a.dig(-1, 1, 1, :mid) == method.to_sym
+  end
+
+  def self._compile_method(src, file, line)
+    RubyVM::InstructionSequence.compile(src, file, file, line,
+               trace_instruction: false,
+               tailcall_optimization: true)
+      .eval
+  end
+end

Property changes on: ext/rubyvm/lib/forwardable/impl.rb
___________________________________________________________________
Added: svn:eol-style
   + LF

Index: ext/rubyvm/extconf.rb
===================================================================
--- ext/rubyvm/extconf.rb	(revision 0)
+++ ext/rubyvm/extconf.rb	(revision 56848)
@@ -0,0 +1 @@
+create_makefile("rubyvm")

Property changes on: ext/rubyvm/extconf.rb
___________________________________________________________________
Added: svn:eol-style
   + LF


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]