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