| #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; |