Question on zend_make_printable
[email protected] (Marcus Boerger)
| Newsgroups | php.i18n |
|---|---|
| Message-ID | <[email protected]> |
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]
ze2-make_printabe-20060603.diff.txt
(text/plain, 2.8 KB)
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;
}