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

ruby-changes:58250

From: Takashi <ko1@a...>
Date: Tue, 15 Oct 2019 13:58:55 +0900 (JST)
Subject: [ruby-changes:58250] c800967acd (master): Simplify circular reference check of IRB::Color

https://git.ruby-lang.org/ruby.git/commit/?id=c800967acd

From c800967acd35a763a6f09fe2b2e29870f064c22e Mon Sep 17 00:00:00 2001
From: Takashi Kokubun <takashikkbn@g...>
Date: Mon, 14 Oct 2019 21:58:13 -0700
Subject: Simplify circular reference check of IRB::Color


diff --git a/lib/irb/color.rb b/lib/irb/color.rb
index 32de6cd..fbcb0bd 100644
--- a/lib/irb/color.rb
+++ b/lib/irb/color.rb
@@ -70,30 +70,20 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/color.rb#L70
         $stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb'))
       end
 
-      def inspect_colorable?(obj, seen = {})
+      def inspect_colorable?(obj, seen: {})
         case obj
         when String, Symbol, Regexp, Integer, Float, FalseClass, TrueClass, NilClass
           true
         when Hash
-          if seen.has_key?(obj.object_id)
-            false
-          else
-            seen[obj.object_id] = true
-            colorable = obj.all? { |k, v| inspect_colorable?(k, seen) && inspect_colorable?(v, seen) }
-            seen.delete(obj.object_id)
-            colorable
+          without_circular_ref(obj, seen: seen) do
+            obj.all? { |k, v| inspect_colorable?(k, seen: seen) && inspect_colorable?(v, seen: seen) }
           end
         when Array
-          if seen.has_key?(obj.object_id)
-            false
-          else
-            seen[obj.object_id] = true
-            colorable = obj.all? { |o| inspect_colorable?(o, seen) }
-            seen.delete(obj.object_id)
-            colorable
+          without_circular_ref(obj, seen: seen) do
+            obj.all? { |o| inspect_colorable?(o, seen: seen) }
           end
         when Range
-          inspect_colorable?(obj.begin, seen) && inspect_colorable?(obj.end, seen)
+          inspect_colorable?(obj.begin, seen: seen) && inspect_colorable?(obj.end, seen: seen)
         when Module
           !obj.name.nil?
         else
@@ -146,6 +136,14 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/color.rb#L136
 
       private
 
+      def without_circular_ref(obj, seen:, &block)
+        return false if seen.key?(obj.object_id)
+        seen[obj.object_id] = true
+        block.call
+      ensure
+        seen.delete(obj.object_id)
+      end
+
       # Ripper::Lexer::Elem#state is supported on Ruby 2.5+
       def supported?
         return @supported if defined?(@supported)
-- 
cgit v0.10.2


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

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