summaryrefslogtreecommitdiff
path: root/include/ruby
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2025-12-18 09:35:44 +0100
committerJean Boussier <jean.boussier@gmail.com>2025-12-18 20:57:05 +0100
commit8cf4f373ff596aaef7aaec993c355b242d4fe2c1 (patch)
tree733bda871fec6bb5e89874c58a6b6ee982c607e5 /include/ruby
parentbbc684d8300fc3fc02020a9a644b857d090f2215 (diff)
thread_sync.c: declare queue_data_type as parent of szqueue_data_type.
Allows to remove some duplicated code like szqueue_length, etc.
Diffstat (limited to 'include/ruby')
-rw-r--r--include/ruby/internal/core/rtypeddata.h19
1 files changed, 15 insertions, 4 deletions
diff --git a/include/ruby/internal/core/rtypeddata.h b/include/ruby/internal/core/rtypeddata.h
index aed4bd89b8..72044562df 100644
--- a/include/ruby/internal/core/rtypeddata.h
+++ b/include/ruby/internal/core/rtypeddata.h
@@ -615,13 +615,24 @@ RBIMPL_ATTR_ARTIFICIAL()
* directly.
*/
static inline void *
-rbimpl_check_typeddata(VALUE obj, const rb_data_type_t *type)
+rbimpl_check_typeddata(VALUE obj, const rb_data_type_t *expected_type)
{
- if (RB_LIKELY(RB_TYPE_P(obj, T_DATA) && RTYPEDDATA_P(obj) && RTYPEDDATA_TYPE(obj) == type)) {
- return RTYPEDDATA_GET_DATA(obj);
+ if (RB_LIKELY(RB_TYPE_P(obj, T_DATA) && RTYPEDDATA_P(obj))) {
+ const rb_data_type_t *actual_type = RTYPEDDATA_TYPE(obj);
+ void *data = RTYPEDDATA_GET_DATA(obj);
+ if (RB_LIKELY(actual_type == expected_type)) {
+ return data;
+ }
+
+ while (actual_type) {
+ actual_type = actual_type->parent;
+ if (actual_type == expected_type) {
+ return data;
+ }
+ }
}
- return rb_check_typeddata(obj, type);
+ return rb_check_typeddata(obj, expected_type);
}