Commit Graph

38 Commits

Author SHA1 Message Date
William S Fulton 5fd1a0b1c5 Ruby: embed the TypedData wrapper for per-class descriptors too
Embedded data (RUBY_TYPED_EMBEDDABLE) was only enabled on the anonymous
swig_type_data_type descriptor. Wrapped class objects use the per-class
SwigClass*.cext_type descriptor, whose flags were left zero, so they were never
embedded: the swig_ruby_wrapped_object was allocated separately and, since the
free callback no longer calls ruby_xfree once embedding is compiled in, leaked
on every object.

Set cext_type.flags from a shared SWIG_RUBY_TYPED_DATA_FLAGS macro, used by both
the static swig_type_data_type and the generated per-class descriptors so they
can not drift apart. The flags member, and the macro, only exist from Ruby 2.1
(guarded by RUBY_TYPED_FREE_IMMEDIATELY), so the build still works on Ruby 2.0.

Add test ruby_typeddata_embedded which checks that a wrapped object is embedded
on Ruby 3.3 and later via RTYPEDDATA_EMBEDDED_P.

Assisted-by: Claude Opus 4.8
2026-06-16 23:32:25 +01:00
Lars Kanis 6fe73bf144
Ruby: Allocate the TypedData wrapper with TypedData_Make_Struct and use embedded data (#3465)
Ruby-3.3+ allows to embed the wrapper data into the objects memory slot.
This is particular useful for SWIG since the `struct swig_ruby_wrapped_object` is a small and fixed size piece of memory.
Also the rest of the restrictions apply: https://github.com/ruby/ruby/blob/master/doc/extension.rdoc#c-struct-to-ruby-object

This commit reverts several changes of commit 98ea4cdf2d :

1. Revert allocation of `struct swig_ruby_wrapped_object` per malloc:

When using `TypedData_Make_Struct` the corresponding deacclocation should call `ruby_xfree` instead of `free`.
That's the better fix than changing to `malloc` allocation.

2. RTYPEDDATA_DATA is reverted back to RTYPEDDATA_GET_DATA

Because RTYPEDDATA_GET_DATA was in preparation of using RUBY_TYPED_EMBEDDABLE.

3. Revert back to use plain pointer for `$swig_runtime_data_type_pointer`

Because there's no need an no advantage in using `struct swig_ruby_wrapped_object` for this object.
It's makes things only more complicated and needs more memory.

4. The simple type check of $swig_runtime_data_type_pointer was removed

It should be re-added as it protects for accident changes or GC issues.
2026-06-10 07:58:01 +01:00
William S Fulton 35cba12b13 Ruby: address review feedback - rename the TypedData wrapper struct
Rename the per-object wrapper struct from ruby_wrapped_object to
swig_ruby_wrapped_object: a ruby_ prefix in the global namespace is reserved
for the Ruby project itself (swig/swig#3326 review). Also reword the
handleClassName comment.

The other review points are already satisfied by the implementation: the
TypedData descriptors use positional rather than C99 designated initializers
(C90), the generic callbacks take a plainly named parameter, and object
wrapping uses the documented TypedData_Wrap_Struct rather than the internal
Data API.

Assisted-by: Claude Code (Opus 4.8)
2026-06-08 22:16:29 +01:00
Julien Schueller 98ea4cdf2d Ruby: allocate the TypedData wrapper with malloc and free it reliably
The previous commit allocated each object's ruby_wrapped_object with
TypedData_Make_Struct and freed it from the descriptor's free callback. That
only installed the free callback for classes with a destructor or %freefunc, so
the wrapper leaked for destructor-less classes and for the anonymous SWIG::TYPE*
pointer objects, and it freed a Ruby-allocated block with plain free().

Allocate the wrapper with malloc and bind it with TypedData_Wrap_Struct, and
always install the generic mark and free trampolines on every descriptor, the
approach taken in #3456.

The free trampoline runs the per-object free function, if any, and then frees the
wrapper, so malloc and free are paired and nothing leaks regardless of whether the
class owns a destructor. Because TypedData_Wrap_Struct never embeds the data,
RTYPEDDATA_DATA is the correct accessor and the RTYPEDDATA_GET_DATA shim is no longer needed.

See issue #3170.

Assisted-by: Claude Code (deepseek-v4-flash)
2026-06-08 22:15:19 +01:00
Lars Kanis 4748a6c31a Ruby: use TypedData API instead of deprecated untyped Data API
The untyped Data API (Data_Wrap_Struct, Data_Get_Struct, DATA_PTR and direct
access to RDATA()->dfree) is deprecated. Ruby 3.4 warns about it by default,
which becomes an error when building generated wrappers with -Werror, and Ruby
4.0 removes the API altogether.

The generated runtime now wraps every object with the TypedData API. Because a
TypedData rb_data_type_t is static per class, it can not carry the per-object
mark and free functions that SWIG needs (ownership is transferred at runtime),
so each object holds a small ruby_wrapped_object that keeps the wrapped pointer
together with its mark and free functions. Generic mark and free callbacks in
the per-class descriptor dispatch to these per-object functions. Each class
gets its own descriptor whose struct name is the C++ class name, which shows up
in Ruby heap dumps and ObjectSpace statistics.

This is not fully backwards compatible: hand written code that reached the
wrapped pointer through DATA_PTR or Data_Get_Struct must instead use the SWIG
conversion functions, which work with old and new SWIG. The ruby_manual_proxy
test is updated to demonstrate the migration.

See issue #3170.

The source of this code is extracted from #3326. Also see followup commit.
2026-06-08 22:15:19 +01:00
Olly Betts 6b3e7ee850 [Ruby] Fix deprecation warnings with Ruby 3.x
Fix deprecation warnings about ANYARGS when compiling  C++ code for
SWIG-generated Ruby wrappers with Ruby 3.x.

This is a recurrence of a problem fixed in 4.0.2.  Our fix was
conditional on RB_METHOD_DEFINITION_DECL being defined, but Ruby
3.0 stopped defining this.
2023-05-23 18:00:40 +12:00
William S Fulton ac8864bc59 ruby 2022-07-31 16:15:00 +01:00
William S Fulton d9fd09aa21 Suppress Ruby.h gcc warnings 2022-07-31 14:51:26 +01:00
Thomas Reitmayr f5908eca76 Improve description of cast macros for Ruby
The macros for casting function pointers are now fully described and also
clarify why the macros act transparently for C even before Ruby 2.7.

In addition, an "if (CPlusPlus)" was removed in the code generator for
global variables in order to keep the distinction between C and C++ in
one place, which is at the definition of said macros.
2020-01-04 18:37:35 +01:00
Thomas Reitmayr 5542cc228a Move new macros for Ruby to their dedicated namespace 2020-01-03 21:45:53 +01:00
Thomas Reitmayr 00e291b319 Add support for Ruby 2.7
This commit fixes the signatures of various callback methods
and cleans up the macro definitions used for casting callbacks.

Note that the transparent version of the macro RUBY_METHOD_FUNC
is currently masked behind RUBY_DEVEL, see commit
1d91feaf13
In order to still support strict signature checking and prevent
nasty deprecation warnings, the use of RUBY_METHOD_FUNC had to
be replaced with VALUEFUNC.
2019-12-31 17:53:53 +01:00
William S Fulton a006091b0f Add in a definition for RTYPEDDATA_P for Ruby<1.9.3
This definition ensures the SWIG wrappers keep compiling in older versions
of Ruby given the previous change (which uses RTYPEDDATA_P and hence
requires Ruby 1.9.3). The definition of RTYPEDDATA_P is such that the
previous commit plus the definition should keep the behaviour the same
as before.
2019-02-22 19:55:55 +00:00
Olly Betts ab06b22bab [Ruby] Improve support for Ruby 1.9 under GCC. Addresses part of SF#2859614.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11775 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2009-12-04 08:52:12 +00:00
Olly Betts 4e1763ba69 [Ruby] Undefine close and connect macros defined by Ruby API
headers as we don't need them and they can clash with C++ methods
being wrapped.  Patch from Vit Ondruch in SF#2814430.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11333 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2009-06-30 11:50:14 +00:00
William S Fulton ed68b295a0 undef bind for win32, problem reported by vondruch
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11148 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2009-03-11 21:01:55 +00:00
Gonzalo Garramuno b673832720 Added more backwards compatibility macros from ruby1.9.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10199 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2008-01-04 03:47:55 +00:00
Gonzalo Garramuno 6120c93fc6 Added a couple of new macros used in ruby1.9.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10198 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2008-01-02 21:41:50 +00:00
William S Fulton 1c163430e3 Fixes global namespace pollution from Ruby\'s win32.h
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10044 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2007-10-25 23:45:44 +00:00
Gonzalo Garramuno 94a6b8ddb1 Revered _mSWIG to rubyhead.swg as some tests would fail.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9931 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2007-09-04 06:43:28 +00:00
Gonzalo Garramuno d1defceb95 Moved _mSWIG to rubyrun.swg with all other static
variables.



git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9927 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2007-09-04 06:12:38 +00:00
Gonzalo Garramuno 801fda2b00 Moved Init_stack() declaration over to rubyapi to
avoid potential C++ issues.



git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9844 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2007-06-02 10:24:23 +00:00
Gonzalo Garramuno 57cca3c3cb Minor cleanup. Mode RUBY_INIT_STACK macro
definition to rubyhead.swg where all the backward
compatability macros are kept.



git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9715 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2007-04-29 22:56:18 +00:00
Gonzalo Garramuno 18f614364f Improved ruby trackings across DSOs, removing the
need for -DSWIG_EXTERN.



git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9699 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2007-04-29 18:48:22 +00:00
Olly Betts 2f6a268e55 Support building with recent versions of the Ruby 1.9 development branch.
Fixes bug #1560092.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@9333 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2006-09-23 21:39:09 +00:00
Marcelo Matus 0d6baa85ef fix -external-runtime
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8654 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2006-01-31 00:02:58 +00:00
Marcelo Matus 7e5e4fd1f9 massive typemap unification
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7676 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-10-18 13:24:15 +00:00
Charlie Savage c5fd02ec59 Object tracking support. Defined two new pointer conversion flags used by SWIG_ConvertPtr and SWIG_NewPointerObj. The new flags are:
#define SWIG_POINTER_OWN           0x1
#define SWIG_TRACK_OBJECTS        0x4


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7496 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-09-23 18:04:06 +00:00
Lyle Johnson 02bb4b0a68 *** empty log message ***
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6192 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2004-09-01 03:33:11 +00:00
Lyle Johnson ae29b50240 Corrections for Ruby 1.6 compatibility.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6190 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2004-09-01 02:37:54 +00:00
Logan Johnson 40cb2afe0d Added Ruby module runtime support for SWIG_contract_assert() macro.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5328 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2003-11-17 20:24:13 +00:00
Logan Johnson 87a1b982e3 Add (and use) the SWIG_POINTER_EXCEPTION and SWIG_POINTER_DISOWN flags
for the Ruby runtime support. Have not actually implemented support for
"disowning" Ruby pointers yet.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5122 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2003-09-19 18:47:27 +00:00
Logan Johnson 8fb4c9fceb Initial changes for limited MI support in Ruby (still under construction!)
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4707 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2003-04-25 17:38:42 +00:00
Logan Johnson afd3a339f1 *** empty log message ***
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4689 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2003-04-16 22:44:05 +00:00
Logan Johnson 7cfddcffc7 Additional fixes for Ruby 1.8 compatibility.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4688 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2003-04-16 22:35:50 +00:00
Logan Johnson 2de683e019 Replaced all occurrences of the deprecated STR2CSTR() in Ruby code with
the new StringValuePtr().


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4682 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2003-04-15 17:14:18 +00:00
Logan Johnson 71c7bd8442 Add range checking for NUM2USHRT macro, per SF Bug #675353.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4387 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2003-02-25 19:22:36 +00:00
Dave Beazley 5c5abff3ac Partial fix of [ 675353 ] rubyhead.swg: missing cast at NUM2USHRT.
Lyle, can you take a look at this:

http://sourceforge.net/tracker/index.php?func=detail&aid=675353&group_id=1645&atid=101645


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4262 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2003-02-07 22:10:14 +00:00
Dave Beazley 12a43edc2d The great merge
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4141 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2002-11-30 22:01:28 +00:00