summaryrefslogtreecommitdiff
path: root/error.c
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2020-06-15 11:37:35 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2020-06-29 11:05:41 +0900
commita2677815f5e18116e37d7eb1d3e876798eb8e6d8 (patch)
treea8f539be7f279d65120800a2fbc691bfb81ae8a0 /error.c
parentc47b805d8cf28d105139b422ed2d30c5e0617a29 (diff)
rb_check_typeddata: do not goto into a branch
I'm not necessarily against every goto in general, but jumping into a branch is definitely a bad idea. Better refactor.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3247
Diffstat (limited to 'error.c')
-rw-r--r--error.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/error.c b/error.c
index fb8602350b..efe7bb39ed 100644
--- a/error.c
+++ b/error.c
@@ -908,23 +908,23 @@ rb_check_typeddata(VALUE obj, const rb_data_type_t *data_type)
const char *etype;
if (!RB_TYPE_P(obj, T_DATA)) {
- wrong_type:
- etype = builtin_class_name(obj);
- if (!etype)
- rb_raise(rb_eTypeError, "wrong argument type %"PRIsVALUE" (expected %s)",
- rb_obj_class(obj), data_type->wrap_struct_name);
- wrong_datatype:
- rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
- etype, data_type->wrap_struct_name);
- }
- if (!RTYPEDDATA_P(obj)) {
- goto wrong_type;
+ etype = builtin_class_name(obj);
+ }
+ else if (!RTYPEDDATA_P(obj)) {
+ etype = builtin_class_name(obj);
}
else if (!rb_typeddata_inherited_p(RTYPEDDATA_TYPE(obj), data_type)) {
- etype = RTYPEDDATA_TYPE(obj)->wrap_struct_name;
- goto wrong_datatype;
+ etype = RTYPEDDATA_TYPE(obj)->wrap_struct_name;
+ }
+ else {
+ return DATA_PTR(obj);
}
- return DATA_PTR(obj);
+
+ /* rb_obj_classname() cannot be used. A class name can be non-ASCII. */
+ const char *expected = data_type->wrap_struct_name;
+ VALUE actual = (etype) ? rb_str_new_cstr(etype) : rb_obj_class(obj);
+ rb_raise(rb_eTypeError, "wrong argument type %"PRIsVALUE" (expected %s)",
+ actual, expected);
}
/* exception classes */