summaryrefslogtreecommitdiff
path: root/Zend/zend_object_handlers.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_object_handlers.c')
-rw-r--r--Zend/zend_object_handlers.c34
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;