summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2024-01-18 11:48:46 +0900
committernagachika <nagachika@ruby-lang.org>2024-01-18 11:48:46 +0900
commit0cc0e43745ffc13a596441adccee295274d99a0b (patch)
tree83220c77a06e44aa9e8dc10310d2d1dc22d9078e
parent3bd9adadbe0b500cf7e910c99db97aaddfba3369 (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.c4
-rw-r--r--test/ruby/test_gc.rb9
-rw-r--r--version.h2
3 files changed, 14 insertions, 1 deletions
diff --git a/gc.c b/gc.c
index 94d2369943..5928c68d70 100644
--- a/gc.c
+++ b/gc.c
@@ -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
diff --git a/version.h b/version.h
index 1961da0496..c4baa80715 100644
--- a/version.h
+++ b/version.h
@@ -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"