]> granicus.if.org Git - php/commitdiff
- Missing __toString() pieces
authorMarcus Boerger <helly@php.net>
Fri, 12 May 2006 00:21:00 +0000 (00:21 +0000)
committerMarcus Boerger <helly@php.net>
Fri, 12 May 2006 00:21:00 +0000 (00:21 +0000)
Zend/zend.c
Zend/zend_API.c

index cf54baaa583b718e86fdb9253023da7bae04b5f4..78d7f3441694c11b3d23a20d999e4fa8a51e7110 100644 (file)
@@ -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;
index 065e20f33d50d2a98d750bf6cf1a030719aa570d..adb9b1fa5a85905271769c43e0bf0234580c30d5 100644 (file)
@@ -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: