diff options
| author | nagachika <nagachika@ruby-lang.org> | 2024-01-18 11:48:46 +0900 |
|---|---|---|
| committer | nagachika <nagachika@ruby-lang.org> | 2024-01-18 11:48:46 +0900 |
| commit | 0cc0e43745ffc13a596441adccee295274d99a0b (patch) | |
| tree | 83220c77a06e44aa9e8dc10310d2d1dc22d9078e | |
| parent | 3bd9adadbe0b500cf7e910c99db97aaddfba3369 (diff) | |
merge revision(s) f9a48548cf3ef54fc0a385ccd78c708737055ecc: [Backport #20042]
restore the stack pointer on finalizer
When error on finalizer, the exception will be ignored.
To restart the code, we need to restore the stack pointer.
fix [Bug #20042]
---
gc.c | 4 ++++
test/ruby/test_gc.rb | 9 +++++++++
2 files changed, 13 insertions(+)
| -rw-r--r-- | gc.c | 4 | ||||
| -rw-r--r-- | test/ruby/test_gc.rb | 9 | ||||
| -rw-r--r-- | version.h | 2 |
3 files changed, 14 insertions, 1 deletions
@@ -4358,16 +4358,20 @@ run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table) VALUE objid; VALUE final; rb_control_frame_t *cfp; + VALUE *sp; long finished; } saved; + rb_execution_context_t * volatile ec = GET_EC(); #define RESTORE_FINALIZER() (\ ec->cfp = saved.cfp, \ + ec->cfp->sp = saved.sp, \ ec->errinfo = saved.errinfo) saved.errinfo = ec->errinfo; saved.objid = rb_obj_id(obj); saved.cfp = ec->cfp; + saved.sp = ec->cfp->sp; saved.finished = 0; saved.final = Qundef; diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index 4251321119..bb136656ce 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -609,6 +609,15 @@ class TestGc < Test::Unit::TestCase obj = nil end end; + + assert_normal_exit "#{<<~"begin;"}\n#{<<~'end;'}", '[Bug #20042]' + begin; + def (f = Object.new).call = nil # missing ID + o = Object.new + ObjectSpace.define_finalizer(o, f) + o = nil + GC.start + end; end def test_object_ids_never_repeat @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 2 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 150 +#define RUBY_PATCHLEVEL 151 #include "ruby/version.h" #include "ruby/internal/abi.h" |
