summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-09 03:51:39 +0000
committertenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-09 03:51:39 +0000
commit4df71924e47bc0da8bbc3a08f814c48350131585 (patch)
tree26250b1a2ab441f51e7e8811dbf7416f84b4f929
parent095b27946454cec5237e1ce229623e98905a937e (diff)
* ext/psych/lib/psych/visitors/yaml_tree.rb: Rescue exceptions when
people implement the method method. Thanks Lin Jen-Shin. [ruby-core:35255] * test/psych/visitors/test_yaml_tree.rb: test for implementation of method method. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31075 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog9
-rw-r--r--ext/psych/lib/psych/visitors/yaml_tree.rb34
-rw-r--r--test/psych/visitors/test_yaml_tree.rb6
3 files changed, 37 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index e4abc668d94..f53d098de9d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Wed Mar 9 12:50:24 2011 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: Rescue exceptions when
+ people implement the method method. Thanks Lin Jen-Shin.
+ [ruby-core:35255]
+
+ * test/psych/visitors/test_yaml_tree.rb: test for implementation of
+ method method.
+
Wed Mar 9 11:53:31 2011 NARUSE, Yui <naruse@ruby-lang.org>
* enc/shift_jis.c: Change SJIS as an alias of Windows-31J.
diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb
index 719720a45bc..84ebc90a7ec 100644
--- a/ext/psych/lib/psych/visitors/yaml_tree.rb
+++ b/ext/psych/lib/psych/visitors/yaml_tree.rb
@@ -79,15 +79,20 @@ module Psych
end
if target.respond_to?(:to_yaml)
- loc = target.method(:to_yaml).source_location.first
- if loc !~ /(syck\/rubytypes.rb|psych\/core_ext.rb)/
- unless target.respond_to?(:encode_with)
- if $VERBOSE
- warn "implementing to_yaml is deprecated, please implement \"encode_with\""
+ begin
+ loc = target.method(:to_yaml).source_location.first
+ if loc !~ /(syck\/rubytypes.rb|psych\/core_ext.rb)/
+ unless target.respond_to?(:encode_with)
+ if $VERBOSE
+ warn "implementing to_yaml is deprecated, please implement \"encode_with\""
+ end
+
+ target.to_yaml(:nodump => true)
end
-
- target.to_yaml(:nodump => true)
end
+ rescue
+ # public_method or source_location might be overridden,
+ # and it's OK to skip it since it's only to emit a warning
end
end
@@ -300,12 +305,17 @@ module Psych
# FIXME: remove this method once "to_yaml_properties" is removed
def find_ivars target
- loc = target.method(:to_yaml_properties).source_location.first
- unless loc.start_with?(Psych::DEPRECATED) || loc.end_with?('rubytypes.rb')
- if $VERBOSE
- warn "#{loc}: to_yaml_properties is deprecated, please implement \"encode_with(coder)\""
+ begin
+ loc = target.method(:to_yaml_properties).source_location.first
+ unless loc.start_with?(Psych::DEPRECATED) || loc.end_with?('rubytypes.rb')
+ if $VERBOSE
+ warn "#{loc}: to_yaml_properties is deprecated, please implement \"encode_with(coder)\""
+ end
+ return target.to_yaml_properties
end
- return target.to_yaml_properties
+ rescue
+ # public_method or source_location might be overridden,
+ # and it's OK to skip it since it's only to emit a warning.
end
target.instance_variables
diff --git a/test/psych/visitors/test_yaml_tree.rb b/test/psych/visitors/test_yaml_tree.rb
index ed89e786006..1cf0d634c89 100644
--- a/test/psych/visitors/test_yaml_tree.rb
+++ b/test/psych/visitors/test_yaml_tree.rb
@@ -38,6 +38,12 @@ module Psych
assert_equal s.foo, obj.foo
end
+ def test_override_method
+ s = Struct.new(:method).new('override')
+ obj = Psych.load(Psych.dump(s))
+ assert_equal s.method, obj.method
+ end
+
def test_exception
ex = Exception.new 'foo'
loaded = Psych.load(Psych.dump(ex))