2828#pragma warning (disable : 4786)
2929#endif
3030
31+ // SWIG runtime functions we need
32+ #include " swigruby.h"
33+
3134#include " FXRbCommon.h"
3235#include " FXRbObjRegistry.h"
3336#include " impl.h"
3437
35- // SWIG runtime functions we need
36- #include " swigruby.h"
37-
3838#ifdef __CYGWIN__
3939#include < io.h> // for get_osf_handle()
4040#endif
@@ -842,8 +842,7 @@ void* FXRbGetExpectedData(VALUE recv,FXSelector key,VALUE value){
842842 FXushort id=FXSELID (key);
843843
844844 // Extract the FOX object (the receiver) from this Ruby instance
845- FXObject* obj;
846- Data_Get_Struct (recv,FXObject,obj);
845+ FXObject *obj = (FXObject*)FXRbConvertPtr (recv, NULL , 0 );
847846
848847 FXASSERT (type!=SEL_NONE);
849848 FXASSERT (type!=SEL_LAST);
@@ -896,7 +895,7 @@ void* FXRbGetExpectedData(VALUE recv,FXSelector key,VALUE value){
896895 case SEL_DND_MOTION:
897896 case SEL_DND_REQUEST:
898897 case SEL_PICKED:
899- SWIG_ConvertPtr (value,&ptr,FXRbTypeQuery (" FXEvent *" ),1 );
898+ SWIG_ConvertPtr (value,&ptr,FXRbTypeQuery (" FXEvent *" ),SWIG_POINTER_DISOWN );
900899 return ptr;
901900 case SEL_IO_READ:
902901 case SEL_IO_WRITE:
@@ -1072,7 +1071,7 @@ void* FXRbGetExpectedData(VALUE recv,FXSelector key,VALUE value){
10721071
10731072 if (type==SEL_CHANGED){
10741073 if (obj->isMemberOf (FXMETACLASS (FXPicker))){
1075- SWIG_ConvertPtr (value,&ptr,FXRbTypeQuery (" FXPoint *" ),1 );
1074+ SWIG_ConvertPtr (value,&ptr,FXRbTypeQuery (" FXPoint *" ),SWIG_POINTER_DISOWN );
10761075 return ptr;
10771076 }
10781077 if (obj->isMemberOf (FXMETACLASS (FXWindow))){
@@ -1086,7 +1085,7 @@ void* FXRbGetExpectedData(VALUE recv,FXSelector key,VALUE value){
10861085 }
10871086
10881087 if (type==SEL_DRAGGED){
1089- SWIG_ConvertPtr (value,&ptr,FXRbTypeQuery (" FXEvent *" ),1 );
1088+ SWIG_ConvertPtr (value,&ptr,FXRbTypeQuery (" FXEvent *" ),SWIG_POINTER_DISOWN );
10901089 return ptr;
10911090 }
10921091
@@ -1300,21 +1299,21 @@ FXGLObject* FXRbCallGLObjectMethod_gvlcb(FXGLObject* recv,const char *func){
13001299 VALUE obj=FXRbGetRubyObj (recv,false );
13011300 FXASSERT (!NIL_P (obj));
13021301 VALUE result=rb_funcall (obj,rb_intern (func),0 );
1303- return NIL_P (result) ? 0 : reinterpret_cast < FXGLObject*>( DATA_PTR ( result) );
1302+ return ( FXGLObject*) FXRbConvertPtr ( result, NULL , 0 );
13041303 }
13051304
13061305FXGLObject* FXRbCallGLObjectMethod_gvlcb (FXGLViewer* recv,const char *func,FXint x,FXint y){
13071306 VALUE obj=FXRbGetRubyObj (recv,false );
13081307 FXASSERT (!NIL_P (obj));
13091308 VALUE result=rb_funcall (obj,rb_intern (func),2 ,INT2NUM (x),INT2NUM (y));
1310- return NIL_P (result) ? 0 : reinterpret_cast < FXGLObject*>( DATA_PTR ( result) );
1309+ return ( FXGLObject*) FXRbConvertPtr ( result, NULL , 0 );
13111310 }
13121311
13131312FXGLObject* FXRbCallGLObjectMethod_gvlcb (FXGLObject* recv,const char *func,FXuint* path,FXint n){
13141313 VALUE obj=FXRbGetRubyObj (recv,false );
13151314 FXASSERT (!NIL_P (obj));
13161315 VALUE result=rb_funcall (obj,rb_intern (func),1 ,FXRbMakeArray (path,n));
1317- return NIL_P (result) ? 0 : reinterpret_cast < FXGLObject*>( DATA_PTR ( result) );
1316+ return ( FXGLObject*) FXRbConvertPtr ( result, NULL , 0 );
13181317 }
13191318
13201319// ----------------------------------------------------------------------
@@ -1329,7 +1328,8 @@ FXGLObject** FXRbCallGLObjectArrayMethod_gvlcb(FXGLViewer* recv,const char *func
13291328 Check_Type (result,T_ARRAY);
13301329 if (FXMALLOC (&objects,FXGLObject*,RARRAY_LEN (result)+1 )){
13311330 for (long i=0 ; i<RARRAY_LEN (result); i++){
1332- objects[i]=reinterpret_cast <FXGLObject*>(DATA_PTR (rb_ary_entry (result,i)));
1331+ VALUE entry = rb_ary_entry (result,i);
1332+ objects[i]=(FXGLObject*)FXRbConvertPtr (entry, NULL , 0 );
13331333 }
13341334 objects[RARRAY_LEN (result)]=0 ;
13351335 }
@@ -1344,14 +1344,14 @@ FXTableItem* FXRbCallTableItemMethod_gvlcb(FXTable* recv,const char *func,const
13441344 VALUE obj=FXRbGetRubyObj (recv,false );
13451345 FXASSERT (!NIL_P (obj));
13461346 VALUE result=rb_funcall (obj,rb_intern (func),3 ,to_ruby (text),to_ruby_cb (icon),itemData);
1347- return NIL_P (result)? 0 : reinterpret_cast < FXTableItem*>( DATA_PTR ( result) );
1347+ return ( FXTableItem*) FXRbConvertPtr ( result, NULL , 0 );
13481348 }
13491349
13501350FXTableItem* FXRbCallTableItemMethod_gvlcb (FXTable* recv,const char *func,FXint row,FXint col,FXbool notify){
13511351 VALUE obj=FXRbGetRubyObj (recv,false );
13521352 FXASSERT (!NIL_P (obj));
13531353 VALUE result=rb_funcall (obj,rb_intern (func),3 ,to_ruby (row),to_ruby (col),to_ruby (notify));
1354- return NIL_P (result)? 0 : reinterpret_cast < FXTableItem*>( DATA_PTR ( result) );
1354+ return ( FXTableItem*) FXRbConvertPtr ( result, NULL , 0 );
13551355 }
13561356
13571357// ----------------------------------------------------------------------
@@ -1360,7 +1360,7 @@ FXTreeItem* FXRbCallTreeItemMethod_gvlcb(const FXTreeList* recv,const char *func
13601360 VALUE obj=FXRbGetRubyObj (recv,false );
13611361 FXASSERT (!NIL_P (obj));
13621362 VALUE result=rb_funcall (obj,rb_intern (func),2 ,INT2NUM (x),INT2NUM (y));
1363- return NIL_P (result) ? 0 : reinterpret_cast < FXTreeItem*>( DATA_PTR ( result) );
1363+ return ( FXTreeItem*) FXRbConvertPtr ( result, NULL , 0 );
13641364 }
13651365
13661366// ----------------------------------------------------------------------
@@ -1369,7 +1369,7 @@ FXFoldingItem* FXRbCallFoldingItemMethod_gvlcb(const FXFoldingList* recv,const c
13691369 VALUE obj=FXRbGetRubyObj (recv,false );
13701370 FXASSERT (!NIL_P (obj));
13711371 VALUE result=rb_funcall (obj,rb_intern (func),2 ,INT2NUM (x),INT2NUM (y));
1372- return NIL_P (result) ? 0 : reinterpret_cast < FXFoldingItem*>( DATA_PTR ( result) );
1372+ return ( FXFoldingItem*) FXRbConvertPtr ( result, NULL , 0 );
13731373 }
13741374
13751375// ----------------------------------------------------------------------
@@ -1378,7 +1378,7 @@ FXFileAssoc* FXRbCallFileAssocMethod_gvlcb(const FXFileDict* recv,const char *fu
13781378 VALUE obj=FXRbGetRubyObj (recv,false );
13791379 FXASSERT (!NIL_P (obj));
13801380 VALUE result=rb_funcall (obj,rb_intern (func),1 ,to_ruby (pathname));
1381- return NIL_P (result) ? 0 : reinterpret_cast < FXFileAssoc*>( DATA_PTR ( result) );
1381+ return ( FXFileAssoc*) FXRbConvertPtr ( result, NULL , 0 );
13821382 }
13831383
13841384// ----------------------------------------------------------------------
@@ -1388,7 +1388,7 @@ FXIcon* FXRbCallIconMethod_gvlcb(const FXTableItem* recv,const char *func){
13881388 FXASSERT (!NIL_P (obj));
13891389 if (!NIL_P (obj)){
13901390 VALUE result=rb_funcall (obj,rb_intern (func),0 );
1391- return NIL_P (result) ? 0 : reinterpret_cast < FXIcon*>( DATA_PTR ( result) );
1391+ return ( FXIcon*) FXRbConvertPtr ( result, NULL , 0 );
13921392 }
13931393 else {
13941394 return 0 ;
@@ -1401,7 +1401,7 @@ FXWindow* FXRbCallWindowMethod_gvlcb(const FXTableItem* recv,const char *func,FX
14011401 VALUE obj=FXRbGetRubyObj (recv,false );
14021402 FXASSERT (!NIL_P (obj));
14031403 VALUE result=rb_funcall (obj,rb_intern (func),1 ,to_ruby_cb (table));
1404- return NIL_P (result) ? 0 : reinterpret_cast < FXWindow*>( DATA_PTR ( result) );
1404+ return ( FXWindow*) FXRbConvertPtr ( result, NULL , 0 );
14051405 }
14061406
14071407// ----------------------------------------------------------------------
@@ -1411,7 +1411,7 @@ FXRangef FXRbCallRangeMethod_gvlcb(FXObject* recv,const char *func){
14111411 VALUE obj=FXRbGetRubyObj (recv,false );
14121412 FXASSERT (!NIL_P (obj));
14131413 VALUE result=rb_funcall (obj,rb_intern (func),0 );
1414- return *reinterpret_cast < FXRangef*>( DATA_PTR ( result) );
1414+ return *( FXRangef*) FXRbConvertPtr ( result, NULL , 0 );
14151415 }
14161416
14171417// ----------------------------------------------------------------------
@@ -1606,11 +1606,34 @@ FXbool FXRbGLViewer::sortProc(FXfloat*& buffer,FXint& used,FXint& size){
16061606 * FXRbConvertPtr() is just a wrapper around SWIG_ConvertPtr().
16071607 */
16081608
1609- void * FXRbConvertPtr (VALUE obj,swig_type_info* ty){
1609+ void * FXRbConvertPtr (VALUE obj,swig_type_info* ty, int flags ){
16101610 void *ptr;
1611- SWIG_ConvertPtr (obj,&ptr,ty,1 );
1612- return ptr;
1611+ int res = SWIG_ConvertPtr (obj,&ptr,ty,flags);
1612+ if ( res == SWIG_OK ) return ptr;
1613+ #ifdef HAVE_RB_DURING_GC
1614+ if ( rb_during_gc () ){
1615+ rb_bug ( " FXRbConvertPtr got wrong argument type rubyObj=%p" , (void *)obj);
16131616 }
1617+ #endif
1618+ if ( res == SWIG_ERROR_RELEASE_NOT_OWNED ){
1619+ rb_raise ( rb_eTypeError, " clean and disown of non-owned object is not allowed: %" PRIsVALUE, obj);
1620+ }
1621+ if ( res == SWIG_NullReferenceError ){
1622+ rb_raise ( rb_eTypeError, " object can not be NULL: %" PRIsVALUE, obj);
1623+ }
1624+ if ( res == SWIG_ObjectPreviouslyDeletedError ){
1625+ if (ty){
1626+ rb_raise ( rb_eTypeError, " the object has already been deleted: %" PRIsVALUE, ((swig_class *) (ty->clientdata ))->klass );
1627+ } else {
1628+ rb_raise ( rb_eTypeError, " the object has already been deleted" );
1629+ }
1630+ }
1631+ if (ty){
1632+ rb_raise ( rb_eTypeError, " wrong argument type %" PRIsVALUE " , expected kind of %" PRIsVALUE, rb_obj_class (obj), ((swig_class *) (ty->clientdata ))->klass );
1633+ } else {
1634+ rb_raise ( rb_eTypeError, " wrong argument type %" PRIsVALUE, rb_obj_class (obj) );
1635+ }
1636+ }
16141637
16151638
16161639// Returns an FXInputHandle for this Ruby file object
0 commit comments