summaryrefslogtreecommitdiff
path: root/Lib/php
diff options
context:
space:
mode:
authorOlly Betts <olly@survex.com>2021-04-22 17:49:57 +1200
committerOlly Betts <olly@survex.com>2021-04-22 17:51:14 +1200
commit837dfa1e7e9afe1d19c2db545bbecedda2590c3b (patch)
tree0756486716344207512cc96a2800d1cb180f2cc5 /Lib/php
parenta6a52f2f79942435938153b0d425127ba79d84fc (diff)
downloadswig-837dfa1e7e9afe1d19c2db545bbecedda2590c3b.tar.gz
Fix directorout SWIGTYPE typemaps
Diffstat (limited to 'Lib/php')
-rw-r--r--Lib/php/director.swg6
-rw-r--r--Lib/php/php.swg22
-rw-r--r--Lib/php/phprun.swg25
3 files changed, 46 insertions, 7 deletions
diff --git a/Lib/php/director.swg b/Lib/php/director.swg
index fe5175785..7a81cd518 100644
--- a/Lib/php/director.swg
+++ b/Lib/php/director.swg
@@ -99,6 +99,12 @@ namespace Swig {
swig_owner[vptr] = new GCItem_T<Type>(vptr);
}
}
+
+ void swig_acquire_ownership_obj(void *vptr, int own) const {
+ if (vptr && own) {
+ swig_owner[vptr] = new GCItem_Object(own);
+ }
+ }
};
/* base class for director exceptions */
diff --git a/Lib/php/php.swg b/Lib/php/php.swg
index 6da09e7a0..468c7bb55 100644
--- a/Lib/php/php.swg
+++ b/Lib/php/php.swg
@@ -93,8 +93,8 @@
%typemap(directorout) 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");
+ 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;
%}
@@ -107,6 +107,15 @@
}
%}
+%typemap(directorout) SWIGTYPE * (swig_owntype own),
+ SWIGTYPE [] (swig_owntype own)
+%{
+ if (SWIG_ConvertPtrAndOwn($input, (void **)&$result, $1_descriptor, SWIG_POINTER_DISOWN, &own) < 0) {
+ SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor");
+ }
+ swig_acquire_ownership_obj((void*)$result, own);
+%}
+
%typemap(in) SWIGTYPE &,
SWIGTYPE &&
%{
@@ -115,6 +124,15 @@
}
%}
+%typemap(directorout) SWIGTYPE & ($1_ltype tmp),
+ 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");
+ }
+ $result = tmp;
+%}
+
%typemap(in) SWIGTYPE *const& ($*ltype temp)
%{
if (SWIG_ConvertPtr(&$input, (void **) &temp, $*1_descriptor, 0) < 0) {
diff --git a/Lib/php/phprun.swg b/Lib/php/phprun.swg
index 2011229e4..252c152cf 100644
--- a/Lib/php/phprun.swg
+++ b/Lib/php/phprun.swg
@@ -4,6 +4,8 @@
* PHP runtime library
* ----------------------------------------------------------------------------- */
+#define swig_owntype int
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -130,7 +132,7 @@ SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) {
This is called by SWIG_ConvertPtr which gets the type name from the
swig_object_wrapper. */
static void *
-SWIG_ConvertPtrData(void * p, const char *type_name, swig_type_info *ty) {
+SWIG_ConvertPtrData(void * p, const char *type_name, swig_type_info *ty, int *own) {
swig_cast_info *tc;
void *result = 0;
@@ -149,14 +151,21 @@ SWIG_ConvertPtrData(void * p, const char *type_name, swig_type_info *ty) {
if (tc) {
int newmemory = 0;
result = SWIG_TypeCast(tc, p, &newmemory);
- assert(!newmemory); /* newmemory handling not yet implemented */
+ if (newmemory == SWIG_CAST_NEW_MEMORY) {
+ assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
+ if (own)
+ *own |= SWIG_CAST_NEW_MEMORY;
+ }
}
return result;
}
/* We wrap C/C++ pointers as PHP objects. */
static int
-SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) {
+SWIG_ConvertPtrAndOwn(zval *z, void **ptr, swig_type_info *ty, int flags, swig_owntype *own) {
+ if (own)
+ *own = 0;
+
if (z == NULL) {
*ptr = 0;
return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK;
@@ -165,11 +174,12 @@ SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) {
switch (Z_TYPE_P(z)) {
case IS_OBJECT: {
swig_object_wrapper *value = SWIG_Z_FETCH_OBJ_P(z);
+ *ptr = SWIG_ConvertPtrData(value->ptr, value->type->name, ty, own);
+ if (*ptr == NULL) return SWIG_ERROR;
if (flags & SWIG_POINTER_DISOWN) {
value->newobject = 0;
}
- *ptr = SWIG_ConvertPtrData(value->ptr, value->type->name, ty);
- return (*ptr == NULL ? SWIG_ERROR : SWIG_OK);
+ return SWIG_OK;
}
case IS_NULL:
*ptr = 0;
@@ -179,6 +189,11 @@ SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) {
return -1;
}
+static int
+SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) {
+ return SWIG_ConvertPtrAndOwn(z, ptr, ty, flags, 0);
+}
+
static const char const_name[] = "swig_runtime_data_type_pointer";
static swig_module_info *SWIG_Php_GetModule() {
zval *pointer = zend_get_constant_str(const_name, sizeof(const_name) - 1);