Hello Anrei,

  why don't we simply make zend_make_printable_zval() call on of
zend_make_unicode_zval/zend_make_string_zval() depending on ini
setting unicode_semantics, see attached patch.

-- 
Best regards,
 Marcus                          mailto:[EMAIL PROTECTED]
Index: Zend/zend.c
===================================================================
RCS file: /repository/ZendEngine2/zend.c,v
retrieving revision 1.359
diff -u -p -d -r1.359 zend.c
--- Zend/zend.c 3 Jun 2006 11:41:29 -0000       1.359
+++ Zend/zend.c 3 Jun 2006 11:43:06 -0000
@@ -348,79 +348,11 @@ ZEND_API void zend_make_string_zval(zval
 
 ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int 
*use_copy)
 {
-       UErrorCode temp = U_ZERO_ERROR;
-       TSRMLS_FETCH();
-
-       if (
-         /* UTODO: clean this up */
-           (Z_TYPE_P(expr) == IS_STRING &&
-           (!strcmp(ucnv_getName(ZEND_U_CONVERTER(UG(output_encoding_conv)), 
&temp),
-                                
ucnv_getName(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &temp))))) {
-               *use_copy = 0;
-               return;
-       }
-       switch (Z_TYPE_P(expr)) {
-               case IS_NULL:
-                       Z_STRLEN_P(expr_copy) = 0;
-                       Z_STRVAL_P(expr_copy) = STR_EMPTY_ALLOC();
-                       break;
-               case IS_BOOL:
-                       if (Z_LVAL_P(expr)) {
-                               Z_STRLEN_P(expr_copy) = 1;
-                               Z_STRVAL_P(expr_copy) = estrndup("1", 1);
-                       } else {
-                               Z_STRLEN_P(expr_copy) = 0;
-                               Z_STRVAL_P(expr_copy) = STR_EMPTY_ALLOC();
-                       }
-                       break;
-               case IS_RESOURCE:
-                       Z_STRVAL_P(expr_copy) = (char *) 
emalloc(sizeof("Resource id #")-1 + MAX_LENGTH_OF_LONG);
-                       Z_STRLEN_P(expr_copy) = sprintf(Z_STRVAL_P(expr_copy), 
"Resource id #%ld", Z_LVAL_P(expr));
-                       break;
-               case IS_ARRAY:
-                       Z_STRLEN_P(expr_copy) = sizeof("Array")-1;
-                       Z_STRVAL_P(expr_copy) = estrndup("Array", 
Z_STRLEN_P(expr_copy));
-                       break;
-               case IS_OBJECT:
-                       if(Z_OBJ_HT_P(expr)->cast_object && 
Z_OBJ_HANDLER_P(expr, cast_object)(expr, expr_copy, IS_STRING TSRMLS_CC) == 
SUCCESS) {
-                               break;
-                       }
-                       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;
-                               }
-                               zval_ptr_dtor(&z);
-                       }
-                       zend_error(EG(exception) ? E_ERROR : 
E_RECOVERABLE_ERROR, "Object of class %v could not be converted to string", 
Z_OBJCE_P(expr)->name);
-                       ZVAL_EMPTY_STRING(expr_copy);
-                       break;
-               case IS_DOUBLE:
-                       *expr_copy = *expr;
-                       zval_copy_ctor(expr_copy);
-                       zend_locale_sprintf_double(expr_copy ZEND_FILE_LINE_CC);
-                       break;
-               default:
-                       *expr_copy = *expr;
-                       zval_copy_ctor(expr_copy);
-                       if (UG(unicode)) {
-                               convert_to_string_with_converter(expr_copy, 
ZEND_U_CONVERTER(UG(output_encoding_conv)));
-                       } else {
-                               convert_to_string(expr_copy);
-                       }
-                       break;
+       if (UG(unicode)) {
+               zend_make_unicode_zval(expr, expr_copy, use_copy);
+       } else {
+               zend_make_string_zval(expr, expr_copy, use_copy);
        }
-       Z_TYPE_P(expr_copy) = IS_STRING;
-       *use_copy = 1;
 }
 
 
-- 
PHP Unicode & I18N Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to