From 3dcebce5235276e99a75c6b0c71f4f3c4f4e225c Mon Sep 17 00:00:00 2001 From: ko1 Date: Thu, 24 May 2012 06:09:23 +0000 Subject: * vm.c: add RubyVM::Backtrace object (btobj). Backtrace information contains an array consists of location information for each frames by string. RubyVM::Backtrace object is lightweight backtrace information, which contains complete information to generate traditional style backtrace (an array of strings) with faster generation. If someone accesses to backtrace information via Exception#backtrace, then convert a RubyVM::Backtrace object to traditonal style backtrace. This change causes incompatibility on marshal dumpped binary of Exception. If you have any trouble on it, please tell us before Ruby 2.0 release. Note that RubyVM::Backtrace object should not expose Ruby level. * error.c, eval.c, vm_eval.c: ditto. * internal.h: ditto. * eval_error.c: fix to skip "set_backtrace" method invocation in creating an exception object if it call a normal set_backtrace method (defined by core). * test/ruby/test_settracefunc.rb: fix for above change. * vm_method.c (rb_method_defined_by): added. This function checks that the given object responds with the given method by the given cfunc. * benchmark/bm_vm2_raise1.rb, benchmark/bm_vm2_raise2.rb: add to measure exception creation speed. raise1 create exception objects from shallow stack frame. raise2 create exception objects from deep stack frame. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35769 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval_error.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'eval_error.c') diff --git a/eval_error.c b/eval_error.c index e7eb9cf0fc..a2e95a759f 100644 --- a/eval_error.c +++ b/eval_error.c @@ -58,6 +58,17 @@ rb_get_backtrace(VALUE info) static void set_backtrace(VALUE info, VALUE bt) { + ID set_backtrace = rb_intern("set_backtrace"); + + if (rb_backtrace_p(bt)) { + if (rb_method_defined_by(info, set_backtrace, rb_exc_set_backtrace)) { + rb_exc_set_backtrace(info, bt); + return; + } + else { + bt = rb_backtrace_to_str_ary(bt); + } + } rb_funcall(info, rb_intern("set_backtrace"), 1, bt); } -- cgit v1.2.3