summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-08-23 02:26:02 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-08-23 02:26:02 +0000
commit0f711026e2da7ebcd8933c987d8b0a835f1ae153 (patch)
treed57544dd3e014b5fcc89b901592745e3e94ca923 /gc.c
parente96ba1d647a27f81ae35fe4ae117e71a7401d3c4 (diff)
gc.c: run all finalizers
* gc.c (run_finalizer): revert r59155 partially. finalizing loop should continue even after an exception is rescued. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59647 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/gc.c b/gc.c
index ad83006ea0..8525085541 100644
--- a/gc.c
+++ b/gc.c
@@ -2796,16 +2796,15 @@ run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
saved.finished = 0;
TH_PUSH_TAG(th);
- if ((state = TH_EXEC_TAG()) == TAG_NONE) {
- for (i = saved.finished;
- RESTORE_FINALIZER(), i<RARRAY_LEN(table);
- saved.finished = ++i) {
- run_single_final(RARRAY_AREF(table, i), saved.objid);
- }
- }
- else {
+ state = TH_EXEC_TAG();
+ if (state != TAG_NONE) {
++saved.finished; /* skip failed finalizer */
}
+ for (i = saved.finished;
+ RESTORE_FINALIZER(), i<RARRAY_LEN(table);
+ saved.finished = ++i) {
+ run_single_final(RARRAY_AREF(table, i), saved.objid);
+ }
TH_POP_TAG();
#undef RESTORE_FINALIZER
}