int zend_std_cast_object(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;
}