Hello Andi, well when i first came up with the patch there was only lowercasing involved. So you have to ask our unicode guru for the current state :-)
best regards marcus Tuesday, July 18, 2006, 1:08:52 AM, you wrote: > Looks OK to me. Can we call it ZEND_FETCH_CLASS_NO_LOWERCASE instead of > ZEND_FETCH_CLASS_NO_NORMALIZE. No biggy but I always think of normalizing as > in taking a Unicode string and normalizing it. Or is that what you're > actually doing here? Asking because we agreed we won't normalize > automagically in PHP. > Andi >> -----Original Message----- >> From: Marcus Boerger [mailto:[EMAIL PROTECTED] >> Sent: Monday, July 17, 2006 2:49 PM >> To: Andrei Zmievski >> Cc: Marcus Boerger; Andrei Zmievski; Zeev Suraski; Andi >> Gutmans; internals@lists.php.net >> Subject: Re: [PHP-DEV] Unicode and fetch class >> >> Hello Andrei, >> >> looks pretty fine to me, after your treatment, go ahead >> commit - Andi, Zeev? >> >> best regards >> marcus >> >> Monday, July 17, 2006, 9:50:44 PM, you wrote: >> >> > Index: Zend/zend_API.c >> > =================================================================== >> > RCS file: /repository/ZendEngine2/zend_API.c,v >> > retrieving revision 1.378 >> > diff -p -u -r1.378 zend_API.c >> > --- Zend/zend_API.c 13 Jul 2006 21:27:48 -0000 1.378 >> > +++ Zend/zend_API.c 17 Jul 2006 19:47:30 -0000 >> > @@ -2578,10 +2578,9 @@ ZEND_API int zend_disable_class(char *cl >> > static int zend_is_callable_check_func(int check_flags, zval >> > ***zobj_ptr_ptr, zend_class_entry *ce_org, zval *callable, >> > zend_class_entry **ce_ptr, zend_function **fptr_ptr TSRMLS_DC) { >> > int retval; >> > - zstr lcname, lmname, mname, colon; >> > + zstr lmname, mname, colon; >> > unsigned int clen, mlen; >> > zend_function *fptr; >> > - zend_class_entry **pce; >> > HashTable *ftable; >> > >> > *ce_ptr = NULL; >> > @@ -2601,18 +2600,7 @@ static int zend_is_callable_check_func(i >> > } >> > } >> > if (colon.v != NULL) { >> > - lcname = zend_u_str_case_fold(Z_TYPE_P(callable), >> > Z_UNIVAL_P(callable), clen, 0, &clen); >> > - /* caution: lcname is not '\0' terminated */ >> > - if (clen == sizeof("self") - 1 && >> > - ZEND_U_EQUAL(Z_TYPE_P(callable), >> lcname, clen, "self", sizeof("self")-1)) { >> > - *ce_ptr = EG(scope); >> > - } else if (clen == sizeof("parent") - 1 && >> > - ZEND_U_EQUAL(Z_TYPE_P(callable), >> lcname, clen, "parent", sizeof("parent")-1)) { >> > - *ce_ptr = EG(scope) ? >> EG(scope)->parent : NULL; >> > - } else if (zend_u_lookup_class(Z_TYPE_P(callable), >> > Z_UNIVAL_P(callable), clen, &pce TSRMLS_CC) == SUCCESS) { >> > - *ce_ptr = *pce; >> > - } >> > - efree(lcname.v); >> > + *ce_ptr = zend_u_fetch_class(Z_TYPE_P(callable), >> > Z_UNIVAL_P(callable), clen, ZEND_FETCH_CLASS_AUTO TSRMLS_CC); >> > if (!*ce_ptr) { >> > return 0; >> > } >> > @@ -2620,9 +2608,9 @@ static int zend_is_callable_check_func(i >> > if (ce_org && !instanceof_function(ce_org, >> *ce_ptr TSRMLS_CC)) { >> > return 0; >> > } >> > - lmname = >> zend_u_str_case_fold(Z_TYPE_P(callable), mname, mlen, 0, &mlen); >> > + lmname = zend_u_str_case_fold(Z_TYPE_P(callable), >> > + mname, mlen, 1, &mlen); >> > } else { >> > - lmname = zend_u_str_case_fold(Z_TYPE_P(callable), >> > Z_UNIVAL_P(callable), Z_UNILEN_P(callable), 0, &mlen); >> > + lmname = zend_u_str_case_fold(Z_TYPE_P(callable), >> > Z_UNIVAL_P(callable), Z_UNILEN_P(callable), 1, &mlen); >> > if (ce_org) { >> > ftable = &ce_org->function_table; >> > *ce_ptr = ce_org; >> > Index: Zend/zend_builtin_functions.c >> > =================================================================== >> > RCS file: /repository/ZendEngine2/zend_builtin_functions.c,v >> > retrieving revision 1.317 >> > diff -p -u -r1.317 zend_builtin_functions.c >> > --- Zend/zend_builtin_functions.c 9 Jul 2006 22:40:10 >> -0000 1.317 >> > +++ Zend/zend_builtin_functions.c 17 Jul 2006 19:47:30 -0000 >> > @@ -702,7 +702,7 @@ static void is_a_impl(INTERNAL_FUNCTION_ >> > >> > convert_to_text_ex(class_name); >> > >> > - if (zend_u_lookup_class_ex(Z_TYPE_PP(class_name), >> > Z_UNIVAL_PP(class_name), Z_UNILEN_PP(class_name), (instance_ce != >> > NULL), &ce TSRMLS_CC) == FAILURE) { >> > + if (zend_u_lookup_class_ex(Z_TYPE_PP(class_name), >> > Z_UNIVAL_PP(class_name), Z_UNILEN_PP(class_name), >> (instance_ce != NULL) ? >> > 1 : 0, 1, &ce TSRMLS_CC) == FAILURE) { >> > retval = 0; >> > } else { >> > if (only_subclass) { >> > Index: Zend/zend_compile.h >> > =================================================================== >> > RCS file: /repository/ZendEngine2/zend_compile.h,v >> > retrieving revision 1.343 >> > diff -p -u -r1.343 zend_compile.h >> > --- Zend/zend_compile.h 13 Jun 2006 12:56:20 -0000 1.343 >> > +++ Zend/zend_compile.h 17 Jul 2006 19:47:30 -0000 >> > @@ -615,7 +615,9 @@ int zendlex(znode *zendlval TSRMLS_DC); >> > #define ZEND_FETCH_CLASS_GLOBAL 4 >> > #define ZEND_FETCH_CLASS_AUTO 5 >> > #define ZEND_FETCH_CLASS_INTERFACE 6 >> > -#define ZEND_FETCH_CLASS_NO_AUTOLOAD 0x80 >> > +#define ZEND_FETCH_CLASS_FLAGS 0xF0 >> > +#define ZEND_FETCH_CLASS_NO_NORMALIZE 0x10 #define >> > +ZEND_FETCH_CLASS_NO_AUTOLOAD 0x80 >> > >> > /* variable parsing type (compile-time) */ >> > #define ZEND_PARSED_MEMBER (1<<0) >> > Index: Zend/zend_execute.c >> > =================================================================== >> > RCS file: /repository/ZendEngine2/zend_execute.c,v >> > retrieving revision 1.748 >> > diff -p -u -r1.748 zend_execute.c >> > --- Zend/zend_execute.c 10 Jul 2006 00:32:23 -0000 1.748 >> > +++ Zend/zend_execute.c 17 Jul 2006 19:47:30 -0000 >> > @@ -944,7 +944,7 @@ fetch_string_dim: >> > UChar *norm; >> > int norm_len; >> > >> > - if >> (!zend_normalize_identifier(&norm, >> > &norm_len, offset_key.u, offset_key_length, 0)) { >> > + if (zend_normalize_identifier(&norm, >> > &norm_len, offset_key.u, offset_key_length, 0) == FAILURE) { >> > >> zend_error(E_WARNING, "Could >> > not normalize identifier: %r", offset_key); >> > } else if (norm != offset_key.u) { >> > offset_key.u = norm; >> > Index: Zend/zend_execute.h >> > =================================================================== >> > RCS file: /repository/ZendEngine2/zend_execute.h,v >> > retrieving revision 1.100 >> > diff -p -u -r1.100 zend_execute.h >> > --- Zend/zend_execute.h 31 May 2006 13:02:15 -0000 1.100 >> > +++ Zend/zend_execute.h 17 Jul 2006 19:47:30 -0000 >> > @@ -71,7 +71,7 @@ static inline void safe_free_zval_ptr_re } >> > ZEND_API int zend_lookup_class(char *name, int name_length, >> > zend_class_entry ***ce TSRMLS_DC); ZEND_API int >> > zend_u_lookup_class(zend_uchar type, zstr name, int name_length, >> > zend_class_entry ***ce TSRMLS_DC); -ZEND_API int >> > zend_u_lookup_class_ex(zend_uchar type, zstr name, int name_length, >> > int use_autoload, zend_class_entry ***ce TSRMLS_DC); >> > +ZEND_API int zend_u_lookup_class_ex(zend_uchar type, zstr name, int >> > name_length, int use_autoload, int do_normalize, zend_class_entry >> > ***ce TSRMLS_DC); ZEND_API int zend_eval_string(char *str, zval >> > *retval_ptr, char *string_name TSRMLS_DC); ZEND_API int >> > zend_eval_string_ex(char *str, zval *retval_ptr, char *string_name, >> > int handle_exceptions TSRMLS_DC); ZEND_API int >> > zend_u_eval_string(zend_uchar type, zstr str, zval >> *retval_ptr, char >> > *string_name TSRMLS_DC); >> > Index: Zend/zend_execute_API.c >> > =================================================================== >> > RCS file: /repository/ZendEngine2/zend_execute_API.c,v >> > retrieving revision 1.375 >> > diff -p -u -r1.375 zend_execute_API.c >> > --- Zend/zend_execute_API.c 12 Jul 2006 07:54:18 -0000 >> 1.375 >> > +++ Zend/zend_execute_API.c 17 Jul 2006 19:47:30 -0000 >> > @@ -784,7 +784,7 @@ int zend_call_function(zend_fcall_info * >> > } >> > >> > if (Z_TYPE_P(fci->function_name) == IS_UNICODE) { >> > - if ((colon.u = >> > u_strstr(Z_USTRVAL_P(fci->function_name), >> (UChar*)":\0:\0")) != NULL) >> > { >> > + if ((colon.u = >> > u_strstr(Z_USTRVAL_P(fci->function_name), u_doublecolon)) != NULL) { >> > fname_len = u_strlen(colon.u+2); >> > clen = >> Z_USTRLEN_P(fci->function_name) - fname_len - 2; >> > fname.u = colon.u + 2; @@ -799,7 >> > +799,7 @@ int zend_call_function(zend_fcall_info * >> > if (colon.v != NULL) { >> > zend_class_entry **pce, *ce_child = NULL; >> > >> > - lcname = >> > zend_u_str_case_fold(Z_TYPE_P(fci->function_name), >> > Z_UNIVAL_P(fci->function_name), clen, 0, &clen); >> > + lcname = >> > zend_u_str_case_fold(Z_TYPE_P(fci->function_name), >> > Z_UNIVAL_P(fci->function_name), clen, 1, &clen); >> > /* caution: lcname is not '\0' terminated */ >> > if (calling_scope && clen == >> sizeof("self") - 1 && >> > >> ZEND_U_EQUAL(Z_TYPE_P(fci->function_name), >> > lcname, clen, "self", sizeof("self")-1)) { @@ -807,7 +807,7 @@ int >> > zend_call_function(zend_fcall_info * >> > } else if (calling_scope && clen == >> sizeof("parent") - 1 && >> > >> ZEND_U_EQUAL(Z_TYPE_P(fci->function_name), >> > lcname, clen, "parent", sizeof("parent")-1)) { >> > ce_child = EG(active_op_array) && >> > EG(active_op_array)->scope ? EG(scope)->parent : NULL; >> > - } else if >> > (zend_u_lookup_class(Z_TYPE_P(fci->function_name), >> > Z_UNIVAL_P(fci->function_name), clen, &pce TSRMLS_CC) == SUCCESS) { >> > + } else if >> > (zend_u_lookup_class_ex(Z_TYPE_P(fci->function_name), >> lcname, clen, 1, 0, &pce TSRMLS_CC) == SUCCESS) { >> > ce_child = *pce; >> > } >> > efree(lcname.v); @@ -1062,7 +1062,7 @@ int >> > zend_call_function(zend_fcall_info * } >> > >> > >> > -ZEND_API int zend_u_lookup_class_ex(zend_uchar type, zstr >> name, int >> > name_length, int use_autoload, zend_class_entry ***ce TSRMLS_DC) >> > +ZEND_API int zend_u_lookup_class_ex(zend_uchar type, zstr name, int >> > name_length, int use_autoload, int do_normalize, zend_class_entry >> > ***ce TSRMLS_DC) { >> > zval **args[1]; >> > zval autoload_function; >> > @@ -1080,10 +1080,17 @@ ZEND_API int zend_u_lookup_class_ex(zend >> > return FAILURE; >> > } >> > >> > - lc_name = zend_u_str_case_fold(type, name, >> name_length, 1, &lc_name_len); >> > + if (do_normalize) { >> > + lc_name = zend_u_str_case_fold(type, name, >> name_length, 1, &lc_name_len); >> > + } else { >> > + lc_name = name; >> > + lc_name_len = name_length; >> > + } >> > >> > if (zend_u_hash_find(EG(class_table), type, lc_name, >> > lc_name_len+1, (void **) ce) == SUCCESS) { >> > - efree(lc_name.v); >> > + if (do_normalize) { >> > + efree(lc_name.v); >> > + } >> > return SUCCESS; >> > } >> > >> > @@ -1091,7 +1098,9 @@ ZEND_API int zend_u_lookup_class_ex(zend >> > * (doesn't impact fuctionality of __autoload() >> > */ >> > if (!use_autoload || zend_is_compiling(TSRMLS_C)) { >> > - efree(lc_name.v); >> > + if (do_normalize) { >> > + efree(lc_name.v); >> > + } >> > return FAILURE; >> > } >> > >> > @@ -1101,7 +1110,9 @@ ZEND_API int zend_u_lookup_class_ex(zend >> > } >> > >> > if (zend_u_hash_add(EG(in_autoload), type, lc_name, >> > lc_name_len+1, (void**)&dummy, sizeof(char), NULL) == FAILURE) { >> > - efree(lc_name.v); >> > + if (do_normalize) { >> > + efree(lc_name.v); >> > + } >> > return FAILURE; >> > } >> > >> > @@ -1143,12 +1154,16 @@ ZEND_API int zend_u_lookup_class_ex(zend >> > >> > if (retval == FAILURE) { >> > EG(exception) = exception; >> > - efree(lc_name.v); >> > + if (do_normalize) { >> > + efree(lc_name.v); >> > + } >> > return FAILURE; >> > } >> > >> > if (EG(exception) && exception) { >> > - efree(lc_name.v); >> > + if (do_normalize) { >> > + efree(lc_name.v); >> > + } >> > zend_error(E_ERROR, "Function %s(%R) threw an >> > exception of type '%v'", ZEND_AUTOLOAD_FUNC_NAME, type, >> name, Z_OBJCE_P(EG(exception))->name); >> > return FAILURE; >> > } >> > @@ -1160,13 +1175,15 @@ ZEND_API int zend_u_lookup_class_ex(zend >> > } >> > >> > retval = zend_u_hash_find(EG(class_table), type, >> lc_name, lc_name_len + 1, (void **) ce); >> > - efree(lc_name.v); >> > + if (do_normalize) { >> > + efree(lc_name.v); >> > + } >> > return retval; >> > } >> > >> > ZEND_API int zend_u_lookup_class(zend_uchar type, zstr name, int >> > name_length, zend_class_entry ***ce TSRMLS_DC) { >> > - return zend_u_lookup_class_ex(type, name, >> name_length, 1, ce TSRMLS_CC); >> > + return zend_u_lookup_class_ex(type, name, >> name_length, 1, 1, >> > + ce TSRMLS_CC); >> > } >> > >> > ZEND_API int zend_lookup_class(char *name, int name_length, >> > zend_class_entry ***ce TSRMLS_DC) @@ -1545,9 +1562,12 @@ void >> > zend_unset_timeout(TSRMLS_D) ZEND_API zend_class_entry >> > *zend_u_fetch_class(zend_uchar type, zstr class_name, uint >> > class_name_len, int fetch_type TSRMLS_DC) { >> > zend_class_entry **pce; >> > - int use_autoload = (fetch_type & >> ZEND_FETCH_CLASS_NO_AUTOLOAD) == 0; >> > + int use_autoload = (fetch_type & >> ZEND_FETCH_CLASS_NO_AUTOLOAD) ? 0 : 1; >> > + int do_normalize = (fetch_type & >> ZEND_FETCH_CLASS_NO_NORMALIZE) ? 0 : 1; >> > + zstr lcname = class_name; >> > + >> > + fetch_type = fetch_type & ~ZEND_FETCH_CLASS_FLAGS; >> > >> > - fetch_type = fetch_type & ~ZEND_FETCH_CLASS_NO_AUTOLOAD; >> > check_fetch_type: >> > switch (fetch_type) { >> > case ZEND_FETCH_CLASS_SELF: >> > @@ -1564,15 +1584,22 @@ check_fetch_type: >> > } >> > return EG(scope)->parent; >> > case ZEND_FETCH_CLASS_AUTO: { >> > - fetch_type = >> > zend_get_class_fetch_type(type, class_name, class_name_len); >> > + if (do_normalize) { >> > + lcname = >> > zend_u_str_case_fold(type, class_name, class_name_len, 1, >> > &class_name_len); >> > + } >> > + fetch_type = >> > zend_get_class_fetch_type(type, lcname, class_name_len); >> > if >> > (fetch_type!=ZEND_FETCH_CLASS_DEFAULT) { >> > + if (do_normalize) { >> > + efree(lcname.v); >> > + do_normalize = 0; /* >> > we've normalized it already, don't do it twice */ >> > + } >> > goto check_fetch_type; >> > } >> > } >> > break; >> > } >> > >> > - if (zend_u_lookup_class_ex(type, class_name, class_name_len, >> > use_autoload, &pce TSRMLS_CC)==FAILURE) { >> > + if (zend_u_lookup_class_ex(type, lcname, class_name_len, >> > use_autoload, do_normalize, &pce TSRMLS_CC)==FAILURE) { >> > if (use_autoload) { >> > if (fetch_type == >> ZEND_FETCH_CLASS_INTERFACE) { >> > zend_error(E_ERROR, "Interface '%R' >> > not found", type, class_name); @@ -1580,8 +1607,14 @@ >> check_fetch_type: >> > zend_error(E_ERROR, "Class >> '%R' not found", type, class_name); >> > } >> > } >> > + if (lcname.v != class_name.v) { >> > + efree(lcname.v); >> > + } >> > return NULL; >> > } else { >> > + if (lcname.v != class_name.v) { >> > + efree(lcname.v); >> > + } >> > return *pce; >> > } >> > } >> > Index: Zend/zend_language_scanner.l >> > =================================================================== >> > RCS file: /repository/ZendEngine2/zend_language_scanner.l,v >> > retrieving revision 1.155 >> > diff -p -u -r1.155 zend_language_scanner.l >> > --- Zend/zend_language_scanner.l 12 Jun 2006 >> 17:06:39 -0000 1.155 >> > +++ Zend/zend_language_scanner.l 17 Jul 2006 19:47:30 -0000 >> > @@ -444,7 +444,7 @@ static inline int zend_check_and_normali >> > efree(Z_USTRVAL_P(zendlval)); >> > return 0; >> > } >> > - if (!zend_normalize_identifier(&norm, &norm_len, >> > Z_USTRVAL_P(zendlval), Z_USTRLEN_P(zendlval), 0)) { >> > + if (zend_normalize_identifier(&norm, &norm_len, >> > Z_USTRVAL_P(zendlval), Z_USTRLEN_P(zendlval), 0) == FAILURE) { >> > zend_error(E_COMPILE_WARNING, "Could not normalize >> > identifier: %r", Z_USTRVAL_P(zendlval)); >> > efree(Z_USTRVAL_P(zendlval)); >> > return 0; >> > Index: Zend/zend_operators.c >> > =================================================================== >> > RCS file: /repository/ZendEngine2/zend_operators.c,v >> > retrieving revision 1.248 >> > diff -p -u -r1.248 zend_operators.c >> > --- Zend/zend_operators.c 12 Jul 2006 19:34:55 -0000 >> 1.248 >> > +++ Zend/zend_operators.c 17 Jul 2006 19:47:30 -0000 >> > @@ -2109,14 +2109,21 @@ ZEND_API zstr zend_u_str_case_fold(zend_ >> > zstr ret; >> > >> > if (type == IS_UNICODE) { >> > - int ret_len; >> > + int ret_len = length; >> > >> > if (normalize) { >> > - zend_normalize_identifier(&ret.u, >> &ret_len, source.u, length, 1); >> > + if >> (zend_normalize_identifier(&ret.u, &ret_len, source.u, >> length, 1) == FAILURE) { >> > + zend_error(E_NOTICE, "Could >> not normalize identifier"); >> > + ret.u = eustrndup(source.u, length); >> > + } >> > } else { >> > UErrorCode status = U_ZERO_ERROR; >> > >> > zend_case_fold_string(&ret.u, &ret_len, >> > source.u, length, U_FOLD_CASE_DEFAULT, &status); >> > + if (U_FAILURE(status)) { >> > + zend_error(E_NOTICE, "Could >> not case-fold string"); >> > + ret.u = eustrndup(source.u, length); >> > + } >> > } >> > >> > *new_len = ret_len; >> > Index: Zend/zend_unicode.c >> > =================================================================== >> > RCS file: /repository/ZendEngine2/zend_unicode.c,v >> > retrieving revision 1.25 >> > diff -p -u -r1.25 zend_unicode.c >> > --- Zend/zend_unicode.c 12 Jul 2006 17:35:06 -0000 1.25 >> > +++ Zend/zend_unicode.c 17 Jul 2006 19:47:30 -0000 >> > @@ -736,7 +736,7 @@ ZEND_API int zend_normalize_identifier(U >> > if (unorm_quickCheck(ident, ident_len, UNORM_NFKC, >> &status) != UNORM_YES) { >> > zend_normalize_string(&buffer, &buffer_len, >> ident, ident_len, &status); >> > if (U_FAILURE(status)) { >> > - return 0; >> > + return FAILURE; >> > } >> > ident = buffer; >> > ident_len = buffer_len; @@ -748,7 +748,7 @@ >> ZEND_API >> > int zend_normalize_identifier(U >> > efree(ident); >> > } >> > if (U_FAILURE(status)) { >> > - return 0; >> > + return FAILURE; >> > } >> > ident = buffer; >> > ident_len = buffer_len; @@ -759,7 +759,7 @@ >> ZEND_API >> > int zend_normalize_identifier(U >> > efree(ident); >> > } >> > if (U_FAILURE(status)) { >> > - return 0; >> > + return FAILURE; >> > } >> > ident = buffer; >> > ident_len = buffer_len; @@ -768,7 +768,7 @@ >> > ZEND_API int zend_normalize_identifier(U >> > >> > *dest = ident; >> > *dest_len = ident_len; >> > - return 1; >> > + return SUCCESS; >> > } >> > /* }}} */ >> > >> > Index: ext/reflection/php_reflection.c >> > =================================================================== >> > RCS file: /repository/php-src/ext/reflection/php_reflection.c,v >> > retrieving revision 1.243 >> > diff -p -u -r1.243 php_reflection.c >> > --- ext/reflection/php_reflection.c 13 Jul 2006 >> 12:34:30 -0000 1.243 >> > +++ ext/reflection/php_reflection.c 17 Jul 2006 19:47:31 -0000 >> > @@ -1972,7 +1972,7 @@ ZEND_METHOD(reflection_parameter, getCla >> > GET_REFLECTION_OBJECT_PTR(param); >> > >> > if (param->arg_info->class_name.v) { >> > - if >> > (zend_u_lookup_class_ex(UG(unicode)?IS_UNICODE:IS_STRING, >> > param->arg_info->class_name, >> param->arg_info->class_name_len, 1, &pce >> > param->TSRMLS_CC) == FAILURE) { >> > + if >> > (zend_u_lookup_class_ex(UG(unicode)?IS_UNICODE:IS_STRING, >> > param->arg_info->class_name, param->arg_info->class_name_len, 1, 1, >> > param->&pce TSRMLS_CC) == FAILURE) { >> > >> zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, >> > "Class %v does not exist", >> param->arg_info->class_name); >> > return; Best regards, Marcus -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php