summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--NEWS3
-rw-r--r--eval.c14
3 files changed, 17 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index fb124518d0..bdca90c727 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Thu Dec 2 23:52:26 2010 URABE Shyouhei <shyouhei@ruby-lang.org>
+
+ * NEWS: entry for ruby_vm_at_exit().
+
+ * eval.c (ruby_cleanup): bug fix around at_exit (1) timing was
+ wrong. (2) execution order was opposite.
+
Thu Dec 2 23:05:14 2010 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/Makefile.sub (RCFLAGS): -nologo switch is only available in
diff --git a/NEWS b/NEWS
index fe1135b7ce..c37ec08463 100644
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,9 @@ with all sufficient information, see the ChangeLog file.
* rb_scan_args() is enhanced with support for option hash argument
extraction.
+* ruby_vm_at_exit() added. This enables extension libs to hool a VM
+ termination.
+
=== Library updates (outstanding ones only)
* builtin classes
diff --git a/eval.c b/eval.c
index e54b5400c8..acfe8e93d5 100644
--- a/eval.c
+++ b/eval.c
@@ -151,13 +151,6 @@ ruby_cleanup(volatile int ex)
}
POP_TAG();
- /* at_exit functions called here; any other place more apropriate
- * for this purpose? let me know if any. */
- for (i=0; i<RARRAY_LEN(ary); i++) {
- ((void(*)(rb_vm_t*))RARRAY_PTR(ary)[i])(vm);
- }
- rb_ary_clear(ary);
-
errs[0] = th->errinfo;
PUSH_TAG();
if ((state = EXEC_TAG()) == 0) {
@@ -172,6 +165,13 @@ ruby_cleanup(volatile int ex)
POP_TAG();
rb_thread_stop_timer_thread();
+ /* at_exit functions called here; any other place more apropriate
+ * for this purpose? let me know if any. */
+ for (i=RARRAY_LEN(ary) - 1; i>=0; i--) {
+ ((void(*)(rb_vm_t*))RARRAY_PTR(ary)[i])(vm);
+ }
+ rb_ary_clear(ary);
+
#if EXIT_SUCCESS != 0 || EXIT_FAILURE != 1
switch (ex) {
#if EXIT_SUCCESS != 0