Implement NameError::message#clone for Ractor
This commit is contained in:
parent
0dd38902b9
commit
1cdae49d39
Notes:
git
2021-02-01 19:54:52 +09:00
@ -1350,4 +1350,17 @@ assert_equal "#{n}#{n}", %Q{
|
|||||||
}.map{|r| r.take}.join
|
}.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']
|
end # if !ENV['GITHUB_WORKFLOW']
|
||||||
|
35
error.c
35
error.c
@ -1862,9 +1862,9 @@ static const rb_data_type_t name_err_mesg_data_type = {
|
|||||||
|
|
||||||
/* :nodoc: */
|
/* :nodoc: */
|
||||||
static VALUE
|
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);
|
VALUE *ptr = ALLOC_N(VALUE, NAME_ERR_MESG_COUNT);
|
||||||
|
|
||||||
ptr[NAME_ERR_MESG__MESG] = mesg;
|
ptr[NAME_ERR_MESG__MESG] = mesg;
|
||||||
@ -1874,6 +1874,35 @@ rb_name_err_mesg_new(VALUE mesg, VALUE recv, VALUE method)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* :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: */
|
/* :nodoc: */
|
||||||
static VALUE
|
static VALUE
|
||||||
name_err_mesg_equal(VALUE obj1, VALUE obj2)
|
name_err_mesg_equal(VALUE obj1, VALUE obj2)
|
||||||
@ -2802,6 +2831,8 @@ Init_Exception(void)
|
|||||||
rb_define_method(rb_eNameError, "receiver", name_err_receiver, 0);
|
rb_define_method(rb_eNameError, "receiver", name_err_receiver, 0);
|
||||||
rb_define_method(rb_eNameError, "local_variables", name_err_local_variables, 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_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, "==", name_err_mesg_equal, 1);
|
||||||
rb_define_method(rb_cNameErrorMesg, "to_str", name_err_mesg_to_str, 0);
|
rb_define_method(rb_cNameErrorMesg, "to_str", name_err_mesg_to_str, 0);
|
||||||
rb_define_method(rb_cNameErrorMesg, "_dump", name_err_mesg_dump, 1);
|
rb_define_method(rb_cNameErrorMesg, "_dump", name_err_mesg_dump, 1);
|
||||||
|
@ -528,6 +528,15 @@ class TestObjSpace < Test::Unit::TestCase
|
|||||||
children.each {|child| ObjectSpace.internal_class_of(child).itself} # this used to crash
|
children.each {|child| ObjectSpace.internal_class_of(child).itself} # this used to crash
|
||||||
end
|
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
|
def traverse_super_classes klass
|
||||||
while klass
|
while klass
|
||||||
klass = ObjectSpace.internal_super_of(klass)
|
klass = ObjectSpace.internal_super_of(klass)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user