From: Dmitry Stogov Date: Thu, 18 Aug 2005 15:42:46 +0000 (+0000) Subject: Suppoer for unicode exception messages X-Git-Tag: PRE_NEW_OCI8_EXTENSION~158 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8a749ee333ad9b038ff90a446274161d4f3eb55f;p=php Suppoer for unicode exception messages --- diff --git a/Zend/zend_API.c b/Zend/zend_API.c index a0bce6caf0..9422bb865b 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2884,6 +2884,28 @@ ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object zend_update_property(scope, object, name, name_length, tmp TSRMLS_CC); } +ZEND_API void zend_update_property_unicode(zend_class_entry *scope, zval *object, UChar *name, int name_length, char *value TSRMLS_DC) +{ + zval *tmp; + + ALLOC_ZVAL(tmp); + tmp->is_ref = 0; + tmp->refcount = 0; + ZVAL_UNICODE(tmp, value, 1); + zend_update_property(scope, object, name, name_length, tmp TSRMLS_CC); +} + +ZEND_API void zend_update_property_unicodel(zend_class_entry *scope, zval *object, UChar *name, int name_length, char *value, int value_len TSRMLS_DC) +{ + zval *tmp; + + ALLOC_ZVAL(tmp); + tmp->is_ref = 0; + tmp->refcount = 0; + ZVAL_UNICODEL(tmp, value, value_len, 1); + zend_update_property(scope, object, name, name_length, tmp TSRMLS_CC); +} + ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *name, int name_length, zend_bool silent TSRMLS_DC) { zval property, *value; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index c845bd0f41..c5c54ddeb5 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -228,6 +228,8 @@ ZEND_API void zend_update_property_long(zend_class_entry *scope, zval *object, c ZEND_API void zend_update_property_double(zend_class_entry *scope, zval *object, char *name, int name_length, double value TSRMLS_DC); ZEND_API void zend_update_property_string(zend_class_entry *scope, zval *object, char *name, int name_length, char *value TSRMLS_DC); ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object, char *name, int name_length, char *value, int value_length TSRMLS_DC); +ZEND_API void zend_update_property_unicode(zend_class_entry *scope, zval *object, UChar *name, int name_length, char *value TSRMLS_DC); +ZEND_API void zend_update_property_unicodel(zend_class_entry *scope, zval *object, UChar *name, int name_length, char *value, int value_length TSRMLS_DC); ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *name, int name_length, zend_bool silent TSRMLS_DC); diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index e1261b17c1..e913289d85 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -130,15 +130,20 @@ ZEND_METHOD(exception, __construct) long code = 0; zval *object; int argc = ZEND_NUM_ARGS(), message_len; + zend_uchar message_type; - if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC, "|sl", &message, &message_len, &code) == FAILURE) { + if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC, "|tl", &message, &message_len, &message_type, &code) == FAILURE) { zend_error(E_ERROR, "Wrong parameter count for exception([string $exception [, long $code ]])"); } object = getThis(); if (message) { - zend_update_property_string(U_CLASS_ENTRY(default_exception_ce), object, "message", sizeof("message")-1, message TSRMLS_CC); + if (message_type == IS_UNICODE) { + zend_update_property_unicodel(U_CLASS_ENTRY(default_exception_ce), object, "message", sizeof("message")-1, message, message_len TSRMLS_CC); + } else { + zend_update_property_stringl(U_CLASS_ENTRY(default_exception_ce), object, "message", sizeof("message")-1, message, message_len TSRMLS_CC); + } } if (code) { @@ -156,15 +161,20 @@ ZEND_METHOD(error_exception, __construct) long code = 0, severity = E_ERROR, lineno; zval *object; int argc = ZEND_NUM_ARGS(), message_len, filename_len; + zend_uchar message_type, file_type; - if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC, "|sllsl", &message, &message_len, &code, &severity, &filename, &filename_len, &lineno) == FAILURE) { + if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC, "|tlltl", &message, &message_len, &message_type, &code, &severity, &filename, &filename_len, &file_type, &lineno) == FAILURE) { zend_error(E_ERROR, "Wrong parameter count for exception([string $exception [, long $code ]])"); } object = getThis(); if (message) { - zend_update_property_string(U_CLASS_ENTRY(default_exception_ce), object, "message", sizeof("message")-1, message TSRMLS_CC); + if (message_type == IS_UNICODE) { + zend_update_property_unicodel(U_CLASS_ENTRY(default_exception_ce), object, "message", sizeof("message")-1, message, message_len TSRMLS_CC); + } else { + zend_update_property_stringl(U_CLASS_ENTRY(default_exception_ce), object, "message", sizeof("message")-1, message, message_len TSRMLS_CC); + } } if (code) { @@ -174,11 +184,15 @@ ZEND_METHOD(error_exception, __construct) zend_update_property_long(U_CLASS_ENTRY(default_exception_ce), object, "severity", sizeof("severity")-1, severity TSRMLS_CC); if (argc >= 4) { - zend_update_property_string(U_CLASS_ENTRY(default_exception_ce), object, "file", sizeof("file")-1, filename TSRMLS_CC); - if (argc < 5) { - lineno = 0; /* invalidate lineno */ - } - zend_update_property_long(U_CLASS_ENTRY(default_exception_ce), object, "line", sizeof("line")-1, lineno TSRMLS_CC); + if (file_type == IS_UNICODE) { + zend_update_property_unicodel(U_CLASS_ENTRY(default_exception_ce), object, "file", sizeof("file")-1, filename, filename_len TSRMLS_CC); + } else { + zend_update_property_stringl(U_CLASS_ENTRY(default_exception_ce), object, "file", sizeof("file")-1, filename, filename_len TSRMLS_CC); + } + if (argc < 5) { + lineno = 0; /* invalidate lineno */ + } + zend_update_property_long(U_CLASS_ENTRY(default_exception_ce), object, "line", sizeof("line")-1, lineno TSRMLS_CC); } } /* }}} */