diff options
Diffstat (limited to 'Lib/php/php.swg')
-rw-r--r-- | Lib/php/php.swg | 342 |
1 files changed, 205 insertions, 137 deletions
diff --git a/Lib/php/php.swg b/Lib/php/php.swg index 4eba6be2a..ca8704fd8 100644 --- a/Lib/php/php.swg +++ b/Lib/php/php.swg @@ -4,13 +4,19 @@ * PHP configuration file * ----------------------------------------------------------------------------- */ +%include <typemaps/fragments.swg> + +// Default to generating PHP type declarations (for PHP >= 8) except for +// cases which are liable to cause compatibility issues with existing +// bindings. +%feature("php:type", "compat"); + %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "phprun.swg" // PHP runtime functions %include <phpinit.swg> // PHP initialization routine. -%include <globalvar.i> // Global variables. %include <const.i> // use %init %{ "/*code goes here*/ " %} @@ -35,107 +41,142 @@ %include <utils.i> -%pass_by_val(bool,CONVERT_BOOL_IN); +%pass_by_val(bool, "bool", CONVERT_BOOL_IN); -%pass_by_val(size_t, CONVERT_INT_IN); +%pass_by_val(size_t, "int", CONVERT_INT_IN); -%pass_by_val(enum SWIGTYPE, CONVERT_INT_IN); +%pass_by_val(enum SWIGTYPE, "int", CONVERT_INT_IN); -%pass_by_val(signed int, CONVERT_INT_IN); -%pass_by_val(int,CONVERT_INT_IN); -%pass_by_val(unsigned int,CONVERT_INT_IN); +%pass_by_val(signed int, "int", CONVERT_INT_IN); +%pass_by_val(int,"int", CONVERT_INT_IN); +%pass_by_val(unsigned int,"int", CONVERT_INT_IN); -%pass_by_val(signed short, CONVERT_INT_IN); -%pass_by_val(short,CONVERT_INT_IN); -%pass_by_val(unsigned short, CONVERT_INT_IN); +%pass_by_val(signed short, "int", CONVERT_INT_IN); +%pass_by_val(short,"int", CONVERT_INT_IN); +%pass_by_val(unsigned short, "int", CONVERT_INT_IN); -%pass_by_val(signed long, CONVERT_INT_IN); -%pass_by_val(long, CONVERT_INT_IN); -%pass_by_val(unsigned long, CONVERT_INT_IN); +%pass_by_val(signed long, "int", CONVERT_INT_IN); +%pass_by_val(long, "int", CONVERT_INT_IN); +%pass_by_val(unsigned long, "int", CONVERT_INT_IN); -%pass_by_val(signed long long, CONVERT_LONG_LONG_IN); -%pass_by_val(long long, CONVERT_LONG_LONG_IN); -%pass_by_val(unsigned long long, CONVERT_UNSIGNED_LONG_LONG_IN); +%pass_by_val(signed long long, "int|string", CONVERT_LONG_LONG_IN); +%pass_by_val(long long, "int|string", CONVERT_LONG_LONG_IN); +%pass_by_val(unsigned long long, "int|string", CONVERT_UNSIGNED_LONG_LONG_IN); -%pass_by_val(signed char, CONVERT_INT_IN); -%pass_by_val(char, CONVERT_CHAR_IN); -%pass_by_val(unsigned char, CONVERT_INT_IN); +%pass_by_val(signed char, "int", CONVERT_INT_IN); +%pass_by_val(char, "string", CONVERT_CHAR_IN); +%pass_by_val(unsigned char, "int", CONVERT_INT_IN); -%pass_by_val(float, CONVERT_FLOAT_IN); +%pass_by_val(float, "float", CONVERT_FLOAT_IN); -%pass_by_val(double, CONVERT_FLOAT_IN); +%pass_by_val(double, "float", CONVERT_FLOAT_IN); -%pass_by_val(char *, CONVERT_STRING_IN); +%pass_by_val(char *, "string", CONVERT_STRING_IN); %typemap(in) char *& = const char *&; %typemap(directorout) char *& = const char *&; // char array can be in/out, though the passed string may not be big enough... // so we have to size it -%typemap(in) char[ANY] +%typemap(in, phptype="string") char[ANY] %{ convert_to_string(&$input); $1 = ($1_ltype) Z_STRVAL($input); %} -%typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) %{ +%typemap(in, phptype="string") (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) %{ convert_to_string(&$input); $1 = ($1_ltype) Z_STRVAL($input); $2 = ($2_ltype) Z_STRLEN($input); %} /* Object passed by value. Convert to a pointer */ -%typemap(in) SWIGTYPE ($&1_ltype tmp) +%typemap(in, phptype="SWIGTYPE") SWIGTYPE ($&1_ltype tmp) %{ - if (SWIG_ConvertPtr(&$input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); - } - $1 = *tmp; + if (SWIG_ConvertPtr(&$input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { + zend_type_error("Expected $&1_descriptor for argument $argnum of $symname"); + return; + } + $1 = *tmp; %} %typemap(directorout) SWIGTYPE ($&1_ltype tmp) %{ - /* If exit was via exception, PHP NULL is returned so skip the conversion. */ - if (!EG(exception)) { - if (SWIG_ConvertPtr($input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); - $result = *tmp; - } + if (SWIG_ConvertPtr($input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { + zend_type_error("Expected $&1_descriptor for argument $argnum of $symname"); + SWIG_fail; + } + $result = *tmp; %} -%typemap(in) SWIGTYPE *, +%typemap(in, phptype="?SWIGTYPE") SWIGTYPE *, SWIGTYPE [] %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); - } + if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + return; + } %} -%typemap(in) SWIGTYPE & +%typemap(directorout) SWIGTYPE * (swig_owntype own), + SWIGTYPE [] (swig_owntype own) %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); - } + if (SWIG_ConvertPtrAndOwn($input, (void **)&$result, $1_descriptor, SWIG_POINTER_DISOWN, &own) < 0) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + SWIG_fail; + } + swig_acquire_ownership_obj((void*)$result, own); %} -%typemap(in) SWIGTYPE && +%typemap(in, phptype="SWIGTYPE") SWIGTYPE & %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); - } + if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + return; + } +%} +%typemap(in, fragment="<memory>") SWIGTYPE && (void *argp = 0, int res = 0, std::unique_ptr<$*1_ltype> rvrdeleter) %{ + res = SWIG_ConvertPtr(&$input, &argp, $descriptor, SWIG_POINTER_RELEASE); + if (!SWIG_IsOK(res)) { + if (res == SWIG_ERROR_RELEASE_NOT_OWNED) { + zend_type_error("Cannot release ownership as memory is not owned for argument $argnum of $1_descriptor of $symname"); + return; + } else { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + return; + } + } + if (!argp) { + zend_type_error("Invalid null reference for argument $argnum of $1_descriptor of $symname"); + return; + } + $1 = ($1_ltype)argp; + rvrdeleter.reset($1); +%} + +%typemap(directorout) SWIGTYPE & ($1_ltype tmp), + SWIGTYPE && ($1_ltype tmp) +%{ + if (SWIG_ConvertPtr($input, (void **) &tmp, $1_descriptor, 0) < 0 || tmp == NULL) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + SWIG_fail; + } + $result = tmp; %} -%typemap(in) SWIGTYPE *const& ($*ltype temp) +%typemap(in, phptype="?SWIGTYPE") SWIGTYPE *const& ($*ltype temp) %{ - if (SWIG_ConvertPtr(&$input, (void **) &temp, $*1_descriptor, 0) < 0) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $*1_descriptor"); - } - $1 = ($1_ltype)&temp; + if (SWIG_ConvertPtr(&$input, (void **) &temp, $*1_descriptor, 0) < 0) { + zend_type_error("Expected $*1_descriptor for argument $argnum of $symname"); + return; + } + $1 = ($1_ltype)&temp; %} -%typemap(in) SWIGTYPE *DISOWN +%typemap(in, phptype="?SWIGTYPE") SWIGTYPE *DISOWN %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN ) < 0) { - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); + if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN) < 0) { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + return; } %} @@ -144,19 +185,22 @@ SWIGTYPE &, SWIGTYPE &&; -%typemap(in) void * +%typemap(in, phptype="?SWIGTYPE") void * %{ - if (SWIG_ConvertPtr(&$input, (void **) &$1, 0, 0) < 0) { - /* Allow NULL from php for void* */ - if (Z_ISNULL($input)) $1=0; - else - SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); - } + if (SWIG_ConvertPtr(&$input, (void **) &$1, 0, 0) < 0) { + /* Allow NULL from php for void* */ + if (Z_ISNULL($input)) { + $1=0; + } else { + zend_type_error("Expected $1_descriptor for argument $argnum of $symname"); + return; + } + } %} /* Special case when void* is passed by reference so it can be made to point to opaque api structs */ -%typemap(in) void ** ($*1_ltype ptr, int force), +%typemap(in, phptype="?SWIG\\_p_void", byref=1) void ** ($*1_ltype ptr, int force), void *& ($*1_ltype ptr, int force) { /* If they pass NULL by reference, make it into a void* @@ -165,7 +209,8 @@ /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!(Z_ISREF($input) && Z_ISNULL_P(Z_REFVAL($input)))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ - SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); + zend_throw_exception(zend_ce_type_error, "Type error in argument $arg of $symname", 0); + goto fail; } } force=0; @@ -183,14 +228,15 @@ %typemap(argout) void **, void *& %{ - if (force$argnum) { - SWIG_SetPointerZval(&$input, (void*) ptr$argnum, $*1_descriptor, 1); + if (force$argnum && Z_ISREF($input)) { + SWIG_SetPointerZval(Z_REFVAL($input), (void*) ptr$argnum, $*1_descriptor, 1); } %} /* Typemap for output values */ -%typemap(out) int, +%typemap(out, phptype="int") + int, unsigned int, short, unsigned short, @@ -198,39 +244,35 @@ unsigned long, signed char, unsigned char, - bool, size_t %{ RETVAL_LONG($1); %} -%typemap(out) enum SWIGTYPE +%typemap(out, phptype="int") enum SWIGTYPE %{ RETVAL_LONG((long)$1); %} -%typemap(out) long long +%typemap(out, phptype="int|string") long long %{ if ((long long)LONG_MIN <= $1 && $1 <= (long long)LONG_MAX) { RETVAL_LONG((long)($1)); } else { - char temp[256]; - sprintf(temp, "%lld", (long long)$1); - RETVAL_STRING(temp); + RETVAL_NEW_STR(zend_strpprintf(0, "%lld", (long long)$1)); } %} -%typemap(out) unsigned long long +%typemap(out, phptype="int|string") unsigned long long %{ if ($1 <= (unsigned long long)LONG_MAX) { RETVAL_LONG((long)($1)); } else { - char temp[256]; - sprintf(temp, "%llu", (unsigned long long)$1); - RETVAL_STRING(temp); + RETVAL_NEW_STR(zend_strpprintf(0, "%llu", (unsigned long long)$1)); } %} -%typemap(out) const int &, +%typemap(out, phptype="int") + const int &, const unsigned int &, const short &, const unsigned short &, @@ -244,34 +286,30 @@ RETVAL_LONG(*$1); %} -%typemap(out) const enum SWIGTYPE & +%typemap(out, phptype="int") const enum SWIGTYPE & %{ RETVAL_LONG((long)*$1); %} -%typemap(out) const enum SWIGTYPE && +%typemap(out, phptype="int") const enum SWIGTYPE && %{ RETVAL_LONG((long)*$1); %} -%typemap(out) const long long & +%typemap(out, phptype="int|string") const long long & %{ if ((long long)LONG_MIN <= *$1 && *$1 <= (long long)LONG_MAX) { RETVAL_LONG((long)(*$1)); } else { - char temp[256]; - sprintf(temp, "%lld", (long long)(*$1)); - RETVAL_STRING(temp); + RETVAL_NEW_STR(zend_strpprintf(0, "%lld", (long long)(*$1))); } %} -%typemap(out) const unsigned long long & +%typemap(out, phptype="int|string") const unsigned long long & %{ if (*$1 <= (unsigned long long)LONG_MAX) { RETVAL_LONG((long)(*$1)); } else { - char temp[256]; - sprintf(temp, "%llu", (unsigned long long)(*$1)); - RETVAL_STRING(temp); + RETVAL_NEW_STR(zend_strpprintf(0, "%llu", (unsigned long long)(*$1))); } %} @@ -303,12 +341,12 @@ } %} -%typemap(out) bool +%typemap(out, phptype="bool") bool %{ RETVAL_BOOL(($1) ? 1 : 0); %} -%typemap(out) const bool & +%typemap(out, phptype="bool") const bool & %{ RETVAL_BOOL((*$1) ? 1 : 0); %} @@ -318,13 +356,13 @@ ZVAL_BOOL($input, ($1) ? 1 : 0); %} -%typemap(out) float, +%typemap(out, phptype="float") float, double %{ RETVAL_DOUBLE($1); %} -%typemap(out) const float &, +%typemap(out, phptype="float") const float &, const double & %{ RETVAL_DOUBLE(*$1); @@ -336,18 +374,22 @@ ZVAL_DOUBLE($input, $1); %} -%typemap(out) char +%typemap(out, phptype="string") char %{ RETVAL_STRINGL(&$1, 1); %} -%typemap(out) const char & +%typemap(out, phptype="string") const char & %{ RETVAL_STRINGL(&*$1, 1); %} -%typemap(out) char *, - char [] +%typemap(out, phptype="string") char [] +%{ + RETVAL_STRING((const char *)$1); +%} + +%typemap(out, phptype="?string") char * %{ if (!$1) { RETVAL_NULL(); @@ -356,7 +398,7 @@ } %} -%typemap(out) char *& +%typemap(out, phptype="?string") char *& %{ if (!*$1) { RETVAL_NULL(); @@ -365,17 +407,22 @@ } %} -%typemap(out) SWIGTYPE *, +%typemap(out, phptype="?SWIGTYPE") SWIGTYPE * +%{ + SWIG_SetPointerZval($result, (void *)$1, $1_descriptor, $owner); +%} + +%typemap(out, phptype="SWIGTYPE") SWIGTYPE [], SWIGTYPE &, SWIGTYPE && %{ - SWIG_SetPointerZval(return_value, (void *)$1, $1_descriptor, $owner); + SWIG_SetPointerZval($result, (void *)$1, $1_descriptor, $owner); %} -%typemap(out) SWIGTYPE *const& +%typemap(out, phptype="?SWIGTYPE") SWIGTYPE *const& %{ - SWIG_SetPointerZval(return_value, (void *)*$1, $*1_descriptor, $owner); + SWIG_SetPointerZval($result, (void *)*$1, $*1_descriptor, $owner); %} %typemap(directorin) SWIGTYPE *, @@ -383,53 +430,57 @@ SWIGTYPE &, SWIGTYPE && %{ - SWIG_SetPointerZval($input, (void *)&$1, $1_descriptor, ($owner)|2); + ZVAL_UNDEF($input); + SWIG_SetPointerZval($input, (void *)&$1, $1_descriptor, $owner); %} -%typemap(out, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) +%typemap(out, phptype="SWIGTYPE") SWIGTYPE (CLASS::*) { void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); - RETVAL_RES(zend_register_resource(p, swig_member_ptr)); + SWIG_SetPointerZval($result, (void *)p, $&1_descriptor, 1); } -%typemap(in, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) +%typemap(in, phptype="SWIGTYPE") SWIGTYPE (CLASS::*) { - void * p = (void*)zend_fetch_resource_ex(&$input, SWIG_MEMBER_PTR, swig_member_ptr); + void * p = SWIG_Z_FETCH_OBJ_P(&$input)->ptr; memcpy(&$1, p, sizeof($1)); } -%typemap(out) SWIGTYPE *DYNAMIC, - SWIGTYPE &DYNAMIC +%typemap(out, phptype="?SWIGTYPE") SWIGTYPE *DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); - SWIG_SetPointerZval(return_value, (void *)$1, ty, $owner); + SWIG_SetPointerZval($result, (void *)$1, ty, $owner); } -%typemap(out) SWIGTYPE -#ifdef __cplusplus +%typemap(out, phptype="SWIGTYPE") SWIGTYPE &DYNAMIC { - $&1_ltype resultobj = new $1_ltype((const $1_ltype &) $1); - SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); + swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); + SWIG_SetPointerZval($result, (void *)$1, ty, $owner); } -#else + +%typemap(out, phptype="SWIGTYPE") SWIGTYPE { - $&1_ltype resultobj = ($&1_ltype) emalloc(sizeof($1_type)); +#ifdef __cplusplus + $&1_ltype resultobj = new $1_ltype($1); +#else + $&1_ltype resultobj = ($&1_ltype) malloc(sizeof($1_type)); memcpy(resultobj, &$1, sizeof($1_type)); - SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); -} #endif + SWIG_SetPointerZval($result, (void *)resultobj, $&1_descriptor, 1); +} %typemap(directorin) SWIGTYPE %{ - SWIG_SetPointerZval($input, SWIG_as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&1_descriptor, 1|2); + ZVAL_UNDEF($input); + SWIG_SetPointerZval($input, (new $1_ltype(SWIG_STD_MOVE($1))), $&1_descriptor, 1); %} -%typemap(out) void ""; +%typemap(out, phptype="void") void "" -%typemap(out) char [ANY] +%typemap(out, phptype="string") char [ANY] { - int len = 0; + size_t len = 0; while (len < $1_dim0 && $1[len]) ++len; RETVAL_STRINGL($1, len); } @@ -448,24 +499,38 @@ " $1 = (Z_TYPE($input) == is1 || Z_TYPE($input) == is2);" %enddef -%php_typecheck(int,SWIG_TYPECHECK_INTEGER,IS_LONG) -%php_typecheck(unsigned int,SWIG_TYPECHECK_UINT32,IS_LONG) -%php_typecheck(short,SWIG_TYPECHECK_INT16,IS_LONG) -%php_typecheck(unsigned short,SWIG_TYPECHECK_UINT16,IS_LONG) -%php_typecheck(long,SWIG_TYPECHECK_INT32,IS_LONG) -%php_typecheck(unsigned long,SWIG_TYPECHECK_UINT32,IS_LONG) -%php_typecheck(long long,SWIG_TYPECHECK_INT64,IS_LONG) -%php_typecheck(unsigned long long,SWIG_TYPECHECK_UINT64,IS_LONG) -%php_typecheck(signed char,SWIG_TYPECHECK_INT8,IS_LONG) -%php_typecheck(unsigned char,SWIG_TYPECHECK_UINT8,IS_LONG) -%php_typecheck(size_t,SWIG_TYPECHECK_SIZE,IS_LONG) +%define %php_typecheck_long(_type,_prec,_min,_max) +%typemap(typecheck,precedence=_prec) _type, const _type & %{ + $1 = (Z_TYPE($input) == IS_LONG && + (_min <= ZEND_LONG_MIN || (zend_long)_min <= Z_LVAL($input)) && + (_max >= ZEND_LONG_MAX || (zend_long)_max >= Z_LVAL($input))); +%} +%enddef + +%php_typecheck_long(int,SWIG_TYPECHECK_INTEGER,INT_MIN,INT_MAX) +%php_typecheck_long(unsigned int,SWIG_TYPECHECK_UINT32,0,UINT_MAX) +%php_typecheck_long(short,SWIG_TYPECHECK_INT16,SHRT_MIN,SHRT_MAX) +%php_typecheck_long(unsigned short,SWIG_TYPECHECK_UINT16,0,USHRT_MAX) +%php_typecheck_long(long,SWIG_TYPECHECK_INT32,LONG_MIN,LONG_MAX) +%php_typecheck_long(unsigned long,SWIG_TYPECHECK_UINT32,0,ULONG_MAX) +%php_typecheck_long(long long,SWIG_TYPECHECK_INT64,LLONG_MIN,LLONG_MAX) +%php_typecheck_long(unsigned long long,SWIG_TYPECHECK_UINT64,0,ULLONG_MAX) +%php_typecheck_long(signed char,SWIG_TYPECHECK_INT8,SCHAR_MIN,SCHAR_MAX) +%php_typecheck_long(unsigned char,SWIG_TYPECHECK_UINT8,0,UCHAR_MAX) +%php_typecheck_long(size_t,SWIG_TYPECHECK_SIZE,0,(size_t)-1) %php_typecheck(enum SWIGTYPE,SWIG_TYPECHECK_INTEGER,IS_LONG) %php_typecheck2(bool,SWIG_TYPECHECK_BOOL,IS_TRUE,IS_FALSE) -%php_typecheck(float,SWIG_TYPECHECK_FLOAT,IS_DOUBLE) +%typemap(typecheck,precedence=SWIG_TYPECHECK_FLOAT,fragment="SWIG_Float_Overflow_Check") float, const float & %{ + $1 = (Z_TYPE($input) == IS_DOUBLE && !SWIG_Float_Overflow_Check(Z_DVAL($input))); +%} +/* Don't range check here since PHP stores this as C/C++ double. */ %php_typecheck(double,SWIG_TYPECHECK_DOUBLE,IS_DOUBLE) %php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING) -%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&, char [] +%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *& + " $1 = (Z_TYPE($input) == IS_STRING || Z_TYPE($input) == IS_NULL); " + +%typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char [] " $1 = (Z_TYPE($input) == IS_STRING); " %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE @@ -512,18 +577,18 @@ unsigned long, unsigned short %{ zend_throw_exception(NULL, "C++ $1_type exception thrown", $1); - return; + goto fail; %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; zend_throw_exception(NULL, "C++ $1_type exception thrown", 0); - return; + goto fail; %} %typemap(throws) char * %{ zend_throw_exception(NULL, $1, 0); - return; + goto fail; %} /* Array reference typemaps */ @@ -537,3 +602,6 @@ /* php keywords */ %include <phpkw.swg> + +/* PHP known interfaces */ +%include <phpinterfaces.i> |