summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNARUSE, Yui <naruse@airemix.jp>2021-02-02 19:09:40 +0900
committerNARUSE, Yui <naruse@airemix.jp>2021-02-02 19:09:40 +0900
commit71b4638ca29a5d8a7d6f72e453513035d2096f47 (patch)
tree7feee157dc3a6429beba070577273e99dd6ff29d
parente9843cdaee26387310384fa0a1d43d450b017350 (diff)
merge revision(s) 1cdae49d39fbaef654df487f168d1fb14a146d59: [Backport #17577]
Implement NameError::message#clone for Ractor --- bootstraptest/test_ractor.rb | 13 +++++++++++++ error.c | 35 +++++++++++++++++++++++++++++++++-- test/objspace/test_objspace.rb | 9 +++++++++ 3 files changed, 55 insertions(+), 2 deletions(-)
-rw-r--r--bootstraptest/test_ractor.rb13
-rw-r--r--error.c35
-rw-r--r--test/objspace/test_objspace.rb9
-rw-r--r--version.h2
4 files changed, 56 insertions, 3 deletions
diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb
index 56add68403..1c29a2b799 100644
--- a/bootstraptest/test_ractor.rb
+++ b/bootstraptest/test_ractor.rb
@@ -1325,4 +1325,17 @@ assert_equal "#{n}#{n}", %Q{
}.map{|r| r.take}.join
}
+# NameError
+assert_equal "ok", %q{
+ begin
+ bar
+ rescue => err
+ end
+ begin
+ Ractor.new{} << err
+ rescue TypeError
+ 'ok'
+ end
+}
+
end # if !ENV['GITHUB_WORKFLOW']
diff --git a/error.c b/error.c
index 5e3e4e358b..5d8cb82b62 100644
--- a/error.c
+++ b/error.c
@@ -1847,9 +1847,9 @@ static const rb_data_type_t name_err_mesg_data_type = {
/* :nodoc: */
static VALUE
-rb_name_err_mesg_new(VALUE mesg, VALUE recv, VALUE method)
+rb_name_err_mesg_init(VALUE klass, VALUE mesg, VALUE recv, VALUE method)
{
- VALUE result = TypedData_Wrap_Struct(rb_cNameErrorMesg, &name_err_mesg_data_type, 0);
+ VALUE result = TypedData_Wrap_Struct(klass, &name_err_mesg_data_type, 0);
VALUE *ptr = ALLOC_N(VALUE, NAME_ERR_MESG_COUNT);
ptr[NAME_ERR_MESG__MESG] = mesg;
@@ -1861,6 +1861,35 @@ rb_name_err_mesg_new(VALUE mesg, VALUE recv, VALUE method)
/* :nodoc: */
static VALUE
+rb_name_err_mesg_new(VALUE mesg, VALUE recv, VALUE method)
+{
+ return rb_name_err_mesg_init(rb_cNameErrorMesg, mesg, recv, method);
+}
+
+/* :nodoc: */
+static VALUE
+name_err_mesg_alloc(VALUE klass)
+{
+ return rb_name_err_mesg_init(klass, Qnil, Qnil, Qnil);
+}
+
+/* :nodoc: */
+static VALUE
+name_err_mesg_init_copy(VALUE obj1, VALUE obj2)
+{
+ VALUE *ptr1, *ptr2;
+
+ if (obj1 == obj2) return obj1;
+ rb_obj_init_copy(obj1, obj2);
+
+ TypedData_Get_Struct(obj1, VALUE, &name_err_mesg_data_type, ptr1);
+ TypedData_Get_Struct(obj2, VALUE, &name_err_mesg_data_type, ptr2);
+ MEMCPY(ptr1, ptr2, VALUE, NAME_ERR_MESG_COUNT);
+ return obj1;
+}
+
+/* :nodoc: */
+static VALUE
name_err_mesg_equal(VALUE obj1, VALUE obj2)
{
VALUE *ptr1, *ptr2;
@@ -2787,6 +2816,8 @@ Init_Exception(void)
rb_define_method(rb_eNameError, "receiver", name_err_receiver, 0);
rb_define_method(rb_eNameError, "local_variables", name_err_local_variables, 0);
rb_cNameErrorMesg = rb_define_class_under(rb_eNameError, "message", rb_cObject);
+ rb_define_alloc_func(rb_cNameErrorMesg, name_err_mesg_alloc);
+ rb_define_method(rb_cNameErrorMesg, "initialize_copy", name_err_mesg_init_copy, 1);
rb_define_method(rb_cNameErrorMesg, "==", name_err_mesg_equal, 1);
rb_define_method(rb_cNameErrorMesg, "to_str", name_err_mesg_to_str, 0);
rb_define_method(rb_cNameErrorMesg, "_dump", name_err_mesg_dump, 1);
diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb
index 230c1d0513..6b956e6d14 100644
--- a/test/objspace/test_objspace.rb
+++ b/test/objspace/test_objspace.rb
@@ -528,6 +528,15 @@ class TestObjSpace < Test::Unit::TestCase
children.each {|child| ObjectSpace.internal_class_of(child).itself} # this used to crash
end
+ def test_name_error_message
+ begin
+ bar
+ rescue => err
+ _, m = ObjectSpace.reachable_objects_from(err)
+ end
+ assert_equal(m, m.clone)
+ end
+
def traverse_super_classes klass
while klass
klass = ObjectSpace.internal_super_of(klass)
diff --git a/version.h b/version.h
index 6b0931ab26..92d387bb1d 100644
--- a/version.h
+++ b/version.h
@@ -12,7 +12,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 31
+#define RUBY_PATCHLEVEL 32
#define RUBY_RELEASE_YEAR 2021
#define RUBY_RELEASE_MONTH 2