From e07a9d845410db939c22d357fdcebca5a7b00006 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Wed, 9 Jan 2019 13:34:51 -0800 Subject: Round trip exception backtraces This commit allows exception backtraces to round trip --- lib/psych/visitors/to_ruby.rb | 2 ++ lib/psych/visitors/yaml_tree.rb | 3 +++ test/psych/test_exception.rb | 14 ++++++++++++++ 3 files changed, 19 insertions(+) diff --git a/lib/psych/visitors/to_ruby.rb b/lib/psych/visitors/to_ruby.rb index 74a52df..c265acb 100644 --- a/lib/psych/visitors/to_ruby.rb +++ b/lib/psych/visitors/to_ruby.rb @@ -252,6 +252,8 @@ module Psych e = build_exception((resolve_class($1) || class_loader.exception), h.delete('message')) + + e.set_backtrace h.delete('backtrace') if h.key? 'backtrace' init_with(e, h, o) when '!set', 'tag:yaml.org,2002:set' diff --git a/lib/psych/visitors/yaml_tree.rb b/lib/psych/visitors/yaml_tree.rb index bc7d235..62d1d5c 100644 --- a/lib/psych/visitors/yaml_tree.rb +++ b/lib/psych/visitors/yaml_tree.rb @@ -472,6 +472,9 @@ module Psych accept msg end + @emitter.scalar 'backtrace', nil, nil, true, false, Nodes::Scalar::ANY + accept o.backtrace + dump_ivars o @emitter.end_mapping diff --git a/test/psych/test_exception.rb b/test/psych/test_exception.rb index df7fd73..e7fc88c 100644 --- a/test/psych/test_exception.rb +++ b/test/psych/test_exception.rb @@ -23,6 +23,20 @@ module Psych $VERBOSE = @orig_verbose end + def make_ex msg = 'oh no!' + begin + raise msg + rescue ::Exception => e + e + end + end + + def test_backtrace + err = make_ex + new_err = Psych.load(Psych.dump(err)) + assert_equal err.backtrace, new_err.backtrace + end + def test_naming_exception err = String.xxx rescue $! new_err = Psych.load(Psych.dump(err)) -- cgit v1.2.3