diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2021-08-14 10:14:51 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2021-08-14 23:11:58 +0900 |
commit | edd27e120eca13be1754d4111dfc3cf2ab2f99f8 (patch) | |
tree | 6d48dd5af0445211bd828eb5c130a7ffc6259d97 | |
parent | d58620e0a1d03518a5cb49b954008d70ac7898d2 (diff) | |
download | ruby-edd27e120eca13be1754d4111dfc3cf2ab2f99f8.tar.gz |
A comment for typed data in `rb_check_type` [ci skip]
-rw-r--r-- | error.c | 8 | ||||
-rw-r--r-- | include/ruby/internal/value_type.h | 4 |
2 files changed, 9 insertions, 3 deletions
@@ -1007,6 +1007,14 @@ rb_check_type(VALUE x, int t) xt = TYPE(x); if (xt != t || (xt == T_DATA && RTYPEDDATA_P(x))) { + /* + * Typed data is not simple `T_DATA`, but in a sense an + * extension of `struct RVALUE`, which are incompatible with + * each other except when inherited. + * + * So it is not enough to just check `T_DATA`, it must be + * identified by its `type` using `Check_TypedStruct` instead. + */ unexpected_type(x, xt, t); } } diff --git a/include/ruby/internal/value_type.h b/include/ruby/internal/value_type.h index 790fc3bc6b..5642686c7b 100644 --- a/include/ruby/internal/value_type.h +++ b/include/ruby/internal/value_type.h @@ -340,9 +340,7 @@ Check_Type(VALUE v, enum ruby_value_type t) goto unexpected_type; } else if (t == RUBY_T_DATA && rbimpl_rtypeddata_p(v)) { - /* The intention itself is not necessarily clear to me, but at least it - * is intentional to rule out typed data here. See commit - * a7c32bf81d3391cfb78cfda278f469717d0fb794. */ + /* Typed data is not simple `T_DATA`, see `rb_check_type` */ goto unexpected_type; } else { |