Add PHP typemaps for pointer to method.

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11768 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Olly Betts 2009-12-03 12:59:59 +00:00
commit 67bbac4872
6 changed files with 62 additions and 3 deletions

View file

@ -2,10 +2,12 @@ Version 1.3.41 (in progress)
============================ ============================
2009-12-03: olly 2009-12-03: olly
[PHP] Add typemaps for long long and unsigned long long. [PHP] Add typemaps for long long and unsigned long long, and for
pointer to method.
2009-12-02: olly 2009-12-02: olly
[PHP] Fix warning and rename of reserved class name to be case insensitive. [PHP] Fix warning and rename of reserved class name to be case
insensitive.
2009-12-01: wsfulton 2009-12-01: wsfulton
Revert support for %extend and memberin typemaps added in swig-1.3.39. The Revert support for %extend and memberin typemaps added in swig-1.3.39. The

View file

@ -51,3 +51,6 @@
c.module_number = module_number; c.module_number = module_number;
zend_register_constant( &c TSRMLS_CC ); zend_register_constant( &c TSRMLS_CC );
} }
/* Handled as a global variable. */
%typemap(consttab) SWIGTYPE (CLASS::*) "";

View file

@ -105,6 +105,16 @@
zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&z_var, sizeof(zval *), NULL); zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&z_var, sizeof(zval *), NULL);
} }
%typemap(varinit) SWIGTYPE (CLASS::*)
{
void * p = emalloc(sizeof($1));
memcpy(p, &$1, sizeof($1));
zval * resource;
MAKE_STD_ZVAL(resource);
ZEND_REGISTER_RESOURCE(resource, p, le_member_ptr);
zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&resource, sizeof(zval *), NULL);
}
%typemap(varin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, enum SWIGTYPE %typemap(varin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, enum SWIGTYPE
{ {
zval **z_var; zval **z_var;
@ -216,6 +226,15 @@
$1 = ($1_ltype)_temp; $1 = ($1_ltype)_temp;
} }
%typemap(varin) SWIGTYPE (CLASS::*)
{
zval **z_var;
zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var);
void * p = (void*)zend_fetch_resource(*z_var TSRMLS_CC, -1, SWIG_MEMBER_PTR, NULL, 1, le_member_ptr);
memcpy(&$1, p, sizeof($1));
}
%typemap(varout) int, %typemap(varout) int,
unsigned int, unsigned int,
unsigned short, unsigned short,
@ -328,4 +347,12 @@ deliberate error cos this code looks bogus to me
SWIG_SetPointerZval(*z_var, (void*)$1, $1_descriptor, 0); SWIG_SetPointerZval(*z_var, (void*)$1, $1_descriptor, 0);
} }
%typemap(varout) SWIGTYPE (CLASS::*)
{
void * p = emalloc(sizeof($1));
memcpy(p, &$1, sizeof($1));
zval * resource;
MAKE_STD_ZVAL(resource);
ZEND_REGISTER_RESOURCE(resource, p, le_member_ptr);
zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&resource, sizeof(zval *), NULL);
}

View file

@ -354,6 +354,23 @@
SWIG_SetPointerZval($input, (void *)&$1_name, $1_descriptor, $owner); SWIG_SetPointerZval($input, (void *)&$1_name, $1_descriptor, $owner);
%} %}
%typemap(out) SWIGTYPE (CLASS::*)
{
void * p = emalloc(sizeof($1));
memcpy(p, &$1, sizeof($1));
zval * resource;
MAKE_STD_ZVAL(resource);
ZEND_REGISTER_RESOURCE(resource, p, le_member_ptr);
SWIG_SetPointerZval(return_value, (void *)&$1, $1_descriptor, $owner);
}
%typemap(in) SWIGTYPE (CLASS::*)
{
void * p = (void*)zend_fetch_resource($input TSRMLS_CC, -1, SWIG_MEMBER_PTR, NULL, 1, le_member_ptr);
memcpy(&$1, p, sizeof($1));
}
%typemap(out) SWIGTYPE *DYNAMIC, %typemap(out) SWIGTYPE *DYNAMIC,
SWIGTYPE &DYNAMIC SWIGTYPE &DYNAMIC
{ {

View file

@ -8,5 +8,6 @@
%init %{ %init %{
SWIG_php_minit { SWIG_php_minit {
SWIG_InitializeModule(0); SWIG_InitializeModule(0);
le_member_ptr = zend_register_list_destructors_ex(member_ptr_dtor, NULL, SWIG_MEMBER_PTR, module_number);
%} %}

View file

@ -261,3 +261,12 @@ static void SWIG_Php_SetModule(swig_module_info *pointer) {
TSRMLS_FETCH(); TSRMLS_FETCH();
REGISTER_MAIN_LONG_CONSTANT(const_name, (long) pointer, 0); REGISTER_MAIN_LONG_CONSTANT(const_name, (long) pointer, 0);
} }
#define SWIG_MEMBER_PTR ((char*)"CLASS::*")
static void member_ptr_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) {
efree(rsrc->ptr);
}
static int le_member_ptr;