summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-08-14 10:14:51 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-08-14 23:11:58 +0900
commitedd27e120eca13be1754d4111dfc3cf2ab2f99f8 (patch)
tree6d48dd5af0445211bd828eb5c130a7ffc6259d97
parentd58620e0a1d03518a5cb49b954008d70ac7898d2 (diff)
A comment for typed data in `rb_check_type` [ci skip]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4741
-rw-r--r--error.c8
-rw-r--r--include/ruby/internal/value_type.h4
2 files changed, 9 insertions, 3 deletions
diff --git a/error.c b/error.c
index 5ac0f0913e..ef01e94044 100644
--- a/error.c
+++ b/error.c
@@ -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 {