From 808e9289e6031eba0241e7be159669f8fd0073a3 Mon Sep 17 00:00:00 2001 From: akr Date: Mon, 21 Apr 2003 21:14:08 +0000 Subject: * lib/resolv.rb (Resolv::DNS::Resource#hash): use XOR to accumulate hash value. * lib/tsort.rb (TSort#each_strongly_connected_component): don't use block argument. (each_strongly_connected_component_from): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3710 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/resolv.rb | 6 +++--- lib/tsort.rb | 26 ++++++++++++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/resolv.rb b/lib/resolv.rb index a29d8de27f..23356a2272 100644 --- a/lib/resolv.rb +++ b/lib/resolv.rb @@ -1272,7 +1272,7 @@ class Resolv def hash h = 0 self.instance_variables.each {|name| - h += self.instance_eval("#{name}.hash") + h ^= self.instance_eval("#{name}.hash") } return h end @@ -1550,7 +1550,7 @@ class Resolv def initialize(address) unless address.kind_of?(String) && address.length == 4 - raise ArgumentError.new('IPv4 address muse be 4 bytes') + raise ArgumentError.new('IPv4 address must be 4 bytes') end @address = address end @@ -1658,7 +1658,7 @@ class Resolv def initialize(address) unless address.kind_of?(String) && address.length == 16 - raise ArgumentError.new('IPv6 address muse be 16 bytes') + raise ArgumentError.new('IPv6 address must be 16 bytes') end @address = address end diff --git a/lib/tsort.rb b/lib/tsort.rb index 7832030792..3bf8c33bbf 100644 --- a/lib/tsort.rb +++ b/lib/tsort.rb @@ -199,18 +199,20 @@ module TSort result end - def each_strongly_connected_component(&block) + def each_strongly_connected_component id_map = {} stack = [] tsort_each_node {|node| unless id_map.include? node - each_strongly_connected_component_from(node, id_map, stack, &block) + each_strongly_connected_component_from(node, id_map, stack) {|c| + yield c + } end } nil end - def each_strongly_connected_component_from(node, id_map={}, stack=[], &block) + def each_strongly_connected_component_from(node, id_map={}, stack=[]) minimum_id = node_id = id_map[node] = id_map.size stack_length = stack.length stack << node @@ -221,7 +223,9 @@ module TSort minimum_id = child_id if child_id && child_id < minimum_id else sub_minimum_id = - each_strongly_connected_component_from(child, id_map, stack, &block) + each_strongly_connected_component_from(child, id_map, stack) {|c| + yield c + } minimum_id = sub_minimum_id if sub_minimum_id < minimum_id end } @@ -286,6 +290,20 @@ if __FILE__ == $0 assert_equal([[0], [1]], a.strongly_connected_components.map {|nodes| nodes.sort}) end + + def orphaned_proc(block_str) + eval "lambda {#{block_str}}" + end + + def test_orphaned_break + a = [[1], [2], []] + @n = 0 + x = orphaned_proc %{|c| @n += 1; break :break_value} + assert_nothing_raised { + assert_equal(:break_value, a.each_strongly_connected_component(&x)) + } + assert_equal(1, @n) + end end end -- cgit v1.2.3