diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-05-24 06:09:23 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-05-24 06:09:23 +0000 |
commit | 3dcebce5235276e99a75c6b0c71f4f3c4f4e225c (patch) | |
tree | dcc09c9bb210e318e0ada4161c30f8d4405cebb5 /error.c | |
parent | bd5c7507ec8dd484d5eab526c0ea1fa409d2959a (diff) | |
download | ruby-3dcebce5235276e99a75c6b0c71f4f3c4f4e225c.tar.gz |
* 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
Diffstat (limited to 'error.c')
-rw-r--r-- | error.c | 17 |
1 files changed, 13 insertions, 4 deletions
@@ -673,9 +673,17 @@ static VALUE exc_backtrace(VALUE exc) { ID bt; + VALUE obj; CONST_ID(bt, "bt"); - return rb_attr_get(exc, bt); + obj = rb_attr_get(exc, bt); + + if (rb_backtrace_p(obj)) { + obj = rb_backtrace_to_str_ary(obj); + /* rb_iv_set(exc, "bt", obj); */ + } + + return obj; } VALUE @@ -686,6 +694,7 @@ rb_check_backtrace(VALUE bt) if (!NIL_P(bt)) { if (RB_TYPE_P(bt, T_STRING)) return rb_ary_new3(1, bt); + if (rb_backtrace_p(bt)) return bt; if (!RB_TYPE_P(bt, T_ARRAY)) { rb_raise(rb_eTypeError, err); } @@ -708,8 +717,8 @@ rb_check_backtrace(VALUE bt) * */ -static VALUE -exc_set_backtrace(VALUE exc, VALUE bt) +VALUE +rb_exc_set_backtrace(VALUE exc, VALUE bt) { return rb_iv_set(exc, "bt", rb_check_backtrace(bt)); } @@ -1669,7 +1678,7 @@ Init_Exception(void) rb_define_method(rb_eException, "message", exc_message, 0); rb_define_method(rb_eException, "inspect", exc_inspect, 0); rb_define_method(rb_eException, "backtrace", exc_backtrace, 0); - rb_define_method(rb_eException, "set_backtrace", exc_set_backtrace, 1); + rb_define_method(rb_eException, "set_backtrace", rb_exc_set_backtrace, 1); rb_eSystemExit = rb_define_class("SystemExit", rb_eException); rb_define_method(rb_eSystemExit, "initialize", exit_initialize, -1); |