diff --git a/Examples/test-suite/ruby/Makefile.in b/Examples/test-suite/ruby/Makefile.in index add65fe9f..6393026a4 100644 --- a/Examples/test-suite/ruby/Makefile.in +++ b/Examples/test-suite/ruby/Makefile.in @@ -26,6 +26,7 @@ CPP_TEST_CASES = \ ruby_keywords \ ruby_minherit_shared_ptr \ ruby_naming \ + ruby_rdata \ ruby_track_objects \ ruby_track_objects_directors \ std_containers \ diff --git a/Examples/test-suite/ruby/ruby_rdata_runme.rb b/Examples/test-suite/ruby/ruby_rdata_runme.rb new file mode 100644 index 000000000..b7f293077 --- /dev/null +++ b/Examples/test-suite/ruby/ruby_rdata_runme.rb @@ -0,0 +1,7 @@ +require 'swig_assert' +require 'ruby_rdata' + +include Ruby_rdata + +swig_assert_equal_simple(1, take_proc_or_cpp_obj_and_ret_1(Proc.new{})) +swig_assert_equal_simple(1, take_proc_or_cpp_obj_and_ret_1(C.new)) diff --git a/Examples/test-suite/ruby_rdata.i b/Examples/test-suite/ruby_rdata.i new file mode 100644 index 000000000..fb89f1276 --- /dev/null +++ b/Examples/test-suite/ruby_rdata.i @@ -0,0 +1,20 @@ +%module ruby_rdata + +%{ + + class C {}; + + int take_proc_or_cpp_obj_and_ret_1(VALUE obj) { + return 1; + } + + int take_proc_or_cpp_obj_and_ret_1(class C) { + return 1; + } + +%} + +class C {}; + +int take_proc_or_cpp_obj_and_ret_1(VALUE); +int take_proc_or_cpp_obj_and_ret_1(C); diff --git a/Lib/ruby/rubyrun.swg b/Lib/ruby/rubyrun.swg index b4dd9ddf0..4b2ffe4b4 100644 --- a/Lib/ruby/rubyrun.swg +++ b/Lib/ruby/rubyrun.swg @@ -247,7 +247,7 @@ typedef struct { SWIGRUNTIME swig_ruby_owntype SWIG_Ruby_AcquirePtr(VALUE obj, swig_ruby_owntype own) { swig_ruby_owntype oldown = {0, 0}; - if (TYPE(obj) == T_DATA) { + if (TYPE(obj) == T_DATA && !RTYPEDDATA_P(obj)) { oldown.datafree = RDATA(obj)->dfree; RDATA(obj)->dfree = own.datafree; } @@ -268,7 +268,7 @@ SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags, *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else { - if (TYPE(obj) != T_DATA) { + if (TYPE(obj) != T_DATA || (TYPE(obj) == T_DATA && RTYPEDDATA_P(obj))) { return SWIG_ERROR; } Data_Get_Struct(obj, void, vptr);