From 06d9340f2e1491697625afbf1fe94137e252319c Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 21 Oct 2003 14:42:15 +0000 Subject: * eval.c (ruby_cleanup): call finalizers and exit procs before terminating threads. * eval.c (ruby_cleanup): preserve ruby_errinfo before ruby_finalize_0(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4826 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index ac8762bc8f..70061e5fb9 100644 --- a/eval.c +++ b/eval.c @@ -1311,9 +1311,8 @@ ruby_options(argc, argv) void rb_exec_end_proc _((void)); -static int -ruby_finalize_0(ex) - int ex; +static void +ruby_finalize_0() { ruby_errinfo = 0; PUSH_TAG(PROT_NONE); @@ -1322,20 +1321,22 @@ ruby_finalize_0(ex) } POP_TAG(); rb_exec_end_proc(); +} + +static void +ruby_finalize_1() +{ + ruby_errinfo = 0; rb_gc_call_finalizer_at_exit(); trace_func = 0; tracing = 0; - if (ruby_errinfo && rb_obj_is_kind_of(ruby_errinfo, rb_eSystemExit)) { - VALUE st = rb_iv_get(ruby_errinfo, "status"); - return NUM2INT(st); - } - return ex; } void ruby_finalize() { - ruby_finalize_0(EXIT_SUCCESS); + ruby_finalize_0(); + ruby_finalize_1(); } int @@ -1343,8 +1344,10 @@ ruby_cleanup(ex) int ex; { int state; + volatile VALUE err = ruby_errinfo; ruby_safe_level = 0; + ruby_finalize_0(); PUSH_TAG(PROT_NONE); PUSH_ITER(ITER_NOT); if ((state = EXEC_TAG()) == 0) { @@ -1355,10 +1358,16 @@ ruby_cleanup(ex) ex = state; } POP_ITER(); - + ruby_errinfo = err; ex = error_handle(ex); POP_TAG(); - return ruby_finalize_0(ex); + + ruby_finalize_1(); + if (err && rb_obj_is_kind_of(err, rb_eSystemExit)) { + VALUE st = rb_iv_get(err, "status"); + return NUM2INT(st); + } + return ex; } int @@ -3904,6 +3913,8 @@ rb_longjmp(tag, mesg) VALUE at; if (thread_set_raised()) { + printf("%d (c:%p m:%p):", tag, curr_thread, main_thread); + rb_p(mesg); ruby_errinfo = exception_error; JUMP_TAG(TAG_FATAL); } -- cgit v1.2.3