Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,10 @@ rb_data_object_zalloc(VALUE klass, size_t size, RUBY_DATA_FUNC dmark, RUBY_DATA_
return obj;
}

#define RTYPEDDATA_EMBEDDED_P rbimpl_typeddata_embedded_p
#define RB_DATA_TYPE_EMBEDDABLE_P(type) ((type)->flags & RUBY_TYPED_EMBEDDABLE)
#define RTYPEDDATA_EMBEDDABLE_P(obj) RB_DATA_TYPE_EMBEDDABLE_P(RTYPEDDATA_TYPE(obj))

static VALUE
typed_data_alloc(VALUE klass, VALUE typed_flag, void *datap, const rb_data_type_t *type, size_t size)
{
Expand All @@ -1117,7 +1121,7 @@ typed_data_alloc(VALUE klass, VALUE typed_flag, void *datap, const rb_data_type_
VALUE
rb_data_typed_object_wrap(VALUE klass, void *datap, const rb_data_type_t *type)
{
if (UNLIKELY(type->flags & RUBY_TYPED_EMBEDDABLE)) {
if (UNLIKELY(RB_DATA_TYPE_EMBEDDABLE_P(type))) {
rb_raise(rb_eTypeError, "Cannot wrap an embeddable TypedData");
}

Expand All @@ -1127,7 +1131,7 @@ rb_data_typed_object_wrap(VALUE klass, void *datap, const rb_data_type_t *type)
VALUE
rb_data_typed_object_zalloc(VALUE klass, size_t size, const rb_data_type_t *type)
{
if (type->flags & RUBY_TYPED_EMBEDDABLE) {
if (RB_DATA_TYPE_EMBEDDABLE_P(type)) {
if (!(type->flags & RUBY_TYPED_FREE_IMMEDIATELY)) {
rb_raise(rb_eTypeError, "Embeddable TypedData must be freed immediately");
}
Expand All @@ -1153,7 +1157,7 @@ rb_objspace_data_type_memsize(VALUE obj)
const rb_data_type_t *type = RTYPEDDATA_TYPE(obj);
const void *ptr = RTYPEDDATA_GET_DATA(obj);

if (RTYPEDDATA_TYPE(obj)->flags & RUBY_TYPED_EMBEDDABLE && !RTYPEDDATA_EMBEDDED_P(obj)) {
if (RTYPEDDATA_EMBEDDABLE_P(obj) && !RTYPEDDATA_EMBEDDED_P(obj)) {
#ifdef HAVE_MALLOC_USABLE_SIZE
size += malloc_usable_size((void *)ptr);
#endif
Expand Down Expand Up @@ -1285,7 +1289,7 @@ rb_data_free(void *objspace, VALUE obj)
}
else if (free_immediately) {
(*dfree)(data);
if (RTYPEDDATA_TYPE(obj)->flags & RUBY_TYPED_EMBEDDABLE && !RTYPEDDATA_EMBEDDED_P(obj)) {
if (RTYPEDDATA_EMBEDDABLE_P(obj) && !RTYPEDDATA_EMBEDDED_P(obj)) {
xfree(data);
}

Expand Down
15 changes: 11 additions & 4 deletions include/ruby/internal/core/rtypeddata.h
Original file line number Diff line number Diff line change
Expand Up @@ -548,7 +548,7 @@ RBIMPL_SYMBOL_EXPORT_END()
#endif

static inline bool
RTYPEDDATA_EMBEDDED_P(VALUE obj)
rbimpl_typeddata_embedded_p(VALUE obj)
{
#if RUBY_DEBUG
if (RB_UNLIKELY(!RB_TYPE_P(obj, RUBY_T_DATA))) {
Expand All @@ -560,6 +560,13 @@ RTYPEDDATA_EMBEDDED_P(VALUE obj)
return (RTYPEDDATA(obj)->type) & TYPED_DATA_EMBEDDED;
}

RBIMPL_ATTR_DEPRECATED_INTERNAL_ONLY()
static inline bool
RTYPEDDATA_EMBEDDED_P(VALUE obj)
{
return rbimpl_typeddata_embedded_p(obj);
}

static inline void *
RTYPEDDATA_GET_DATA(VALUE obj)
{
Expand All @@ -571,9 +578,9 @@ RTYPEDDATA_GET_DATA(VALUE obj)
#endif

/* We reuse the data pointer in embedded TypedData. */
return RTYPEDDATA_EMBEDDED_P(obj) ?
RBIMPL_CAST((void *)&(RTYPEDDATA(obj)->data)) :
RTYPEDDATA(obj)->data;
return rbimpl_typeddata_embedded_p(obj) ?
RBIMPL_CAST((void *)&RTYPEDDATA_DATA(obj)) :
RTYPEDDATA_DATA(obj);
}

RBIMPL_ATTR_PURE()
Expand Down