From 5c6b788d5ae4adeabe176d56c7b79d27a8ffe129 Mon Sep 17 00:00:00 2001
From: Lars Kanis <lars@greiz-reinsdorf.de>
Date: Sat, 13 Jun 2015 22:51:49 +0200
Subject: [PATCH] Add GVL callback wrappers for Bool, Int, Uint and Long
 methods.

---
 ext/fox16_c/FXRuby.cpp             |  4 +-
 ext/fox16_c/include/FXRuby.h       | 32 +++++++-------
 ext/fox16_c/include/gvl_wrappers.h | 69 +++++++++++++++++++++++++++++-
 3 files changed, 86 insertions(+), 19 deletions(-)

diff --git a/ext/fox16_c/FXRuby.cpp b/ext/fox16_c/FXRuby.cpp
index dd01d88..4d014fd 100644
--- a/ext/fox16_c/FXRuby.cpp
+++ b/ext/fox16_c/FXRuby.cpp
@@ -1416,7 +1416,7 @@ void FXRbCallVoidMethod_gvlcb(FXDC* recv,ID func) {
 
 //----------------------------------------------------------------------
 
-bool FXRbCallBoolMethod(const FXObject* recv,ID func){
+bool FXRbCallBoolMethod_gvlcb(const FXObject* recv,ID func){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE v=rb_funcall(obj,func,0,NULL);
@@ -1426,7 +1426,7 @@ bool FXRbCallBoolMethod(const FXObject* recv,ID func){
 //----------------------------------------------------------------------
 
 // Call function with "FXint" return value
-FXint FXRbCallIntMethod(const FXObject* recv,ID func){
+FXint FXRbCallIntMethod_gvlcb(const FXObject* recv,ID func){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE result=rb_funcall(obj,func,0,NULL);
diff --git a/ext/fox16_c/include/FXRuby.h b/ext/fox16_c/include/FXRuby.h
index e3589dd..c601e36 100644
--- a/ext/fox16_c/include/FXRuby.h
+++ b/ext/fox16_c/include/FXRuby.h
@@ -569,27 +569,27 @@ void FXRbCallVoidMethod_gvlcb(FXObject* recv,ID func,TYPE1& arg1,TYPE2 arg2,TYPE
   }
 
 // Call function with "FXbool" return value
-inline bool FXRbCallBoolMethod(FXStream* recv,ID func){
+inline bool FXRbCallBoolMethod_gvlcb(FXStream* recv,ID func){
   VALUE v=rb_funcall(FXRbGetRubyObj(recv,false),func,0,NULL);
   return (v==Qtrue);
   }
 
 template<class TYPE1>
-bool FXRbCallBoolMethod(FXStream* recv,ID func,TYPE1 arg){
+bool FXRbCallBoolMethod_gvlcb(FXStream* recv,ID func,TYPE1 arg){
   VALUE v=rb_funcall(FXRbGetRubyObj(recv,false),func,1,to_ruby(arg));
   return (v==Qtrue);
   }
 
 template<class TYPE1,class TYPE2>
-bool FXRbCallBoolMethod(FXStream* recv,ID func,TYPE1 arg1,TYPE2 arg2){
+bool FXRbCallBoolMethod_gvlcb(FXStream* recv,ID func,TYPE1 arg1,TYPE2 arg2){
   VALUE v=rb_funcall(FXRbGetRubyObj(recv,false),func,2,to_ruby(arg1),to_ruby(arg2));
   return (v==Qtrue);
   }
 
-bool FXRbCallBoolMethod(const FXObject* recv,ID func);
+bool FXRbCallBoolMethod_gvlcb(const FXObject* recv,ID func);
 
 template<class TYPE>
-bool FXRbCallBoolMethod(FXObject* recv, ID func, TYPE& arg){
+bool FXRbCallBoolMethod_gvlcb(FXObject* recv, ID func, TYPE& arg){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE v=rb_funcall(obj,func,1,to_ruby(arg));
@@ -597,13 +597,13 @@ bool FXRbCallBoolMethod(FXObject* recv, ID func, TYPE& arg){
   }
 
 template<class TYPE>
-bool FXRbCallBoolMethod(const FXObject* recv,ID func,TYPE& arg){
+bool FXRbCallBoolMethod_gvlcb(const FXObject* recv,ID func,TYPE& arg){
   VALUE v=rb_funcall(FXRbGetRubyObj(recv,false),func,1,to_ruby(arg));
   return (v==Qtrue);
   }
 
 template<class TYPE1, class TYPE2>
-bool FXRbCallBoolMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2){
+bool FXRbCallBoolMethod_gvlcb(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE v=rb_funcall(obj,func,2,to_ruby(arg1),to_ruby(arg2));
@@ -611,7 +611,7 @@ bool FXRbCallBoolMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2){
   }
 
 template<class TYPE1, class TYPE2, class TYPE3>
-bool FXRbCallBoolMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, TYPE3 arg3){
+bool FXRbCallBoolMethod_gvlcb(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, TYPE3 arg3){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE v=rb_funcall(obj,func,3,to_ruby(arg1),to_ruby(arg2),to_ruby(arg3));
@@ -619,7 +619,7 @@ bool FXRbCallBoolMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, T
   }
 
 template<class TYPE1, class TYPE2, class TYPE3, class TYPE4, class TYPE5>
-bool FXRbCallBoolMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, TYPE3 arg3, TYPE4 arg4, TYPE5 arg5){
+bool FXRbCallBoolMethod_gvlcb(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, TYPE3 arg3, TYPE4 arg4, TYPE5 arg5){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE v=rb_funcall(obj,func,5,to_ruby(arg1),to_ruby(arg2),to_ruby(arg3),to_ruby(arg4),to_ruby(arg5));
@@ -627,10 +627,10 @@ bool FXRbCallBoolMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, T
   }
 
 // Call function with "FXint" return value
-FXint FXRbCallIntMethod(const FXObject* recv,ID func);
+FXint FXRbCallIntMethod_gvlcb(const FXObject* recv,ID func);
 
 template<class TYPE>
-FXint FXRbCallIntMethod(FXObject* recv, ID func, TYPE arg){
+FXint FXRbCallIntMethod_gvlcb(FXObject* recv, ID func, TYPE arg){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE v=rb_funcall(obj,func,1,to_ruby(arg));
@@ -638,7 +638,7 @@ FXint FXRbCallIntMethod(FXObject* recv, ID func, TYPE arg){
   }
 
 template<class TYPE>
-FXint FXRbCallIntMethod(const FXObject* recv, ID func, TYPE arg){
+FXint FXRbCallIntMethod_gvlcb(const FXObject* recv, ID func, TYPE arg){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE v=rb_funcall(obj,func,1,to_ruby(arg));
@@ -646,7 +646,7 @@ FXint FXRbCallIntMethod(const FXObject* recv, ID func, TYPE arg){
   }
 
 template<class TYPE1, class TYPE2>
-FXint FXRbCallIntMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2){
+FXint FXRbCallIntMethod_gvlcb(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE result=rb_funcall(obj,func,2,to_ruby(arg1),to_ruby(arg2));
@@ -654,7 +654,7 @@ FXint FXRbCallIntMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2){
   }
 
 template<class TYPE1, class TYPE2, class TYPE3, class TYPE4, class TYPE5>
-FXint FXRbCallIntMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, TYPE3 arg3, TYPE4 arg4, TYPE5 arg5){
+FXint FXRbCallIntMethod_gvlcb(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, TYPE3 arg3, TYPE4 arg4, TYPE5 arg5){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE result=rb_funcall(obj,func,5,to_ruby(arg1),to_ruby(arg2),to_ruby(arg3),to_ruby(arg4),to_ruby(arg5));
@@ -663,7 +663,7 @@ FXint FXRbCallIntMethod(const FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, T
 
 // Call function with "long" return value
 template<class TYPE1, class TYPE2, class TYPE3>
-long FXRbCallLongMethod(FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, TYPE3 arg3){
+long FXRbCallLongMethod_gvlcb(FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, TYPE3 arg3){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE v=rb_funcall(obj,func,3,to_ruby(arg1),to_ruby(arg2),to_ruby(arg3));
@@ -672,7 +672,7 @@ long FXRbCallLongMethod(FXObject* recv, ID func, TYPE1 arg1, TYPE2 arg2, TYPE3 a
 
 // Call functions with "FXuint" return value
 template<class TYPE>
-FXuint FXRbCallUIntMethod(FXObject* recv, ID func, TYPE arg){
+FXuint FXRbCallUIntMethod_gvlcb(FXObject* recv, ID func, TYPE arg){
   VALUE obj=FXRbGetRubyObj(recv,false);
   FXASSERT(!NIL_P(obj));
   VALUE v=rb_funcall(obj,func,1,to_ruby(arg));
diff --git a/ext/fox16_c/include/gvl_wrappers.h b/ext/fox16_c/include/gvl_wrappers.h
index 0dadbcf..918a99a 100644
--- a/ext/fox16_c/include/gvl_wrappers.h
+++ b/ext/fox16_c/include/gvl_wrappers.h
@@ -271,6 +271,62 @@ FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_STUB_DECL )
   param(TYPE8, , arg8) \
   param(TYPE9, , arg9)
 
+#define FOR_EACH_PARAM_OF_FXRbCallBoolMethod_2(param) \
+  param(ID, , func)
+
+#define FOR_EACH_PARAM_OF_FXRbCallBoolMethod_3(param) \
+  param(ID, , func) \
+  param(TYPE1, &, arg1)
+
+#define FOR_EACH_PARAM_OF_FXRbCallBoolMethod_4(param) \
+  param(ID, , func) \
+  param(TYPE1, , arg1) \
+  param(TYPE2, , arg2)
+
+#define FOR_EACH_PARAM_OF_FXRbCallBoolMethod_5(param) \
+  param(ID, , func) \
+  param(TYPE1, , arg1) \
+  param(TYPE2, , arg2) \
+  param(TYPE3, , arg3)
+
+#define FOR_EACH_PARAM_OF_FXRbCallBoolMethod_7(param) \
+  param(ID, , func) \
+  param(TYPE1, , arg1) \
+  param(TYPE2, , arg2) \
+  param(TYPE3, , arg3) \
+  param(TYPE4, , arg4) \
+  param(TYPE5, , arg5)
+
+#define FOR_EACH_PARAM_OF_FXRbCallIntMethod_2(param) \
+  param(ID, , func)
+
+#define FOR_EACH_PARAM_OF_FXRbCallIntMethod_3(param) \
+  param(ID, , func) \
+  param(TYPE1, , arg1)
+
+#define FOR_EACH_PARAM_OF_FXRbCallIntMethod_4(param) \
+  param(ID, , func) \
+  param(TYPE1, , arg1) \
+  param(TYPE2, , arg2)
+
+#define FOR_EACH_PARAM_OF_FXRbCallIntMethod_7(param) \
+  param(ID, , func) \
+  param(TYPE1, , arg1) \
+  param(TYPE2, , arg2) \
+  param(TYPE3, , arg3) \
+  param(TYPE4, , arg4) \
+  param(TYPE5, , arg5)
+
+#define FOR_EACH_PARAM_OF_FXRbCallLongMethod_5(param) \
+  param(ID, , func) \
+  param(TYPE1, , arg1) \
+  param(TYPE2, , arg2) \
+  param(TYPE3, , arg3)
+
+#define FOR_EACH_PARAM_OF_FXRbCallUIntMethod_3(param) \
+  param(ID, , func) \
+  param(TYPE1, , arg1)
+
 /* function( name, void_or_nonvoid, returntype, firstparamtype, firstparamname, paramcount ) */
 #define FOR_EACH_CALLBACK_FUNCTION(function) \
   function(FXRbCallVoidMethod, GVL_TYPE_VOID, void, RECV, recv, 2) \
@@ -281,7 +337,18 @@ FOR_EACH_BLOCKING_FUNCTION( DEFINE_GVL_STUB_DECL )
   function(FXRbCallVoidMethod, GVL_TYPE_VOID, void, RECV, recv, 7) \
   function(FXRbCallVoidMethod, GVL_TYPE_VOID, void, RECV, recv, 8) \
   function(FXRbCallVoidMethod, GVL_TYPE_VOID, void, RECV, recv, 9) \
-  function(FXRbCallVoidMethod, GVL_TYPE_VOID, void, RECV, recv, 11)
+  function(FXRbCallVoidMethod, GVL_TYPE_VOID, void, RECV, recv, 11) \
+  function(FXRbCallBoolMethod, GVL_TYPE_NONVOID, bool, RECV, recv, 2) \
+  function(FXRbCallBoolMethod, GVL_TYPE_NONVOID, bool, RECV, recv, 3) \
+  function(FXRbCallBoolMethod, GVL_TYPE_NONVOID, bool, RECV, recv, 4) \
+  function(FXRbCallBoolMethod, GVL_TYPE_NONVOID, bool, RECV, recv, 5) \
+  function(FXRbCallBoolMethod, GVL_TYPE_NONVOID, bool, RECV, recv, 7) \
+  function(FXRbCallIntMethod, GVL_TYPE_NONVOID, FXint, RECV, recv, 2) \
+  function(FXRbCallIntMethod, GVL_TYPE_NONVOID, FXint, RECV, recv, 3) \
+  function(FXRbCallIntMethod, GVL_TYPE_NONVOID, FXint, RECV, recv, 4) \
+  function(FXRbCallIntMethod, GVL_TYPE_NONVOID, FXint, RECV, recv, 7) \
+  function(FXRbCallLongMethod, GVL_TYPE_NONVOID, FXint, RECV, recv, 5) \
+  function(FXRbCallUIntMethod, GVL_TYPE_NONVOID, FXint, RECV, recv, 3) \
 
 FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_STUB_DECL )
 FOR_EACH_CALLBACK_FUNCTION( DEFINE_GVLCB_WRAPPER_STRUCT )
-- 
GitLab