summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-10-21 14:42:15 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-10-21 14:42:15 +0000
commit06d9340f2e1491697625afbf1fe94137e252319c (patch)
treed3af38d76c2d5e8ce896c7ea146941ccd7f0c1e6 /eval.c
parent8af34b7b33714eeb0f0dead1ce79a98b780ddb22 (diff)
* 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
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c33
1 files changed, 22 insertions, 11 deletions
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);
}