Implement type-checking of wrapped objects

The testsuite now all passes (with PHP 7.4 at least)
This commit is contained in:
Olly Betts 2021-04-12 17:29:39 +12:00
commit 9987d7168a

View file

@ -74,6 +74,7 @@ static int default_error_code = E_ERROR;
typedef struct { typedef struct {
void * ptr; void * ptr;
int newobject; int newobject;
const swig_type_info * type;
zend_object std; zend_object std;
} swig_object_wrapper; } swig_object_wrapper;
@ -103,6 +104,7 @@ SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) {
swig_object_wrapper *value=(swig_object_wrapper *)emalloc(sizeof(swig_object_wrapper)); swig_object_wrapper *value=(swig_object_wrapper *)emalloc(sizeof(swig_object_wrapper));
value->ptr = ptr; value->ptr = ptr;
value->newobject = (newobject & 1); value->newobject = (newobject & 1);
value->type = type;
ZVAL_RES(z, zend_register_resource(value, resource_type)); ZVAL_RES(z, zend_register_resource(value, resource_type));
} }
} else { } else {
@ -112,6 +114,7 @@ SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) {
swig_object_wrapper *value = php_fetch_object(obj); swig_object_wrapper *value = php_fetch_object(obj);
value->ptr = ptr; value->ptr = ptr;
value->newobject = (newobject & 1); value->newobject = (newobject & 1);
value->type = type;
ZVAL_OBJ(z, obj); ZVAL_OBJ(z, obj);
} }
return; return;
@ -188,10 +191,14 @@ SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) {
} }
switch (Z_TYPE_P(z)) { switch (Z_TYPE_P(z)) {
case IS_OBJECT: case IS_OBJECT: {
/* FIXME - we need to check the type is compatible here! */ swig_object_wrapper *value = SWIG_Z_FETCH_OBJ_P(z);
*ptr = SWIG_Z_FETCH_OBJ_P(z)->ptr; if (flags & SWIG_POINTER_DISOWN) {
value->newobject = 0;
}
*ptr = SWIG_ConvertResourceData(value->ptr, value->type->name, ty);
return (*ptr == NULL ? -1 : 0); return (*ptr == NULL ? -1 : 0);
}
case IS_RESOURCE: case IS_RESOURCE:
*ptr = SWIG_ConvertResourcePtr(z, ty, flags); *ptr = SWIG_ConvertResourcePtr(z, ty, flags);
return (*ptr == NULL ? -1 : 0); return (*ptr == NULL ? -1 : 0);
@ -217,6 +224,7 @@ SWIG_SetZval(zval *zv, int newFlow, int newobject, void *ptr, swig_type_info *ty
obj = SWIG_Z_FETCH_OBJ_P(zv); obj = SWIG_Z_FETCH_OBJ_P(zv);
obj->ptr = ptr; obj->ptr = ptr;
obj->newobject = newobject; obj->newobject = newobject;
obj->type = type;
} else { } else {
SWIG_SetPointerZval(zv, ptr, type, newobject); SWIG_SetPointerZval(zv, ptr, type, newobject);
} }