diff options
Diffstat (limited to 'Zend/zend_object_handlers.c')
-rw-r--r-- | Zend/zend_object_handlers.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index f3ac745484..1528a3fda4 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -888,6 +888,40 @@ int zend_std_object_get_class_name(zval *object, char **class_name, zend_uint *c return SUCCESS; } +ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int type, int should_free TSRMLS_DC) +{ + zval fname, *retval; + int is_ref, refcount; + + switch (type) { + case IS_STRING: + ZVAL_STRING(&fname, "__tostring", 0); + if (call_user_function_ex(NULL, &readobj, &fname, &retval, 0, NULL, 0, NULL TSRMLS_CC) == SUCCESS) { + if (retval) { + if (Z_TYPE_P(retval) != IS_STRING) { + zend_error(E_ERROR, "Method %s::__toString() must return a string value", Z_OBJCE_P(readobj)->name); + } + } else { + MAKE_STD_ZVAL(retval); + ZVAL_STRINGL(retval, empty_string, 0, 0); + } + zval_dtor(writeobj); + is_ref = writeobj->is_ref; + refcount = writeobj->refcount; + *writeobj = *retval; + zval_copy_ctor(writeobj); + writeobj->is_ref = is_ref; + writeobj->refcount = refcount; + zval_ptr_dtor(&retval); + return SUCCESS; + } + break; + default: + break; + } + return FAILURE; +} + int zend_std_cast_object(zval *readobj, zval *writeobj, int type, int should_free TSRMLS_DC) { return FAILURE; |