Question on zend_make_printable

From: Date: Sat, 03 Jun 2006 11:47:47 +0000
Subject: Question on zend_make_printable
Groups: php.i18n 
Request: Send a blank email to php-i18n+get-1006@lists.php.net to get a copy of this message
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:mail@marcus-boerger.de

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; }
« previous php.i18n (#1006) next »