23#include "ruby/internal/config.h"
31#include "ruby/internal/cast.h"
40#ifdef RUBY_UNTYPED_DATA_WARNING
42#elif defined(RUBY_EXPORT)
43# define RUBY_UNTYPED_DATA_WARNING 1
45# define RUBY_UNTYPED_DATA_WARNING 0
48#define RBIMPL_DATA_FUNC(f) RBIMPL_CAST((void (*)(void *))(f))
49#define RBIMPL_ATTRSET_UNTYPED_DATA_FUNC() \
50 RBIMPL_ATTR_WARNING(("untyped Data is unsafe; use TypedData instead")) \
51 RBIMPL_ATTR_DEPRECATED(("by TypedData"))
53#define RBIMPL_MACRO_SELECT(x, y) x ## y
54#define RUBY_MACRO_SELECT(x, y) RBIMPL_MACRO_SELECT(x, y)
63#define RDATA(obj) RBIMPL_CAST((struct RData *)(obj))
71#define DATA_PTR(obj) RDATA(obj)->data
82#define RUBY_DEFAULT_FREE RBIMPL_DATA_FUNC(-1)
89#define RUBY_NEVER_FREE RBIMPL_DATA_FUNC(0)
98#define RUBY_UNTYPED_DATA_FUNC(f) f RBIMPL_ATTRSET_UNTYPED_DATA_FUNC()
202#define Data_Wrap_Struct(klass, mark, free, sval) \
203 rb_data_object_wrap( \
206 RBIMPL_DATA_FUNC(mark), \
207 RBIMPL_DATA_FUNC(free))
223#define Data_Make_Struct0(result, klass, type, size, mark, free, sval) \
224 VALUE result = rb_data_object_zalloc( \
227 RBIMPL_DATA_FUNC(mark), \
228 RBIMPL_DATA_FUNC(free)); \
229 (sval) = RBIMPL_CAST((type *)DATA_PTR(result)); \
230 RBIMPL_CAST((void)(sval))
247#ifdef HAVE_STMT_AND_DECL_IN_EXPR
248#define Data_Make_Struct(klass, type, mark, free, sval) \
249 RB_GNUC_EXTENSION({ \
261#define Data_Make_Struct(klass, type, mark, free, sval) \
262 rb_data_object_make( \
264 RBIMPL_DATA_FUNC(mark), \
265 RBIMPL_DATA_FUNC(free), \
266 RBIMPL_CAST((void **)&(sval)), \
278#define Data_Get_Struct(obj, type, sval) \
279 ((sval) = RBIMPL_CAST((type*)rb_data_object_get(obj)))
281RBIMPL_ATTRSET_UNTYPED_DATA_FUNC()
312rb_data_object_get(
VALUE obj)
318RBIMPL_ATTRSET_UNTYPED_DATA_FUNC()
329rb_data_object_get_warning(
VALUE obj)
331 return rb_data_object_get(obj);
334#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P)
335# define rb_data_object_wrap_warning(klass, ptr, mark, free) \
337 __builtin_choose_expr( \
338 __builtin_constant_p(klass) && !(klass), \
339 rb_data_object_wrap(klass, ptr, mark, free), \
340 (rb_data_object_wrap_warning)(klass, ptr, mark, free)))
373#define rb_data_object_wrap_0 rb_data_object_wrap
374#define rb_data_object_wrap_1 rb_data_object_wrap_warning
375#define rb_data_object_wrap_2 rb_data_object_wrap_
376#define rb_data_object_wrap RUBY_MACRO_SELECT(rb_data_object_wrap_2, RUBY_UNTYPED_DATA_WARNING)
377#define rb_data_object_get_0 rb_data_object_get
378#define rb_data_object_get_1 rb_data_object_get_warning
379#define rb_data_object_get_2 rb_data_object_get_
380#define rb_data_object_get RUBY_MACRO_SELECT(rb_data_object_get_2, RUBY_UNTYPED_DATA_WARNING)
381#define rb_data_object_make_0 rb_data_object_make
382#define rb_data_object_make_1 rb_data_object_make_warning
383#define rb_data_object_make_2 rb_data_object_make_
384#define rb_data_object_make RUBY_MACRO_SELECT(rb_data_object_make_2, RUBY_UNTYPED_DATA_WARNING)
Defines RBIMPL_ATTR_WARNING.
Defines RBIMPL_ATTR_DEPRECATED.
#define RBIMPL_ATTR_DEPRECATED(msg)
Wraps (or simulates) [[deprecated]]
Tweaking visibility of C variables/functions.
#define RUBY_EXTERN
Declaration of externally visible global variables.
#define RBIMPL_SYMBOL_EXPORT_END()
Counterpart of RBIMPL_SYMBOL_EXPORT_BEGIN.
#define RBIMPL_SYMBOL_EXPORT_BEGIN()
Shortcut macro equivalent to RUBY_SYMBOL_EXPORT_BEGIN extern "C" {.
Defines enum ruby_fl_type.
#define inline
Old Visual Studio versions do not support the inline keyword, so we need to define it to be __inline.
VALUE rb_data_object_wrap(VALUE klass, void *datap, RUBY_DATA_FUNC dmark, RUBY_DATA_FUNC dfree)
This is the primitive way to wrap an existing C struct into RData.
static VALUE rb_data_object_make(VALUE klass, RUBY_DATA_FUNC mark_func, RUBY_DATA_FUNC free_func, void **datap, size_t size)
This is an implementation detail of Data_Make_Struct.
#define DATA_PTR(obj)
Convenient getter macro.
void(* RUBY_DATA_FUNC)(void *)
This is the type of callbacks registered to RData.
#define Data_Make_Struct0(result, klass, type, size, mark, free, sval)
This is an implementation detail of Data_Make_Struct.
Ruby's object's, base components.
const VALUE klass
Class of an object.
RUBY_DATA_FUNC dfree
This function is called when the object is no longer used.
RUBY_DATA_FUNC dmark
This function is called when the object is experiencing GC marks.
void * data
Pointer to the actual C level struct that you want to wrap.
struct RBasic basic
Basic part, including flags and class.
uintptr_t VALUE
Type that represents a Ruby object.
Defines enum ruby_value_type.
static void Check_Type(VALUE v, enum ruby_value_type t)
Identical to RB_TYPE_P(), except it raises exceptions on predication failure.