Skip to content

Commit aab1f1b

Browse files
committed
Extract RBIMPL_TYPEDDATA_PRECONDITION
1 parent 7cf6cc8 commit aab1f1b

File tree

1 file changed

+25
-28
lines changed

1 file changed

+25
-28
lines changed

include/ruby/internal/core/rtypeddata.h

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,17 @@ RBIMPL_ATTR_NONNULL(())
485485
void rb_unexpected_typeddata(const rb_data_type_t *actual, const rb_data_type_t *expected);
486486
RBIMPL_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()
553564
static inline bool
554565
rbimpl_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

566570
RBIMPL_ATTR_DEPRECATED_INTERNAL_ONLY()
567571
static inline bool
568572
RTYPEDDATA_EMBEDDED_P(VALUE obj)
569573
{
574+
RBIMPL_TYPEDDATA_PRECONDITION(obj, RBIMPL_UNREACHABLE_RETURN(false));
575+
570576
return rbimpl_typeddata_embedded_p(obj);
571577
}
572578

573579
static 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+
589596
RBIMPL_ATTR_PURE()
590597
RBIMPL_ATTR_ARTIFICIAL()
591598
/**
@@ -639,12 +646,7 @@ RBIMPL_ATTR_ARTIFICIAL()
639646
static inline bool
640647
RTYPEDDATA_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()
662664
static inline const rb_data_type_t *
663665
RTYPEDDATA_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

Comments
 (0)