From: Andrei Zmievski Date: Thu, 20 Apr 2006 21:56:43 +0000 (+0000) Subject: Move to refcounted implementation of collators. X-Git-Tag: RELEASE_1_3~23 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=16c55fb25ab7dd1fdc37a9811ca2c9e4ef043f22;p=php Move to refcounted implementation of collators. --- diff --git a/Zend/zend.c b/Zend/zend.c index 825a307bae..8e172fb521 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -1227,15 +1227,17 @@ ZEND_API char *get_zend_version() ZEND_API void zend_reset_locale_deps(TSRMLS_D) { + UCollator *coll; UErrorCode status = U_ZERO_ERROR; if (UG(default_collator)) { - ucol_close(UG(default_collator)); + zend_collator_destroy(UG(default_collator)); } - UG(default_collator) = ucol_open(UG(default_locale), &status); + coll = ucol_open(UG(default_locale), &status); if (U_FAILURE(status)) { zend_error(E_ERROR, "Could not open collator for locale %s", UG(default_locale)); } + UG(default_collator) = zend_collator_create(coll); } static void init_unicode_request_globals(TSRMLS_D) @@ -1248,7 +1250,7 @@ static void init_unicode_request_globals(TSRMLS_D) static void shutdown_unicode_request_globals(TSRMLS_D) { - ucol_close(UG(default_collator)); + zend_collator_destroy(UG(default_collator)); efree(UG(default_locale)); } diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index be512bb15e..e4bdef54a0 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -307,9 +307,9 @@ struct _zend_unicode_globals { uint16_t to_error_mode; char *default_locale; - UCollator *default_collator; + zend_collator *default_collator; - HashTable flex_compatible; + HashTable flex_compatible; /* table of flex-compatible encodings */ }; #endif /* ZEND_GLOBALS_H */ diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index e965e76684..c60458789b 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1443,7 +1443,7 @@ ZEND_API int string_locale_compare_function(zval *result, zval *op1, zval *op2 T op2 = &op2_copy; } - Z_LVAL_P(result) = ucol_strcoll(UG(default_collator), Z_USTRVAL_P(op1), Z_USTRLEN_P(op1), Z_USTRVAL_P(op2), Z_USTRLEN_P(op2)); + Z_LVAL_P(result) = ucol_strcoll(UG(default_collator)->coll, Z_USTRVAL_P(op1), Z_USTRLEN_P(op1), Z_USTRVAL_P(op2), Z_USTRLEN_P(op2)); Z_TYPE_P(result) = IS_LONG; if (use_copy1) { diff --git a/Zend/zend_unicode.c b/Zend/zend_unicode.c index 6ed5013e95..ffa7ee254d 100644 --- a/Zend/zend_unicode.c +++ b/Zend/zend_unicode.c @@ -677,6 +677,27 @@ void zend_register_unicode_exceptions(TSRMLS_D) } /* }}} */ +zend_collator* zend_collator_create(UCollator *coll) +{ + zend_collator *zcoll = NULL; + + zcoll = emalloc(sizeof(zend_collator)); + zcoll->coll = coll; + zcoll->refcount = 1; + + return zcoll; +} + +void zend_collator_destroy(zend_collator *zcoll) +{ + zcoll->refcount--; + if (zcoll->refcount == 0) { + ucol_close(zcoll->coll); + efree(zcoll); + } +} + + /* * Local variables: * tab-width: 4 diff --git a/Zend/zend_unicode.h b/Zend/zend_unicode.h index 9c88a560ac..9423dfa7d2 100644 --- a/Zend/zend_unicode.h +++ b/Zend/zend_unicode.h @@ -48,6 +48,12 @@ typedef enum { } zend_conv_direction; +typedef struct _zend_collator { + UCollator *coll; + int refcount; +} zend_collator; + + extern ZEND_API zend_class_entry *unicodeConversionException; @@ -58,6 +64,8 @@ void zend_set_converter_error_mode(UConverter *conv, zend_conv_direction dir, ui void zend_set_converter_subst_char(UConverter *conv, UChar *subst_char); void zend_register_unicode_exceptions(TSRMLS_D); void zend_update_converters_error_behavior(TSRMLS_D); +zend_collator* zend_collator_create(UCollator *coll); +void zend_collator_destroy(zend_collator *zcoll); /* API functions */ diff --git a/ext/unicode/collator.c b/ext/unicode/collator.c index 3fb3bdc591..7c1524c7a8 100644 --- a/ext/unicode/collator.c +++ b/ext/unicode/collator.c @@ -42,8 +42,8 @@ static zend_object_handlers unicode_object_handlers_collator; typedef struct _php_collator_obj php_collator_obj; struct _php_collator_obj { - zend_object std; - UCollator *col; + zend_object std; + zend_collator *zcoll; }; #define COLLATOR_SET_CONTEXT \ @@ -140,8 +140,8 @@ static void collator_object_free_storage(void *object TSRMLS_DC) { php_collator_obj *intern = (php_collator_obj *)object; - if (intern->col) { - ucol_close(intern->col); + if (intern->zcoll) { + zend_collator_destroy(intern->zcoll); } if (intern->std.properties) { @@ -178,10 +178,11 @@ PHP_METHOD(collator, __construct) PHP_FUNCTION(collator_create) { php_collator_obj *collatorobj; - UErrorCode error; + UErrorCode status = U_ZERO_ERROR; char *collator_name; int collator_name_len; zval *object; + UCollator *ucoll; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &collator_name, &collator_name_len) == FAILURE) { RETURN_FALSE; @@ -192,8 +193,13 @@ PHP_FUNCTION(collator_create) } collator_instantiate(unicode_ce_collator, object TSRMLS_CC); collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC); - error = U_ZERO_ERROR; - collatorobj->col = ucol_open(collator_name, &error); + ucoll = ucol_open(collator_name, &status); + if (U_FAILURE(status)) { + /* UTODO handle error case properly */ + zend_error(E_ERROR, "Could not open collator for locale %s", UG(default_locale)); + return; + } + collatorobj->zcoll = zend_collator_create(ucoll); } PHP_FUNCTION(collator_compare) @@ -207,7 +213,7 @@ PHP_FUNCTION(collator_compare) RETURN_FALSE; } collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC); - RETURN_LONG(ucol_strcoll(collatorobj->col, string1, string1_len, string2, string2_len)); + RETURN_LONG(ucol_strcoll(collatorobj->zcoll->coll, string1, string1_len, string2, string2_len)); } PHP_FUNCTION(collator_sort) @@ -216,7 +222,7 @@ PHP_FUNCTION(collator_sort) php_collator_obj *collatorobj; zval *array; HashTable *target_hash; - UCollator *orig_collator; + zend_collator *orig_collator; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oa/", &object, unicode_ce_collator, &array) == FAILURE) { RETURN_FALSE; @@ -226,7 +232,7 @@ PHP_FUNCTION(collator_sort) target_hash = HASH_OF(array); php_set_compare_func(SORT_LOCALE_STRING TSRMLS_CC); orig_collator = UG(default_collator); - UG(default_collator) = collatorobj->col; + UG(default_collator) = collatorobj->zcoll; if (zend_hash_sort(target_hash, zend_qsort, php_array_data_compare, 1 TSRMLS_CC) == FAILURE) { RETVAL_FALSE; } else { @@ -245,7 +251,7 @@ PHP_FUNCTION(collator_set_strength) RETURN_FALSE; } collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC); - ucol_setStrength(collatorobj->col, strength); + ucol_setStrength(collatorobj->zcoll->coll, strength); } PHP_FUNCTION(collator_get_strength) @@ -257,7 +263,7 @@ PHP_FUNCTION(collator_get_strength) RETURN_FALSE; } collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC); - RETURN_LONG(ucol_getStrength(collatorobj->col)); + RETURN_LONG(ucol_getStrength(collatorobj->zcoll->coll)); } PHP_FUNCTION(collator_set_attribute) @@ -272,7 +278,7 @@ PHP_FUNCTION(collator_set_attribute) } collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC); error = U_ZERO_ERROR; - ucol_setAttribute(collatorobj->col, attribute, value, &error); + ucol_setAttribute(collatorobj->zcoll->coll, attribute, value, &error); RETURN_BOOL(error == U_ZERO_ERROR ? 1 : 0); } @@ -288,9 +294,26 @@ PHP_FUNCTION(collator_get_attribute) } collatorobj = (php_collator_obj *) zend_object_store_get_object(object TSRMLS_CC); error = U_ZERO_ERROR; - value = ucol_getAttribute(collatorobj->col, attribute, &error); + value = ucol_getAttribute(collatorobj->zcoll->coll, attribute, &error); if (error != U_ZERO_ERROR) { RETURN_FALSE; } RETURN_LONG(value); } + +PHP_FUNCTION(i18n_coll_get_default) +{ + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + return; + } + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/ext/unicode/php_unicode.h b/ext/unicode/php_unicode.h index cd9f59a6ed..d1697f87e4 100644 --- a/ext/unicode/php_unicode.h +++ b/ext/unicode/php_unicode.h @@ -57,6 +57,7 @@ PHP_MINFO_FUNCTION(unicode); PHP_FUNCTION(i18n_loc_get_default); PHP_FUNCTION(i18n_loc_set_default); +PHP_FUNCTION(i18n_coll_get_default); PHP_FUNCTION(collator_create); PHP_FUNCTION(collator_compare); PHP_FUNCTION(collator_sort); diff --git a/ext/unicode/unicode.c b/ext/unicode/unicode.c index 827c36c8e8..2323ed2f47 100644 --- a/ext/unicode/unicode.c +++ b/ext/unicode/unicode.c @@ -18,7 +18,6 @@ /* $Id$ */ #include "php_unicode.h" -#if HAVE_UNICODE #include "zend_unicode.h" void php_register_unicode_iterators(TSRMLS_D); @@ -236,6 +235,7 @@ PHP_FUNCTION(unicode_get_subst_char) zend_function_entry unicode_functions[] = { PHP_FE(i18n_loc_get_default, NULL) PHP_FE(i18n_loc_set_default, NULL) + PHP_FE(i18n_coll_get_default, NULL) PHP_FE(unicode_decode, NULL) PHP_FE(unicode_semantics, NULL) PHP_FE(unicode_encode, NULL) @@ -318,8 +318,6 @@ PHP_MINFO_FUNCTION(unicode) /* }}} */ -#endif /* HAVE_UNICODE */ - /* * Local variables: