Skip to content

Commit

Permalink
eval.c: preserve errinfo
Browse files Browse the repository at this point in the history
* eval.c (rb_ensure): preserve errinfo accross ensure proc before
  JUMP_TAG().  [ruby-core:52022] [Bug #7802]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39156 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
nobu committed Feb 8, 2013
1 parent 49c5a3d commit 98932f5
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 0 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
@@ -1,3 +1,8 @@
Fri Feb 8 16:09:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>

* eval.c (rb_ensure): preserve errinfo accross ensure proc before
JUMP_TAG(). [ruby-core:52022] [Bug #7802]

Fri Feb 8 16:08:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>

* test/ruby/envutil.rb (assert_separately): check also terminating
Expand Down
4 changes: 4 additions & 0 deletions eval.c
Expand Up @@ -805,6 +805,8 @@ rb_ensure(VALUE (*b_proc)(ANYARGS), VALUE data1, VALUE (*e_proc)(ANYARGS), VALUE
{
int state;
volatile VALUE result = Qnil;
volatile VALUE errinfo;
rb_thread_t *const th = GET_THREAD();

PUSH_TAG();
if ((state = EXEC_TAG()) == 0) {
Expand All @@ -813,7 +815,9 @@ rb_ensure(VALUE (*b_proc)(ANYARGS), VALUE data1, VALUE (*e_proc)(ANYARGS), VALUE
POP_TAG();
/* TODO: fix me */
/* retval = prot_tag ? prot_tag->retval : Qnil; */ /* save retval */
errinfo = th->errinfo;
(*e_proc) (data2);
th->errinfo = errinfo;
if (state)
JUMP_TAG(state);
return result;
Expand Down
25 changes: 25 additions & 0 deletions ext/-test-/exception/ensured.c
@@ -0,0 +1,25 @@
#include <ruby.h>

static VALUE
begin(VALUE object)
{
return rb_funcall(object, rb_intern("try_method"), 0);
}

static VALUE
ensure(VALUE object)
{
return rb_funcall(object, rb_intern("ensured_method"), 0);
}

static VALUE
ensured(VALUE module, VALUE object)
{
return rb_ensure(begin, object, ensure, object);
}

void
Init_ensured(VALUE klass)
{
rb_define_module_function(klass, "ensured", ensured, 1);
}
32 changes: 32 additions & 0 deletions test/-ext-/exception/test_ensured.rb
@@ -0,0 +1,32 @@
require 'test/unit'
require_relative '../../ruby/envutil'

module Bug
class Bug7802 < RuntimeError
end

class TestException < Test::Unit::TestCase
def test_ensured
assert_separately([], <<-'end;') # do
require '-test-/exception'
module Bug
class Bug7802 < RuntimeError
def try_method
raise self
end
def ensured_method
[1].detect {|i| true}
end
end
end
assert_raise(Bug::Bug7802, '[ruby-core:52022] [Bug #7802]') {
Bug::Exception.ensured(Bug::Bug7802.new)
}
end;
end
end
end

0 comments on commit 98932f5

Please sign in to comment.