]> granicus.if.org Git - php/commitdiff
Suppoer for unicode exception messages
authorDmitry Stogov <dmitry@php.net>
Thu, 18 Aug 2005 15:42:46 +0000 (15:42 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 18 Aug 2005 15:42:46 +0000 (15:42 +0000)
Zend/zend_API.c
Zend/zend_API.h
Zend/zend_exceptions.c

index a0bce6caf0b5ff3d2fee30414d2ba25491163d27..9422bb865b7212b0f619cea5abbb2b4d89de3a35 100644 (file)
@@ -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;
index c845bd0f4135ffbd6773c8e733b6d833f89efa10..c5c54ddeb519f303b531966994b5a813946d3004 100644 (file)
@@ -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);
 
index e1261b17c1bd115fd7eb8e70235a6ae0e0f0485f..e913289d85c618310b9f71b7e3219eff331155ed 100644 (file)
@@ -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);
        }
 }
 /* }}} */