diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-08-23 02:26:02 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-08-23 02:26:02 +0000 |
commit | 0f711026e2da7ebcd8933c987d8b0a835f1ae153 (patch) | |
tree | d57544dd3e014b5fcc89b901592745e3e94ca923 /gc.c | |
parent | e96ba1d647a27f81ae35fe4ae117e71a7401d3c4 (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.c | 15 |
1 files changed, 7 insertions, 8 deletions
@@ -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 } |