diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index b18d0f46f80a6..1ff5ed63782ae 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1975,6 +1975,16 @@ ZEND_API HashTable *zend_std_get_properties_for(zend_object *obj, zend_prop_purp } ZEND_FALLTHROUGH; case ZEND_PROP_PURPOSE_ARRAY_CAST: + if (obj->handlers->cast_object != std_object_handlers.cast_object) { + zval result; + if (obj->handlers->cast_object(obj, &result, IS_ARRAY) == SUCCESS) { + return Z_ARRVAL(result); + } + if (EG(exception)) { + return NULL; + } + } + ZEND_FALLTHROUGH; case ZEND_PROP_PURPOSE_SERIALIZE: case ZEND_PROP_PURPOSE_VAR_EXPORT: case ZEND_PROP_PURPOSE_JSON: diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 0c73d8c4a3a72..93b1c414b7c72 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -431,6 +431,10 @@ static int com_objects_compare(zval *object1, zval *object2) static zend_result com_object_cast(zend_object *readobj, zval *writeobj, int type) { + if (type == IS_ARRAY) { + return FAILURE; + } + php_com_dotnet_object *obj; VARIANT v; VARTYPE vt = VT_EMPTY; diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 5d7137406bedb..6996474e49e18 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -1819,6 +1819,7 @@ static zend_result cast_object(zval *object, int type, char *contents) convert_scalar_to_number(object); break; default: + zval_ptr_dtor_nogc(object); return FAILURE; } return SUCCESS;