+ finally fix pointers to member functions in chicken
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@7705 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
57344bfb9a
commit
48f1da1bfc
4 changed files with 80 additions and 0 deletions
|
|
@ -1,6 +1,11 @@
|
||||||
Version 1.3.27 (October 15, 2005)
|
Version 1.3.27 (October 15, 2005)
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
|
10/23/2005: wuzzeb
|
||||||
|
Chicken:
|
||||||
|
+ pointers to member functions finally work properly
|
||||||
|
+ add test of member function pointers to cpp_basic.i
|
||||||
|
|
||||||
10/20/2005: mmatus
|
10/20/2005: mmatus
|
||||||
Ruby, Tcl, Python:
|
Ruby, Tcl, Python:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,4 +48,17 @@
|
||||||
(Bar-global-fval (make <Foo> -34))
|
(Bar-global-fval (make <Foo> -34))
|
||||||
(check (= (slot-ref (Bar-global-fval) 'num) -34))
|
(check (= (slot-ref (Bar-global-fval) 'num) -34))
|
||||||
|
|
||||||
|
;; Now test function pointers
|
||||||
|
(define func1ptr (get-func1-ptr))
|
||||||
|
(define func2ptr (get-func2-ptr))
|
||||||
|
|
||||||
|
(slot-set! f 'num 4)
|
||||||
|
(check (= (func1 f 2) 16))
|
||||||
|
(check (= (func2 f 2) -8))
|
||||||
|
|
||||||
|
(slot-set! f 'func-ptr func1ptr)
|
||||||
|
(check (= (test-func-ptr f 2) 16))
|
||||||
|
(slot-set! f 'func-ptr func2ptr)
|
||||||
|
(check (= (test-func-ptr f 2) -8))
|
||||||
|
|
||||||
(exit 0)
|
(exit 0)
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,16 @@ class Foo {
|
||||||
public:
|
public:
|
||||||
Foo(int a) : num(a) {}
|
Foo(int a) : num(a) {}
|
||||||
int num;
|
int num;
|
||||||
|
|
||||||
|
int func1(int a) {
|
||||||
|
return 2*a*num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int func2(int a) {
|
||||||
|
return -a*num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int (Foo::*func_ptr)(int);
|
||||||
};
|
};
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
@ -52,3 +62,19 @@ Foo *Bar::global_fptr = NULL;
|
||||||
Foo &Bar::global_fref = init_ref;
|
Foo &Bar::global_fref = init_ref;
|
||||||
Foo Bar::global_fval = Foo(3);
|
Foo Bar::global_fval = Foo(3);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
/* member function tests */
|
||||||
|
%inline %{
|
||||||
|
int (Foo::*get_func1_ptr())(int) {
|
||||||
|
return &Foo::func1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int (Foo::*get_func2_ptr())(int) {
|
||||||
|
return &Foo::func2;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_func_ptr(Foo *f, int a) {
|
||||||
|
return (f->*(f->func_ptr))(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
|
||||||
|
|
@ -236,6 +236,42 @@ SIMPLE_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEO
|
||||||
$result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0);
|
$result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* special typemaps for class pointers */
|
||||||
|
%typemap(in) SWIGTYPE (CLASS::*) {
|
||||||
|
char err_msg[256];
|
||||||
|
|
||||||
|
if (C_swig_is_pair($input)) {
|
||||||
|
/* try and convert pointer object */
|
||||||
|
void *result;
|
||||||
|
if (!SWIG_ConvertPtr(C_block_item($input,1), &result, $descriptor, 0)) {
|
||||||
|
C_word ptr = C_block_item($input,0);
|
||||||
|
if (C_swig_is_string(ptr)) {
|
||||||
|
SWIG_UnpackData(C_c_string(ptr), (void *) &$1, sizeof($type));
|
||||||
|
} else {
|
||||||
|
snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name));
|
||||||
|
SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name));
|
||||||
|
SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name));
|
||||||
|
SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%typemap(out) SWIGTYPE (CLASS::*) {
|
||||||
|
size_t ptr_size = sizeof($type);
|
||||||
|
C_word *known_space = C_alloc(C_SIZEOF_PAIR + C_SIZEOF_STRING(2*ptr_size) + C_SIZEOF_SWIG_POINTER);
|
||||||
|
char *temp = (char *)malloc(2*ptr_size);
|
||||||
|
C_word ptr = SWIG_NewPointerObj((void *) known_space, $descriptor, 0);
|
||||||
|
|
||||||
|
SWIG_PackData(temp, (void *) &$1, ptr_size);
|
||||||
|
$result = C_pair(&known_space, C_string(&known_space, 2*ptr_size, temp), ptr);
|
||||||
|
free(temp);
|
||||||
|
}
|
||||||
|
|
||||||
/* Pass-by-value */
|
/* Pass-by-value */
|
||||||
|
|
||||||
%typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE($&1_ltype argp) {
|
%typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE($&1_ltype argp) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue