/
niceSOFT
/
swig
Обзор
Документация
Войти
/
niceSOFT
/
swig
Код
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Lib/ruby/rubyhead.swg
214 строк
6 KB
William S Fulton
Ruby: embed the TypedData wrapper for per-class descriptors too
17 июн 2026, 01:32
17 июн 2026, 01:32
5fd1a0b
Код
Авторство
О чём код?
#if __GNUC__ >= 7 #pragma GCC diagnostic push #if defined(__cplusplus) #pragma GCC diagnostic ignored "-Wregister" #if __GNUC__ >= 10 #pragma GCC diagnostic ignored "-Wvolatile" #if __GNUC__ >= 11 #pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" #endif #endif #endif #endif #include <ruby.h> #include <ruby/version.h> /* For RUBY_API_VERSION_CODE */ #if __GNUC__ >= 7 #pragma GCC diagnostic pop #endif /* Ruby 1.9.1 has a "memoisation optimisation" when compiling with GCC which * breaks using rb_intern as an lvalue, as SWIG does. We work around this * issue for now by disabling this. * https://sourceforge.net/tracker/?func=detail&aid=2859614&group_id=1645&atid=101645 */ #ifdef rb_intern # undef rb_intern #endif /* Remove global macros defined in Ruby's win32.h */ #ifdef write # undef write #endif #ifdef read # undef read #endif #ifdef bind # undef bind #endif #ifdef close # undef close #endif #ifdef connect # undef connect #endif /* Ruby 1.7 defines NUM2LL(), LL2NUM() and ULL2NUM() macros */ #ifndef NUM2LL #define NUM2LL(x) NUM2LONG((x)) #endif #ifndef LL2NUM #define LL2NUM(x) INT2NUM((long) (x)) #endif #ifndef ULL2NUM #define ULL2NUM(x) UINT2NUM((unsigned long) (x)) #endif /* Ruby 1.7 doesn't (yet) define NUM2ULL() */ #ifndef NUM2ULL #ifdef HAVE_LONG_LONG #define NUM2ULL(x) rb_num2ull((x)) #else #define NUM2ULL(x) NUM2ULONG(x) #endif #endif /* RSTRING_LEN, etc are new in Ruby 1.9, but ->ptr and ->len no longer work */ /* Define these for older versions so we can just write code the new way */ #ifndef RSTRING_LEN # define RSTRING_LEN(x) RSTRING(x)->len #endif #ifndef RSTRING_PTR # define RSTRING_PTR(x) RSTRING(x)->ptr #endif #ifndef RSTRING_END # define RSTRING_END(x) (RSTRING_PTR(x) + RSTRING_LEN(x)) #endif #ifndef RARRAY_LEN # define RARRAY_LEN(x) RARRAY(x)->len #endif #ifndef RARRAY_PTR # define RARRAY_PTR(x) RARRAY(x)->ptr #endif #ifndef RFLOAT_VALUE # define RFLOAT_VALUE(x) RFLOAT(x)->value #endif #ifndef DOUBLE2NUM # define DOUBLE2NUM(x) rb_float_new(x) #endif #ifndef RHASH_TBL # define RHASH_TBL(x) (RHASH(x)->tbl) #endif #ifndef RHASH_ITER_LEV # define RHASH_ITER_LEV(x) (RHASH(x)->iter_lev) #endif #ifndef RHASH_IFNONE # define RHASH_IFNONE(x) (RHASH(x)->ifnone) #endif #ifndef RHASH_SIZE # define RHASH_SIZE(x) (RHASH(x)->tbl->num_entries) #endif #ifndef RHASH_EMPTY_P # define RHASH_EMPTY_P(x) (RHASH_SIZE(x) == 0) #endif #ifndef RSTRUCT_LEN # define RSTRUCT_LEN(x) RSTRUCT(x)->len #endif #ifndef RSTRUCT_PTR # define RSTRUCT_PTR(x) RSTRUCT(x)->ptr #endif #ifndef RTYPEDDATA_P # define RTYPEDDATA_P(x) (TYPE(x) != T_DATA) #endif #ifndef TYPED_DATA_EMBEDDED # define RTYPEDDATA_GET_DATA(x) RTYPEDDATA_DATA(x) #endif /* Flags shared by every rb_data_type_t that SWIG allocates with TypedData_Make_Struct, so the static descriptors and the per class cext_type stay in step. The rb_data_type_t flags member, and RUBY_TYPED_FREE_IMMEDIATELY, only exist from Ruby 2.1, so this macro (and every use of it) is guarded by '#ifdef RUBY_TYPED_FREE_IMMEDIATELY' and is simply absent on older Ruby. Ruby 3.3+ additionally defines TYPED_DATA_EMBEDDED and can store the small, fixed size swig_ruby_wrapped_object inside the object slot rather than a separate malloc; that embedding also needs FREE_IMMEDIATELY. */ #ifdef RUBY_TYPED_FREE_IMMEDIATELY # ifdef TYPED_DATA_EMBEDDED # define SWIG_RUBY_TYPED_DATA_FLAGS (RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_EMBEDDABLE) # else # define SWIG_RUBY_TYPED_DATA_FLAGS (RUBY_TYPED_FREE_IMMEDIATELY) # endif #endif /* Wrapper attached to every SWIG TypedData object. It holds the wrapped pointer together with the per-object mark and free functions. The static rb_data_type_t shared by a class can not carry per-object ownership, which changes as ownership is transferred at runtime, so that information is kept here instead. */ struct swig_ruby_wrapped_object { void *data; void (*dmark)(void *); void (*dfree)(void *); }; /* * The following macros are used for providing the correct type of a * function pointer to the Ruby C API. * * Starting with Ruby 2.7 these macros act transparently due to Ruby's moving * moving away from ANYARGS and instead employing strict function signatures. * * Note: In case of C (not C++) the macros are transparent even before * Ruby 2.7 due to the fact that the Ruby C API used function declarators * with empty parentheses, which allows for an unspecified number of * arguments. * * PROTECTFUNC(f) is used for the function pointer argument of the Ruby * C API function rb_protect(). * * VALUEFUNC(f) is used for the function pointer argument(s) of Ruby C API * functions like rb_define_method() and rb_define_singleton_method(). * * VOIDFUNC(f) is used to typecast a C function that implements either * the "mark" or "free" stuff for a Ruby Data object, so that it can be * passed as an argument to Ruby C API functions like TypedData_Wrap_Struct() * and TypedData_Make_Struct(). * * SWIG_RUBY_VOID_ANYARGS_FUNC(f) is used for the function pointer * argument(s) of Ruby C API functions like rb_define_virtual_variable(). * * SWIG_RUBY_INT_ANYARGS_FUNC(f) is used for the function pointer * argument(s) of Ruby C API functions like st_foreach(). */ #if defined(__cplusplus) && RUBY_API_VERSION_CODE < 20700 # define PROTECTFUNC(f) ((VALUE (*)(VALUE)) f) # define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f) # define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) # define SWIG_RUBY_VOID_ANYARGS_FUNC(f) ((void (*)(ANYARGS))(f)) # define SWIG_RUBY_INT_ANYARGS_FUNC(f) ((int (*)(ANYARGS))(f)) #else # define PROTECTFUNC(f) (f) # define VALUEFUNC(f) (f) # define VOIDFUNC(f) (f) # define SWIG_RUBY_VOID_ANYARGS_FUNC(f) (f) # define SWIG_RUBY_INT_ANYARGS_FUNC(f) (f) #endif /* Don't use for expressions have side effect */ #ifndef RB_STRING_VALUE #define RB_STRING_VALUE(s) (TYPE(s) == T_STRING ? (s) : (*(volatile VALUE *)&(s) = rb_str_to_str(s))) #endif #ifndef StringValue #define StringValue(s) RB_STRING_VALUE(s) #endif #ifndef StringValuePtr #define StringValuePtr(s) RSTRING_PTR(RB_STRING_VALUE(s)) #endif #ifndef StringValueLen #define StringValueLen(s) RSTRING_LEN(RB_STRING_VALUE(s)) #endif #ifndef SafeStringValue #define SafeStringValue(v) do {\ StringValue(v);\ rb_check_safe_str(v);\ } while (0) #endif #ifndef HAVE_RB_DEFINE_ALLOC_FUNC #define rb_define_alloc_func(klass, func) rb_define_singleton_method((klass), "new", VALUEFUNC((func)), -1) #define rb_undef_alloc_func(klass) rb_undef_method(CLASS_OF((klass)), "new") #endif static VALUE _mSWIG = Qnil;