From: Marcus Boerger Date: Fri, 12 May 2006 00:21:00 +0000 (+0000) Subject: - Missing __toString() pieces X-Git-Tag: php-5.2.0RC1~576 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b3c3c6de140eb1ed798041eb9f7fc6dc47574848;p=php - Missing __toString() pieces --- diff --git a/Zend/zend.c b/Zend/zend.c index cf54baaa58..78d7f34416 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -221,31 +221,30 @@ ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_cop { TSRMLS_FETCH(); - if(Z_OBJ_HT_P(expr)->cast_object && Z_OBJ_HANDLER_P(expr, cast_object)(expr, expr_copy, IS_STRING TSRMLS_CC) == SUCCESS) { + if(Z_OBJ_HANDLER_P(expr, cast_object) && Z_OBJ_HANDLER_P(expr, cast_object)(expr, expr_copy, IS_STRING TSRMLS_CC) == SUCCESS) { break; } /* Standard PHP objects */ - if (Z_OBJ_HT_P(expr) == &std_object_handlers || !Z_OBJ_HT_P(expr)->cast_object) { + if (Z_OBJ_HT_P(expr) == &std_object_handlers || !Z_OBJ_HANDLER_P(expr, cast_object)) { if (zend_std_cast_object_tostring(expr, expr_copy, IS_STRING TSRMLS_CC) == SUCCESS) { break; } - } else { - if(Z_OBJ_HANDLER_P(expr, get)) { - zval *z = Z_OBJ_HANDLER_P(expr, get)(expr TSRMLS_CC); - - z->refcount++; - if(Z_TYPE_P(z) != IS_OBJECT) { - zend_make_printable_zval(z, expr_copy, use_copy); - if (*use_copy) { - zval_ptr_dtor(&z); - } else { - ZVAL_ZVAL(expr_copy, z, 0, 1); - *use_copy = 1; - } - return; + } + if (!Z_OBJ_HANDLER_P(expr, cast_object) && Z_OBJ_HANDLER_P(expr, get)) { + zval *z = Z_OBJ_HANDLER_P(expr, get)(expr TSRMLS_CC); + + z->refcount++; + if(Z_TYPE_P(z) != IS_OBJECT) { + zend_make_printable_zval(z, expr_copy, use_copy); + if (*use_copy) { + zval_ptr_dtor(&z); + } else { + ZVAL_ZVAL(expr_copy, z, 0, 1); + *use_copy = 1; } - zval_ptr_dtor(&z); + return; } + zval_ptr_dtor(&z); } zend_error(EG(exception) ? E_ERROR : E_RECOVERABLE_ERROR, "Object of class %s could not be converted to string", Z_OBJCE_P(expr)->name); expr_copy->value.str.len = 0; diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 065e20f33d..adb9b1fa5a 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -368,7 +368,7 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp } } /* Standard PHP objects */ - if (Z_OBJ_HT_PP(arg) == &std_object_handlers || !Z_OBJ_HT_PP(arg)->cast_object) { + if (Z_OBJ_HT_PP(arg) == &std_object_handlers || !Z_OBJ_HANDLER_PP(arg, cast_object)) { SEPARATE_ZVAL_IF_NOT_REF(arg); if (zend_std_cast_object_tostring(*arg, *arg, IS_STRING TSRMLS_CC) == SUCCESS) { *pl = Z_STRLEN_PP(arg); @@ -376,6 +376,26 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp break; } } +#if 1||MBO_0 + if (!Z_OBJ_HANDLER_PP(arg, cast_object) && Z_OBJ_HANDLER_PP(arg, get)) { + int use_copy; + zval *z = Z_OBJ_HANDLER_PP(arg, get)(*arg TSRMLS_CC); + + z->refcount++; + if(Z_TYPE_P(z) != IS_OBJECT) { + zval_dtor(*arg); + Z_TYPE_P(*arg) = IS_NULL; + zend_make_printable_zval(z, *arg, &use_copy); + if (!use_copy) { + ZVAL_ZVAL(*arg, z, 1, 1); + } + *pl = Z_STRLEN_PP(arg); + *p = Z_STRVAL_PP(arg); + break; + } + zval_ptr_dtor(&z); + } +#endif } case IS_ARRAY: