@@ -485,6 +485,17 @@ RBIMPL_ATTR_NONNULL(())
485485void rb_unexpected_typeddata(const rb_data_type_t *actual, const rb_data_type_t *expected);
486486RBIMPL_SYMBOL_EXPORT_END ()
487487
488+ #if RUBY_DEBUG
489+ # define RBIMPL_TYPEDDATA_PRECONDITION (obj, unreachable ) \
490+ while (RB_UNLIKELY(!RB_TYPE_P(obj, RUBY_T_DATA))) { \
491+ rb_unexpected_object_type (obj, " Data" ); \
492+ unreachable; \
493+ }
494+ #else
495+ # define RBIMPL_TYPEDDATA_PRECONDITION (obj, unreachable ) \
496+ RBIMPL_ASSERT_NOTHING
497+ #endif
498+
488499/* *
489500 * Converts sval, a pointer to your struct, into a Ruby object.
490501 *
@@ -513,7 +524,7 @@ RBIMPL_SYMBOL_EXPORT_END()
513524 */
514525#define TypedData_Make_Struct0 (result, klass, type, size, data_type, sval ) \
515526 VALUE result = rb_data_typed_object_zalloc(klass, size, data_type); \
516- (sval) = RBIMPL_CAST((type *)RTYPEDDATA_GET_DATA (result)); \
527+ (sval) = RBIMPL_CAST((type *)rbimpl_typeddata_get_data (result)); \
517528 RBIMPL_CAST (/* suppress unused variable warnings*/ (void )(sval))
518529
519530/* *
@@ -553,39 +564,35 @@ RBIMPL_SYMBOL_EXPORT_END()
553564static inline bool
554565rbimpl_typeddata_embedded_p (VALUE obj)
555566{
556- #if RUBY_DEBUG
557- if (RB_UNLIKELY (!RB_TYPE_P (obj, RUBY_T_DATA))) {
558- Check_Type (obj, RUBY_T_DATA);
559- RBIMPL_UNREACHABLE_RETURN (false );
560- }
561- #endif
562-
563567 return (RTYPEDDATA (obj)->type ) & TYPED_DATA_EMBEDDED;
564568}
565569
566570RBIMPL_ATTR_DEPRECATED_INTERNAL_ONLY ()
567571static inline bool
568572RTYPEDDATA_EMBEDDED_P(VALUE obj)
569573{
574+ RBIMPL_TYPEDDATA_PRECONDITION (obj, RBIMPL_UNREACHABLE_RETURN (false ));
575+
570576 return rbimpl_typeddata_embedded_p (obj);
571577}
572578
573579static inline void *
574- RTYPEDDATA_GET_DATA (VALUE obj)
580+ rbimpl_typeddata_get_data (VALUE obj)
575581{
576- #if RUBY_DEBUG
577- if (RB_UNLIKELY (!RB_TYPE_P (obj, RUBY_T_DATA))) {
578- Check_Type (obj, RUBY_T_DATA);
579- RBIMPL_UNREACHABLE_RETURN (NULL );
580- }
581- #endif
582-
583582 /* We reuse the data pointer in embedded TypedData. */
584583 return rbimpl_typeddata_embedded_p (obj) ?
585584 RBIMPL_CAST ((void *)&RTYPEDDATA_DATA (obj)) :
586585 RTYPEDDATA_DATA (obj);
587586}
588587
588+ static inline void *
589+ RTYPEDDATA_GET_DATA (VALUE obj)
590+ {
591+ RBIMPL_TYPEDDATA_PRECONDITION (obj, RBIMPL_UNREACHABLE_RETURN (NULL ));
592+
593+ return rbimpl_typeddata_get_data (obj);
594+ }
595+
589596RBIMPL_ATTR_PURE ()
590597RBIMPL_ATTR_ARTIFICIAL()
591598/* *
@@ -639,12 +646,7 @@ RBIMPL_ATTR_ARTIFICIAL()
639646static inline bool
640647RTYPEDDATA_P(VALUE obj)
641648{
642- #if RUBY_DEBUG
643- if (RB_UNLIKELY (! RB_TYPE_P (obj, RUBY_T_DATA))) {
644- Check_Type (obj, RUBY_T_DATA);
645- RBIMPL_UNREACHABLE_RETURN (false );
646- }
647- #endif
649+ RBIMPL_TYPEDDATA_PRECONDITION (obj, RBIMPL_UNREACHABLE_RETURN (false ));
648650
649651 return rbimpl_rtypeddata_p (obj);
650652}
@@ -662,12 +664,7 @@ RBIMPL_ATTR_RETURNS_NONNULL()
662664static inline const rb_data_type_t *
663665RTYPEDDATA_TYPE(VALUE obj)
664666{
665- #if RUBY_DEBUG
666- if (RB_UNLIKELY (! RTYPEDDATA_P (obj))) {
667- rb_unexpected_type (obj, RUBY_T_DATA);
668- RBIMPL_UNREACHABLE_RETURN (NULL );
669- }
670- #endif
667+ RBIMPL_TYPEDDATA_PRECONDITION (obj, RBIMPL_UNREACHABLE_RETURN (NULL ));
671668
672669 VALUE type = RTYPEDDATA (obj)->type & TYPED_DATA_PTR_MASK;
673670 const rb_data_type_t *ptr = RBIMPL_CAST ((const rb_data_type_t *)type);
0 commit comments