cvs: php-src /ext/reflection php_reflection.c /ext/reflection/tests 005.phpt 009.phpt 010.phpt 011.phpt 012.phpt 013.phpt 014.phpt 015.phpt 016.phpt
017.phpt 018.phpt 019.phpt 020.phpt 021.phpt 022.phpt 023.phpt 024.phpt
| From: | Dmitry Stogov | Date: | Tue, 17 Oct 2006 11:11:45 +0000 |
| Subject: | cvs: php-src /ext/reflection php_reflection.c /ext/reflection/tests 005.phpt 009.phpt 010.phpt 011.phpt 012.phpt 013.phpt 014.phpt 015.phpt 016.phpt 017.phpt 018.phpt 019.phpt 020.phpt 021.phpt 022.phpt 023.phpt 024.phpt |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-41132@lists.php.net to get a copy of this message | ||
dmitry Tue Oct 17 11:11:45 2006 UTC
Added files:
/php-src/ext/reflection/tests 010.phpt 011.phpt 012.phpt 013.phpt
014.phpt 015.phpt 016.phpt 017.phpt
018.phpt 019.phpt 020.phpt 021.phpt
022.phpt 023.phpt 024.phpt
Modified files:
/php-src/ext/reflection php_reflection.c
/php-src/ext/reflection/tests 005.phpt 009.phpt
Log:
Unicode support. (Two more places must be fixed. Look for FIXME comments.)
http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/php_reflection.c?r1=1.261&r2=1.262&diff_format=u Index: php-src/ext/reflection/php_reflection.c diff -u php-src/ext/reflection/php_reflection.c:1.261 php-src/ext/reflection/php_reflection.c:1.262 --- php-src/ext/reflection/php_reflection.c:1.261 Wed Oct 11 15:51:17 2006 +++ php-src/ext/reflection/php_reflection.c Tue Oct 17 11:11:45 2006 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_reflection.c,v 1.261 2006/10/11 15:51:17 tony2001 Exp $ */ +/* $Id: php_reflection.c,v 1.262 2006/10/17 11:11:45 dmitry Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -200,7 +200,7 @@ { zval **value; - if (zend_hash_find(Z_OBJPROP_P(object), name, name_len, (void **) &value) == FAILURE) { + if (zend_ascii_hash_find(Z_OBJPROP_P(object), name, name_len, (void **) &value) == FAILURE) { RETURN_FALSE; } @@ -276,9 +276,9 @@ return object; } -static void _const_string(string *str, char *name, zval *value, char *indent TSRMLS_DC); +static void _const_string(string *str, zstr name, zval *value, char *indent TSRMLS_DC); static void _function_string(string *str, zend_function *fptr, zend_class_entry *scope, char *indent TSRMLS_DC); -static void _property_string(string *str, zend_property_info *prop, char *prop_name, char* indent TSRMLS_DC); +static void _property_string(string *str, zend_property_info *prop, zstr prop_name, char* indent TSRMLS_DC); static void _class_string(string *str, zend_class_entry *ce, zval *obj, char *indent TSRMLS_DC); static void _extension_string(string *str, zend_module_entry *module, char *indent TSRMLS_DC); @@ -360,7 +360,7 @@ while (zend_hash_get_current_data_ex(&ce->constants_table, (void **) &value, &pos) == SUCCESS) { zend_hash_get_current_key_ex(&ce->constants_table, &key, &key_len, &num_index, 0, &pos); - _const_string(str, key.s, *value, indent TSRMLS_CC); + _const_string(str, key, *value, indent TSRMLS_CC); zend_hash_move_forward_ex(&ce->constants_table, &pos); } } @@ -397,7 +397,7 @@ while (zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop, &pos) == SUCCESS) { if ((prop->flags & ZEND_ACC_STATIC) && !(prop->flags & ZEND_ACC_SHADOW)) { - _property_string(str, prop, NULL, sub_indent.string TSRMLS_CC); + _property_string(str, prop, NULL_ZSTR, sub_indent.string TSRMLS_CC); } zend_hash_move_forward_ex(&ce->properties_info, &pos); @@ -457,7 +457,7 @@ while (zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop, &pos) == SUCCESS) { if (!(prop->flags & (ZEND_ACC_STATIC|ZEND_ACC_SHADOW))) { - _property_string(str, prop, NULL, sub_indent.string TSRMLS_CC); + _property_string(str, prop, NULL_ZSTR, sub_indent.string TSRMLS_CC); } zend_hash_move_forward_ex(&ce->properties_info, &pos); } @@ -479,16 +479,17 @@ while (zend_hash_get_current_data_ex(properties, (void **) &prop, &pos) == SUCCESS) { zstr prop_name; uint prop_name_size; + zend_uchar prop_type; ulong index; - if (zend_hash_get_current_key_ex(properties, &prop_name, &prop_name_size, &index, 1, &pos) == HASH_KEY_IS_STRING) { - if (prop_name_size && prop_name.s[0]) { /* skip all private and protected properties */ - if (!zend_hash_quick_exists(&ce->properties_info, prop_name.s, prop_name_size, zend_get_hash_value(prop_name.s, prop_name_size))) { + if ((prop_type = zend_hash_get_current_key_ex(properties, &prop_name, &prop_name_size, &index, 0, &pos)) == (UG(unicode)?HASH_KEY_IS_UNICODE:HASH_KEY_IS_STRING)) { + if (prop_name_size && (UG(unicode)?prop_name.u[0]:prop_name.s[0])) { + /* skip all private and protected properties */ + if (zend_u_hash_exists(&ce->properties_info, prop_type, prop_name, prop_name_size)) { count++; - _property_string(&dyn, NULL, prop_name.s, sub_indent.string TSRMLS_CC); + _property_string(&dyn, NULL, prop_name, sub_indent.string TSRMLS_CC); } } - efree(prop_name.s); } zend_hash_move_forward_ex(properties, &pos); } @@ -548,7 +549,7 @@ /* }}} */ /* {{{ _const_string */ -static void _const_string(string *str, char *name, zval *value, char *indent TSRMLS_DC) +static void _const_string(string *str, zstr name, zval *value, char *indent TSRMLS_DC) { char *type; zval value_copy; @@ -723,9 +724,8 @@ if (fptr->common.scope != scope) { string_printf(str, ", inherits %v", fptr->common.scope->name); } else if (fptr->common.scope->parent) { - /* FIXME: Unicode support??? */ - lc_name = zend_u_str_case_fold(IS_STRING, fptr->common.function_name, strlen(fptr->common.function_name.s), 1, &lc_name_len); - if (zend_u_hash_find(&fptr->common.scope->parent->function_table, IS_STRING, lc_name, lc_name_len + 1, (void**) &overwrites) == SUCCESS) { + lc_name = zend_u_str_case_fold(ZEND_STR_TYPE, fptr->common.function_name, USTR_LEN(fptr->common.function_name), 1, &lc_name_len); + if (zend_u_hash_find(&fptr->common.scope->parent->function_table, ZEND_STR_TYPE, lc_name, lc_name_len + 1, (void**) &overwrites) == SUCCESS) { if (fptr->common.scope != overwrites->common.scope) { string_printf(str, ", overwrites %v", overwrites->common.scope->name); } @@ -795,14 +795,14 @@ /* }}} */ /* {{{ _property_string */ -static void _property_string(string *str, zend_property_info *prop, char *sz_prop_name, char* indent TSRMLS_DC) +static void _property_string(string *str, zend_property_info *prop, zstr sz_prop_name, char* indent TSRMLS_DC) { zstr class_name; zstr prop_name; string_printf(str, "%sProperty [ ", indent); if (!prop) { - string_printf(str, "<dynamic> public $%s", sz_prop_name); + string_printf(str, "<dynamic> public $%v", sz_prop_name); } else { if (!(prop->flags & ZEND_ACC_STATIC)) { if (prop->flags & ZEND_ACC_IMPLICIT_PUBLIC) { @@ -896,8 +896,7 @@ if (constant->module_number == module->module_number) { TSRMLS_FETCH(); - /* FIXME: Unicode support??? */ - _const_string(str, constant->name.s, &constant->value, indent TSRMLS_CC); + _const_string(str, constant->name, &constant->value, indent TSRMLS_CC); (*num_classes)++; } return ZEND_HASH_APPLY_KEEP; @@ -986,7 +985,7 @@ /* Is there a better way of doing this? */ while (func->fname) { - if (zend_hash_find(EG(function_table), func->fname, strlen(func->fname) + 1, (void**) &fptr) == FAILURE) { + if (zend_ascii_hash_find(EG(function_table), func->fname, strlen(func->fname) + 1, (void**) &fptr) == FAILURE) { zend_error(E_WARNING, "Internal error: Cannot find extension function %s in global function table", func->fname); continue; } @@ -1044,7 +1043,7 @@ intern->ptr = ce; intern->free_ptr = 0; intern->ce = ce; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); } /* }}} */ @@ -1068,11 +1067,11 @@ reflection_instanciate(reflection_extension_ptr, object TSRMLS_CC); intern = (reflection_object *) zend_object_store_get_object(object TSRMLS_CC); MAKE_STD_ZVAL(name); - ZVAL_STRINGL(name, module->name, name_len, 1); + ZVAL_ASCII_STRINGL(name, module->name, name_len, 1); intern->ptr = module; intern->free_ptr = 0; intern->ce = NULL; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); } /* }}} */ @@ -1099,7 +1098,7 @@ intern->ptr = reference; intern->free_ptr = 1; intern->ce = fptr->common.scope; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); } /* }}} */ @@ -1117,7 +1116,7 @@ intern->ptr = function; intern->free_ptr = 0; intern->ce = NULL; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); } /* }}} */ @@ -1137,8 +1136,8 @@ intern->ptr = method; intern->free_ptr = 0; intern->ce = ce; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); - zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); } /* }}} */ @@ -1180,8 +1179,8 @@ intern->ptr = reference; intern->free_ptr = 1; intern->ce = ce; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); - zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); } /* }}} */ @@ -1255,7 +1254,7 @@ params[0] = &reflector_ptr; params[1] = &output_ptr; - ZVAL_STRINGL(&fname, "export", sizeof("export") - 1, 0); + ZVAL_ASCII_STRINGL(&fname, "export", sizeof("export") - 1, 1); fci.function_table = &reflection_ptr->function_table; fci.function_name = &fname; fci.object_pp = NULL; @@ -1266,6 +1265,8 @@ result = zend_call_function(&fci, NULL TSRMLS_CC); + zval_dtor(&fname); + if (result == FAILURE && EG(exception) == NULL) { zval_ptr_dtor(&reflector_ptr); zval_ptr_dtor(&retval_ptr); @@ -1342,27 +1343,27 @@ array_init(return_value); if (modifiers & (ZEND_ACC_ABSTRACT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { - add_next_index_stringl(return_value, "abstract", sizeof("abstract")-1, 1); + add_next_index_ascii_stringl(return_value, "abstract", sizeof("abstract")-1, 1); } if (modifiers & (ZEND_ACC_FINAL | ZEND_ACC_FINAL_CLASS)) { - add_next_index_stringl(return_value, "final", sizeof("final")-1, 1); + add_next_index_ascii_stringl(return_value, "final", sizeof("final")-1, 1); } /* These are mutually exclusive */ switch (modifiers & ZEND_ACC_PPP_MASK) { case ZEND_ACC_PUBLIC: - add_next_index_stringl(return_value, "public", sizeof("public")-1, 1); + add_next_index_ascii_stringl(return_value, "public", sizeof("public")-1, 1); break; case ZEND_ACC_PRIVATE: - add_next_index_stringl(return_value, "private", sizeof("private")-1, 1); + add_next_index_ascii_stringl(return_value, "private", sizeof("private")-1, 1); break; case ZEND_ACC_PROTECTED: - add_next_index_stringl(return_value, "protected", sizeof("protected")-1, 1); + add_next_index_ascii_stringl(return_value, "protected", sizeof("protected")-1, 1); break; } if (modifiers & ZEND_ACC_STATIC) { - add_next_index_stringl(return_value, "static", sizeof("static")-1, 1); + add_next_index_ascii_stringl(return_value, "static", sizeof("static")-1, 1); } } /* }}} */ @@ -1408,7 +1409,7 @@ efree(lcname.v); MAKE_STD_ZVAL(name); ZVAL_TEXT(name, fptr->common.function_name, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); intern->ptr = fptr; intern->free_ptr = 0; intern->ce = NULL; @@ -1427,7 +1428,7 @@ GET_REFLECTION_OBJECT_PTR(fptr); string_init(&str); _function_string(&str, fptr, intern->ce, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -1489,7 +1490,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_function_abstract_ptr, 0); GET_REFLECTION_OBJECT_PTR(fptr); if (fptr->type == ZEND_USER_FUNCTION) { - RETURN_STRING(fptr->op_array.filename, 1); + RETURN_RT_STRING(fptr->op_array.filename, 1); } RETURN_FALSE; } @@ -1537,7 +1538,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_function_abstract_ptr, 0); GET_REFLECTION_OBJECT_PTR(fptr); if (fptr->type == ZEND_USER_FUNCTION && fptr->op_array.doc_comment) { - RETURN_STRINGL(fptr->op_array.doc_comment, fptr->op_array.doc_comment_len, 1); + RETURN_RT_STRINGL(fptr->op_array.doc_comment, fptr->op_array.doc_comment_len, 1); } RETURN_FALSE; } @@ -1790,7 +1791,7 @@ internal = (zend_internal_function *)fptr; if (internal->module) { - RETURN_STRING(internal->module->name, 1); + RETURN_ASCII_STRING(internal->module->name, 1); } else { RETURN_FALSE; } @@ -1924,7 +1925,7 @@ } else { ZVAL_NULL(name); } - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); ref = (parameter_reference*) emalloc(sizeof(parameter_reference)); ref->arg_info = &arg_info[position]; @@ -1949,7 +1950,7 @@ GET_REFLECTION_OBJECT_PTR(param); string_init(&str); _parameter_string(&str, param->fptr, param->arg_info, param->offset, param->required, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -2174,11 +2175,11 @@ zval ztmp; zend_uchar type; + /* FIXME: Unicode support??? */ if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "zt", &classname, &name_str, &name_len, &type) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name_str, &name_len) == FAILURE) { return; } - /* FIXME: Unicode support??? */ if ((tmp = strstr(name_str.s, "::")) == NULL) { zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Invalid method name %s", name_str); return; @@ -2203,7 +2204,7 @@ case IS_UNICODE: if (zend_u_lookup_class(Z_TYPE_P(classname), Z_UNIVAL_P(classname), Z_UNILEN_P(classname), &pce TSRMLS_CC) == FAILURE) { zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, - "Class %v does not exist", Z_UNIVAL_P(classname)); + "Class %R does not exist", Z_TYPE_P(classname), Z_UNIVAL_P(classname)); if (classname == &ztmp) { zval_dtor(&ztmp); } @@ -2231,7 +2232,7 @@ MAKE_STD_ZVAL(classname); ZVAL_TEXTL(classname, ce->name, ce->name_length, 1); - zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); lcname = zend_u_str_case_fold(type, name_str, name_len, 1, &lcname_len); @@ -2245,7 +2246,7 @@ MAKE_STD_ZVAL(name); ZVAL_TEXT(name, mptr->common.function_name, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); intern->ptr = mptr; intern->free_ptr = 0; intern->ce = ce; @@ -2264,7 +2265,7 @@ GET_REFLECTION_OBJECT_PTR(mptr); string_init(&str); _function_string(&str, mptr, intern->ce, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -2650,7 +2651,7 @@ if (argument) { MAKE_STD_ZVAL(classname); ZVAL_TEXTL(classname, Z_OBJCE_P(argument)->name, Z_OBJCE_P(argument)->name_length, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &classname, sizeof(zval *), NULL); intern->ptr = Z_OBJCE_P(argument); if (is_object) { intern->obj = argument; @@ -2666,7 +2667,7 @@ MAKE_STD_ZVAL(classname); ZVAL_TEXTL(classname, (*ce)->name, (*ce)->name_length, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &classname, sizeof(zval *), NULL); intern->ptr = *ce; } @@ -2819,8 +2820,8 @@ zend_hash_get_current_key_ex(&ce->default_properties, &key, &key_len, &num_index, 0, &pos); zend_hash_move_forward_ex(&ce->default_properties, &pos); zend_u_unmangle_property_name(UG(unicode)?IS_UNICODE:IS_STRING, key, key_len-1, &class_name, &prop_name); - /* FIXME: Unicode support??? */ - if (class_name.s && class_name.s[0] != '*' && strcmp(class_name.s, ce->name.s)) { + if (class_name.s && class_name.s[0] != '*' && + (UG(unicode)?u_strcmp(class_name.u, ce->name.u):strcmp(class_name.s, ce->name.s))) { /* filter privates from base classes */ continue; } @@ -2831,7 +2832,7 @@ zval_copy_ctor(prop_copy); INIT_PZVAL(prop_copy); - add_assoc_zval(return_value, prop_name.s, prop_copy); + add_u_assoc_zval(return_value, ZEND_STR_TYPE, prop_name, prop_copy); } } } @@ -2849,7 +2850,7 @@ GET_REFLECTION_OBJECT_PTR(ce); string_init(&str); _class_string(&str, ce, intern->obj, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -2898,7 +2899,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_class_ptr, 0); GET_REFLECTION_OBJECT_PTR(ce); if (ce->type == ZEND_USER_CLASS) { - RETURN_STRING(ce->filename, 1); + RETURN_RT_STRING(ce->filename, 1); } RETURN_FALSE; } @@ -2946,7 +2947,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_class_ptr, 0); GET_REFLECTION_OBJECT_PTR(ce); if (ce->type == ZEND_USER_CLASS && ce->doc_comment) { - RETURN_STRINGL(ce->doc_comment, ce->doc_comment_len, 1); + RETURN_RT_STRINGL(ce->doc_comment, ce->doc_comment_len, 1); } RETURN_FALSE; } @@ -3079,24 +3080,29 @@ { reflection_object *intern; zend_class_entry *ce; - char *name; + zstr name; int name_len; + zend_uchar name_type; zval *property; METHOD_NOTSTATIC(reflection_class_ptr); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &name, &name_len, &name_type) == FAILURE) { return; } GET_REFLECTION_OBJECT_PTR(ce); - if (zend_hash_exists(&ce->properties_info, name, name_len + 1)) { + if (zend_u_hash_exists(&ce->properties_info, name_type, name, name_len + 1)) { RETURN_TRUE; } else { if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property)) { MAKE_STD_ZVAL(property); - ZVAL_STRINGL(property, name, name_len, 1); - if (Z_OBJ_HANDLER_P(intern->obj, has_property)(intern->obj, property, 2 TSRMLS_CC)) { + if (name_type == IS_STRING) { + ZVAL_STRINGL(property, name.s, name_len, 1); + } else { + ZVAL_UNICODEL(property, name.u, name_len, 1); + } + if (Z_OBJ_HANDLER_P(intern->obj, has_property)(intern->obj, property, 0 TSRMLS_CC)) { zval_ptr_dtor(&property); RETURN_TRUE; } @@ -3249,16 +3255,17 @@ { reflection_object *intern; zend_class_entry *ce; - char *name; + zstr name; int name_len; + zend_uchar name_type; METHOD_NOTSTATIC(reflection_class_ptr); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &name, &name_len, &name_type) == FAILURE) { return; } GET_REFLECTION_OBJECT_PTR(ce); - if (zend_hash_exists(&ce->constants_table, name, name_len + 1)) { + if (zend_u_hash_exists(&ce->constants_table, name_type, name, name_len + 1)) { RETURN_TRUE; } else { RETURN_FALSE; @@ -3289,17 +3296,18 @@ reflection_object *intern; zend_class_entry *ce; zval **value; - char *name; + zstr name; int name_len; + zend_uchar name_type; METHOD_NOTSTATIC(reflection_class_ptr); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &name, &name_len, &name_type) == FAILURE) { return; } GET_REFLECTION_OBJECT_PTR(ce); zend_hash_apply_with_argument(&ce->constants_table, (apply_func_arg_t) zval_update_constant, (void*)1 TSRMLS_CC); - if (zend_hash_find(&ce->constants_table, name, name_len + 1, (void **) &value) == FAILURE) { + if (zend_u_hash_find(&ce->constants_table, name_type, name, name_len + 1, (void **) &value) == FAILURE) { RETURN_FALSE; } *return_value = **value; @@ -3741,7 +3749,7 @@ GET_REFLECTION_OBJECT_PTR(ce); if (ce->module) { - RETURN_STRING(ce->module->name, 1); + RETURN_ASCII_STRING(ce->module->name, 1); } else { RETURN_FALSE; } @@ -3838,12 +3846,12 @@ MAKE_STD_ZVAL(classname); ZVAL_TEXTL(classname, ce->name, ce->name_length, 1); - zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); zend_u_unmangle_property_name(UG(unicode)?IS_UNICODE:IS_STRING, property_info->name, property_info->name_length, &class_name, &prop_name); MAKE_STD_ZVAL(propname); ZVAL_TEXT(propname, prop_name, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &propname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &propname, sizeof(zval *), NULL); reference = (property_reference*) emalloc(sizeof(property_reference)); reference->ce = ce; @@ -3865,8 +3873,8 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_property_ptr, 0); GET_REFLECTION_OBJECT_PTR(ref); string_init(&str); - _property_string(&str, ref->prop, NULL, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + _property_string(&str, ref->prop, NULL_ZSTR, "" TSRMLS_CC); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -4128,7 +4136,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_property_ptr, 0); GET_REFLECTION_OBJECT_PTR(ref); if (ref->prop->doc_comment) { - RETURN_STRINGL(ref->prop->doc_comment, ref->prop->doc_comment_len, 1); + RETURN_RT_STRINGL(ref->prop->doc_comment, ref->prop->doc_comment_len, 1); } RETURN_FALSE; } @@ -4173,8 +4181,8 @@ } free_alloca(lcname); MAKE_STD_ZVAL(name); - ZVAL_STRING(name, module->name, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + ZVAL_ASCII_STRING(name, module->name, 1); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); intern->ptr = module; intern->free_ptr = 0; intern->ce = NULL; @@ -4193,7 +4201,7 @@ GET_REFLECTION_OBJECT_PTR(module); string_init(&str); _extension_string(&str, module, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -4220,7 +4228,7 @@ if (module->version == NO_VERSION_YET) { RETURN_NULL(); } else { - RETURN_STRING(module->version, 1); + RETURN_ASCII_STRING(module->version, 1); } } /* }}} */ @@ -4243,14 +4251,14 @@ /* Is there a better way of doing this? */ while (func->fname) { - if (zend_hash_find(EG(function_table), func->fname, strlen(func->fname) + 1, (void**) &fptr) == FAILURE) { + if (zend_ascii_hash_find(EG(function_table), func->fname, strlen(func->fname) + 1, (void**) &fptr) == FAILURE) { zend_error(E_WARNING, "Internal error: Cannot find extension function %s in global function table", func->fname); continue; } ALLOC_ZVAL(function); reflection_function_factory(fptr, function TSRMLS_CC); - add_assoc_zval_ex(return_value, func->fname, strlen(func->fname)+1, function); + add_ascii_assoc_zval_ex(return_value, func->fname, strlen(func->fname)+1, function); func++; } } @@ -4264,12 +4272,13 @@ int number = va_arg(args, int); if (number == constant->module_number) { + TSRMLS_FETCH(); + ALLOC_ZVAL(const_val); *const_val = constant->value; zval_copy_ctor(const_val); INIT_PZVAL(const_val); - /* FIXME: Unicode support???*/ - add_assoc_zval_ex(retval, constant->name.s, constant->name_len, const_val); + add_u_assoc_zval_ex(retval, ZEND_STR_TYPE, constant->name, constant->name_len, const_val); } return 0; } @@ -4296,10 +4305,12 @@ int number = va_arg(args, int); if (number == ini_entry->module_number) { + TSRMLS_FETCH(); + if (ini_entry->value) { - add_assoc_stringl(retval, ini_entry->name, ini_entry->value, ini_entry->value_length, 1); + add_ascii_assoc_rt_stringl(retval, ini_entry->name, ini_entry->value, ini_entry->value_length, 1); } else { - add_assoc_null(retval, ini_entry->name); + add_ascii_assoc_null(retval, ini_entry->name); } } return ZEND_HASH_APPLY_KEEP; @@ -4333,8 +4344,7 @@ if (add_reflection_class) { ALLOC_ZVAL(zclass); zend_reflection_class_factory(*pce, zclass TSRMLS_CC); - /* FIXME: Unicode support??? */ - add_assoc_zval_ex(class_array, (*pce)->name.s, (*pce)->name_length + 1, zclass); + add_u_assoc_zval_ex(class_array, ZEND_STR_TYPE, (*pce)->name, (*pce)->name_length + 1, zclass); } else { add_next_index_textl(class_array, (*pce)->name, (*pce)->name_length, 1); } @@ -4419,7 +4429,7 @@ dep->rel ? dep->rel : "", dep->version ? " " : "", dep->version ? dep->version : ""); - add_assoc_stringl(return_value, dep->name, relation, len, 0); + add_ascii_assoc_ascii_stringl(return_value, dep->name, relation, len, ZSTR_AUTOFREE); dep++; } } @@ -4920,7 +4930,7 @@ php_info_print_table_start(); php_info_print_table_header(2, "Reflection", "enabled"); - php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.261 2006/10/11 15:51:17 tony2001 Exp $"); + php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.262 2006/10/17 11:11:45 dmitry Exp $"); php_info_print_table_end(); } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/005.phpt?r1=1.4&r2=1.5&diff_format=u Index: php-src/ext/reflection/tests/005.phpt diff -u php-src/ext/reflection/tests/005.phpt:1.4 php-src/ext/reflection/tests/005.phpt:1.5 --- php-src/ext/reflection/tests/005.phpt:1.4 Tue Sep 19 12:06:49 2006 +++ php-src/ext/reflection/tests/005.phpt Tue Oct 17 11:11:45 2006 @@ -54,3 +54,10 @@ bool(false) string(22) "* Comment for A::baz()" ===DONE=== +--UEXPECT-- +unicode(19) "Comment for class A" +unicode(15) "Method A::bla()" +bool(false) +bool(false) +unicode(22) "* Comment for A::baz()" +===DONE=== http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/009.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/reflection/tests/009.phpt diff -u php-src/ext/reflection/tests/009.phpt:1.1 php-src/ext/reflection/tests/009.phpt:1.2 --- php-src/ext/reflection/tests/009.phpt:1.1 Wed Oct 11 15:51:17 2006 +++ php-src/ext/reflection/tests/009.phpt Tue Oct 17 11:11:45 2006 @@ -26,7 +26,7 @@ echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(20) "Invalid method name " string(21) "Invalid method name 1" string(21) "Class does not exist" @@ -37,3 +37,14 @@ string(66) "The parameter class is expected to be either a string or an object" string(21) "Class does not exist" Done +--UEXPECT-- +unicode(20) "Invalid method name " +unicode(21) "Invalid method name 1" +unicode(21) "Class does not exist" +unicode(22) "Class a does not exist" +unicode(21) "Class does not exist" +unicode(22) "Class a does not exist" +unicode(21) "Class does not exist" +unicode(66) "The parameter class is expected to be either a string or an object" +unicode(21) "Class does not exist" +Done http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/010.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/010.phpt +++ php-src/ext/reflection/tests/010.phpt --TEST-- ReflectionMethod::__toString() tests (overriden method) --FILE-- <?php class Foo { function func() { } } class Bar extends Foo { function func() { } } $m = new ReflectionMethod("Bar::func"); echo $m; ?> --EXPECTF-- Method [ <user, overwrites Foo, prototype Foo> public method func ] { @@ %s010.php 7 - 8 } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/011.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/011.phpt +++ php-src/ext/reflection/tests/011.phpt --TEST-- ReflectionExtension::getClasses() --FILE-- <?php $ext = new ReflectionExtension("reflection"); $classes = $ext->getClasses(); echo $classes["ReflectionException"]->getName(); ?> --EXPECT-- ReflectionException http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/012.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/012.phpt +++ php-src/ext/reflection/tests/012.phpt --TEST-- ReflectionClass::getDefaultProperties() --FILE-- <?php class Foo { public $test = "ok"; } $class = new ReflectionClass("Foo"); $props = $class->getDefaultProperties(); echo $props["test"]; ?> --EXPECT-- ok http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/013.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/013.phpt +++ php-src/ext/reflection/tests/013.phpt --TEST-- ReflectionExtension::getFunctions() --FILE-- <?php $ext = new ReflectionExtension("standard"); $funcs = $ext->getFunctions(); echo $funcs["sleep"]->getName(); ?> --EXPECT-- sleep http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/014.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/014.phpt +++ php-src/ext/reflection/tests/014.phpt --TEST-- ReflectionExtension::getConstants() --FILE-- <?php $ext = new ReflectionExtension("standard"); $consts = $ext->getConstants(); var_dump($consts["CONNECTION_NORMAL"]); ?> --EXPECT-- int(0) http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/015.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/015.phpt +++ php-src/ext/reflection/tests/015.phpt --TEST-- ReflectionExtension::getINIEntries() --INI-- user_agent=php --FILE-- <?php $ext = new ReflectionExtension("standard"); $inis = $ext->getINIEntries(); var_dump($inis["user_agent"]); ?> --EXPECT-- string(3) "php" --UEXPECT-- unicode(3) "php" http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/016.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/016.phpt +++ php-src/ext/reflection/tests/016.phpt --TEST-- ReflectionExtension::getDependencies() --SKIPIF-- <?php if (!extension_loaded("xml")) { die('skip xml extension not available'); } ?> --FILE-- <?php $ext = new ReflectionExtension("xml"); $deps = $ext->getDependencies(); var_dump($deps); ?> --EXPECT-- array(1) { ["libxml"]=> string(8) "Required" } --UEXPECT-- array(1) { [u"libxml"]=> unicode(8) "Required" } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/017.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/017.phpt +++ php-src/ext/reflection/tests/017.phpt --TEST-- ReflectionClass::__toString() (constants) --FILE-- <?php class Foo { const test = "ok"; } $class = new ReflectionClass("Foo"); echo $class; ?> --EXPECTF-- Class [ <user> class Foo ] { @@ %s017.php 2-4 - Constants [1] { Constant [ string test ] { ok } } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [0] { } } --UEXPECTF-- Class [ <user> class Foo ] { @@ %s017.php 2-4 - Constants [1] { Constant [ Unicode string test ] { ok } } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [0] { } } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/018.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/018.phpt +++ php-src/ext/reflection/tests/018.phpt --TEST-- Reflection::getModifierNames --FILE-- <?php var_dump(Reflection::getModifierNames(ReflectionMethod::IS_FINAL | ReflectionMethod::IS_PROTECTED)); ?> --EXPECT-- array(2) { [0]=> string(5) "final" [1]=> string(9) "protected" } --UEXPECT-- array(2) { [0]=> unicode(5) "final" [1]=> unicode(9) "protected" } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/019.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/019.phpt +++ php-src/ext/reflection/tests/019.phpt --TEST-- ReflectionFunction::getExtensionName --FILE-- <?php $f = new ReflectionFunction("sleep"); var_dump($f->getExtensionName()); ?> --EXPECT-- string(8) "standard" --UEXPECT-- unicode(8) "standard" http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/020.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/020.phpt +++ php-src/ext/reflection/tests/020.phpt --TEST-- ReflectionObject::hasProperty --FILE-- <?php class Foo { public $p1; protected $p2; private $p3; function __isset($name) { var_dump($name); return false; } } $obj = new ReflectionObject(new Foo()); var_dump($obj->hasProperty("p1")); var_dump($obj->hasProperty("p2")); var_dump($obj->hasProperty("p3")); var_dump($obj->hasProperty("p4")); ?> --EXPECT-- bool(true) bool(true) bool(true) string(2) "p4" bool(false) --UEXPECT-- bool(true) bool(true) bool(true) unicode(2) "p4" bool(false) http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/021.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/021.phpt +++ php-src/ext/reflection/tests/021.phpt --TEST-- ReflectionClass::hasConstant --FILE-- <?php class Foo { const c1 = 1; } $class = new ReflectionClass("Foo"); var_dump($class->hasConstant("c1")); var_dump($class->hasConstant("c2")); ?> --EXPECT-- bool(true) bool(false) http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/022.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/022.phpt +++ php-src/ext/reflection/tests/022.phpt --TEST-- ReflectionClass::getConstant --FILE-- <?php class Foo { const c1 = 1; } $class = new ReflectionClass("Foo"); var_dump($class->getConstant("c1")); var_dump($class->getConstant("c2")); ?> --EXPECT-- int(1) bool(false) http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/023.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/023.phpt +++ php-src/ext/reflection/tests/023.phpt --TEST-- ReflectionClass::getDefaultProperties (filtering parent privates) --FILE-- <?php class C1 { private $p1 = 1; protected $p2 = 2; public $p3 = 3; } class C2 extends C1 { private $p4 = 4; protected $p5 = 5; public $p6 = 6; } $class = new ReflectionClass("C2"); var_dump($class->getDefaultProperties()); ?> --EXPECT-- array(5) { ["p4"]=> int(4) ["p5"]=> int(5) ["p6"]=> int(6) ["p2"]=> int(2) ["p3"]=> int(3) } --UEXPECT-- array(5) { [u"p4"]=> int(4) [u"p5"]=> int(5) [u"p6"]=> int(6) [u"p2"]=> int(2) [u"p3"]=> int(3) } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/024.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/024.phpt +++ php-src/ext/reflection/tests/024.phpt --TEST-- ReflectionObject::__toString (filtering privates/protected dynamic properties) --FILE-- <?php class C1 { private $p1 = 1; protected $p2 = 2; public $p3 = 3; } $obj = new ReflectionObject(new C1()); echo $obj; ?> --EXPECTF-- Object of class [ <user> class C1 ] { @@ %s024.php 2-6 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [3] { Property [ <default> private $p1 ] Property [ <default> protected $p2 ] Property [ <default> public $p3 ] } - Dynamic properties [1] { Property [ <dynamic> public $p3 ] } - Methods [0] { } }
http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/php_reflection.c?r1=1.261&r2=1.262&diff_format=u Index: php-src/ext/reflection/php_reflection.c diff -u php-src/ext/reflection/php_reflection.c:1.261 php-src/ext/reflection/php_reflection.c:1.262 --- php-src/ext/reflection/php_reflection.c:1.261 Wed Oct 11 15:51:17 2006 +++ php-src/ext/reflection/php_reflection.c Tue Oct 17 11:11:45 2006 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_reflection.c,v 1.261 2006/10/11 15:51:17 tony2001 Exp $ */ +/* $Id: php_reflection.c,v 1.262 2006/10/17 11:11:45 dmitry Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -200,7 +200,7 @@ { zval **value; - if (zend_hash_find(Z_OBJPROP_P(object), name, name_len, (void **) &value) == FAILURE) { + if (zend_ascii_hash_find(Z_OBJPROP_P(object), name, name_len, (void **) &value) == FAILURE) { RETURN_FALSE; } @@ -276,9 +276,9 @@ return object; } -static void _const_string(string *str, char *name, zval *value, char *indent TSRMLS_DC); +static void _const_string(string *str, zstr name, zval *value, char *indent TSRMLS_DC); static void _function_string(string *str, zend_function *fptr, zend_class_entry *scope, char *indent TSRMLS_DC); -static void _property_string(string *str, zend_property_info *prop, char *prop_name, char* indent TSRMLS_DC); +static void _property_string(string *str, zend_property_info *prop, zstr prop_name, char* indent TSRMLS_DC); static void _class_string(string *str, zend_class_entry *ce, zval *obj, char *indent TSRMLS_DC); static void _extension_string(string *str, zend_module_entry *module, char *indent TSRMLS_DC); @@ -360,7 +360,7 @@ while (zend_hash_get_current_data_ex(&ce->constants_table, (void **) &value, &pos) == SUCCESS) { zend_hash_get_current_key_ex(&ce->constants_table, &key, &key_len, &num_index, 0, &pos); - _const_string(str, key.s, *value, indent TSRMLS_CC); + _const_string(str, key, *value, indent TSRMLS_CC); zend_hash_move_forward_ex(&ce->constants_table, &pos); } } @@ -397,7 +397,7 @@ while (zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop, &pos) == SUCCESS) { if ((prop->flags & ZEND_ACC_STATIC) && !(prop->flags & ZEND_ACC_SHADOW)) { - _property_string(str, prop, NULL, sub_indent.string TSRMLS_CC); + _property_string(str, prop, NULL_ZSTR, sub_indent.string TSRMLS_CC); } zend_hash_move_forward_ex(&ce->properties_info, &pos); @@ -457,7 +457,7 @@ while (zend_hash_get_current_data_ex(&ce->properties_info, (void **) &prop, &pos) == SUCCESS) { if (!(prop->flags & (ZEND_ACC_STATIC|ZEND_ACC_SHADOW))) { - _property_string(str, prop, NULL, sub_indent.string TSRMLS_CC); + _property_string(str, prop, NULL_ZSTR, sub_indent.string TSRMLS_CC); } zend_hash_move_forward_ex(&ce->properties_info, &pos); } @@ -479,16 +479,17 @@ while (zend_hash_get_current_data_ex(properties, (void **) &prop, &pos) == SUCCESS) { zstr prop_name; uint prop_name_size; + zend_uchar prop_type; ulong index; - if (zend_hash_get_current_key_ex(properties, &prop_name, &prop_name_size, &index, 1, &pos) == HASH_KEY_IS_STRING) { - if (prop_name_size && prop_name.s[0]) { /* skip all private and protected properties */ - if (!zend_hash_quick_exists(&ce->properties_info, prop_name.s, prop_name_size, zend_get_hash_value(prop_name.s, prop_name_size))) { + if ((prop_type = zend_hash_get_current_key_ex(properties, &prop_name, &prop_name_size, &index, 0, &pos)) == (UG(unicode)?HASH_KEY_IS_UNICODE:HASH_KEY_IS_STRING)) { + if (prop_name_size && (UG(unicode)?prop_name.u[0]:prop_name.s[0])) { + /* skip all private and protected properties */ + if (zend_u_hash_exists(&ce->properties_info, prop_type, prop_name, prop_name_size)) { count++; - _property_string(&dyn, NULL, prop_name.s, sub_indent.string TSRMLS_CC); + _property_string(&dyn, NULL, prop_name, sub_indent.string TSRMLS_CC); } } - efree(prop_name.s); } zend_hash_move_forward_ex(properties, &pos); } @@ -548,7 +549,7 @@ /* }}} */ /* {{{ _const_string */ -static void _const_string(string *str, char *name, zval *value, char *indent TSRMLS_DC) +static void _const_string(string *str, zstr name, zval *value, char *indent TSRMLS_DC) { char *type; zval value_copy; @@ -723,9 +724,8 @@ if (fptr->common.scope != scope) { string_printf(str, ", inherits %v", fptr->common.scope->name); } else if (fptr->common.scope->parent) { - /* FIXME: Unicode support??? */ - lc_name = zend_u_str_case_fold(IS_STRING, fptr->common.function_name, strlen(fptr->common.function_name.s), 1, &lc_name_len); - if (zend_u_hash_find(&fptr->common.scope->parent->function_table, IS_STRING, lc_name, lc_name_len + 1, (void**) &overwrites) == SUCCESS) { + lc_name = zend_u_str_case_fold(ZEND_STR_TYPE, fptr->common.function_name, USTR_LEN(fptr->common.function_name), 1, &lc_name_len); + if (zend_u_hash_find(&fptr->common.scope->parent->function_table, ZEND_STR_TYPE, lc_name, lc_name_len + 1, (void**) &overwrites) == SUCCESS) { if (fptr->common.scope != overwrites->common.scope) { string_printf(str, ", overwrites %v", overwrites->common.scope->name); } @@ -795,14 +795,14 @@ /* }}} */ /* {{{ _property_string */ -static void _property_string(string *str, zend_property_info *prop, char *sz_prop_name, char* indent TSRMLS_DC) +static void _property_string(string *str, zend_property_info *prop, zstr sz_prop_name, char* indent TSRMLS_DC) { zstr class_name; zstr prop_name; string_printf(str, "%sProperty [ ", indent); if (!prop) { - string_printf(str, "<dynamic> public $%s", sz_prop_name); + string_printf(str, "<dynamic> public $%v", sz_prop_name); } else { if (!(prop->flags & ZEND_ACC_STATIC)) { if (prop->flags & ZEND_ACC_IMPLICIT_PUBLIC) { @@ -896,8 +896,7 @@ if (constant->module_number == module->module_number) { TSRMLS_FETCH(); - /* FIXME: Unicode support??? */ - _const_string(str, constant->name.s, &constant->value, indent TSRMLS_CC); + _const_string(str, constant->name, &constant->value, indent TSRMLS_CC); (*num_classes)++; } return ZEND_HASH_APPLY_KEEP; @@ -986,7 +985,7 @@ /* Is there a better way of doing this? */ while (func->fname) { - if (zend_hash_find(EG(function_table), func->fname, strlen(func->fname) + 1, (void**) &fptr) == FAILURE) { + if (zend_ascii_hash_find(EG(function_table), func->fname, strlen(func->fname) + 1, (void**) &fptr) == FAILURE) { zend_error(E_WARNING, "Internal error: Cannot find extension function %s in global function table", func->fname); continue; } @@ -1044,7 +1043,7 @@ intern->ptr = ce; intern->free_ptr = 0; intern->ce = ce; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); } /* }}} */ @@ -1068,11 +1067,11 @@ reflection_instanciate(reflection_extension_ptr, object TSRMLS_CC); intern = (reflection_object *) zend_object_store_get_object(object TSRMLS_CC); MAKE_STD_ZVAL(name); - ZVAL_STRINGL(name, module->name, name_len, 1); + ZVAL_ASCII_STRINGL(name, module->name, name_len, 1); intern->ptr = module; intern->free_ptr = 0; intern->ce = NULL; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); } /* }}} */ @@ -1099,7 +1098,7 @@ intern->ptr = reference; intern->free_ptr = 1; intern->ce = fptr->common.scope; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); } /* }}} */ @@ -1117,7 +1116,7 @@ intern->ptr = function; intern->free_ptr = 0; intern->ce = NULL; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); } /* }}} */ @@ -1137,8 +1136,8 @@ intern->ptr = method; intern->free_ptr = 0; intern->ce = ce; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); - zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); } /* }}} */ @@ -1180,8 +1179,8 @@ intern->ptr = reference; intern->free_ptr = 1; intern->ce = ce; - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); - zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); } /* }}} */ @@ -1255,7 +1254,7 @@ params[0] = &reflector_ptr; params[1] = &output_ptr; - ZVAL_STRINGL(&fname, "export", sizeof("export") - 1, 0); + ZVAL_ASCII_STRINGL(&fname, "export", sizeof("export") - 1, 1); fci.function_table = &reflection_ptr->function_table; fci.function_name = &fname; fci.object_pp = NULL; @@ -1266,6 +1265,8 @@ result = zend_call_function(&fci, NULL TSRMLS_CC); + zval_dtor(&fname); + if (result == FAILURE && EG(exception) == NULL) { zval_ptr_dtor(&reflector_ptr); zval_ptr_dtor(&retval_ptr); @@ -1342,27 +1343,27 @@ array_init(return_value); if (modifiers & (ZEND_ACC_ABSTRACT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { - add_next_index_stringl(return_value, "abstract", sizeof("abstract")-1, 1); + add_next_index_ascii_stringl(return_value, "abstract", sizeof("abstract")-1, 1); } if (modifiers & (ZEND_ACC_FINAL | ZEND_ACC_FINAL_CLASS)) { - add_next_index_stringl(return_value, "final", sizeof("final")-1, 1); + add_next_index_ascii_stringl(return_value, "final", sizeof("final")-1, 1); } /* These are mutually exclusive */ switch (modifiers & ZEND_ACC_PPP_MASK) { case ZEND_ACC_PUBLIC: - add_next_index_stringl(return_value, "public", sizeof("public")-1, 1); + add_next_index_ascii_stringl(return_value, "public", sizeof("public")-1, 1); break; case ZEND_ACC_PRIVATE: - add_next_index_stringl(return_value, "private", sizeof("private")-1, 1); + add_next_index_ascii_stringl(return_value, "private", sizeof("private")-1, 1); break; case ZEND_ACC_PROTECTED: - add_next_index_stringl(return_value, "protected", sizeof("protected")-1, 1); + add_next_index_ascii_stringl(return_value, "protected", sizeof("protected")-1, 1); break; } if (modifiers & ZEND_ACC_STATIC) { - add_next_index_stringl(return_value, "static", sizeof("static")-1, 1); + add_next_index_ascii_stringl(return_value, "static", sizeof("static")-1, 1); } } /* }}} */ @@ -1408,7 +1409,7 @@ efree(lcname.v); MAKE_STD_ZVAL(name); ZVAL_TEXT(name, fptr->common.function_name, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); intern->ptr = fptr; intern->free_ptr = 0; intern->ce = NULL; @@ -1427,7 +1428,7 @@ GET_REFLECTION_OBJECT_PTR(fptr); string_init(&str); _function_string(&str, fptr, intern->ce, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -1489,7 +1490,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_function_abstract_ptr, 0); GET_REFLECTION_OBJECT_PTR(fptr); if (fptr->type == ZEND_USER_FUNCTION) { - RETURN_STRING(fptr->op_array.filename, 1); + RETURN_RT_STRING(fptr->op_array.filename, 1); } RETURN_FALSE; } @@ -1537,7 +1538,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_function_abstract_ptr, 0); GET_REFLECTION_OBJECT_PTR(fptr); if (fptr->type == ZEND_USER_FUNCTION && fptr->op_array.doc_comment) { - RETURN_STRINGL(fptr->op_array.doc_comment, fptr->op_array.doc_comment_len, 1); + RETURN_RT_STRINGL(fptr->op_array.doc_comment, fptr->op_array.doc_comment_len, 1); } RETURN_FALSE; } @@ -1790,7 +1791,7 @@ internal = (zend_internal_function *)fptr; if (internal->module) { - RETURN_STRING(internal->module->name, 1); + RETURN_ASCII_STRING(internal->module->name, 1); } else { RETURN_FALSE; } @@ -1924,7 +1925,7 @@ } else { ZVAL_NULL(name); } - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); ref = (parameter_reference*) emalloc(sizeof(parameter_reference)); ref->arg_info = &arg_info[position]; @@ -1949,7 +1950,7 @@ GET_REFLECTION_OBJECT_PTR(param); string_init(&str); _parameter_string(&str, param->fptr, param->arg_info, param->offset, param->required, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -2174,11 +2175,11 @@ zval ztmp; zend_uchar type; + /* FIXME: Unicode support??? */ if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "zt", &classname, &name_str, &name_len, &type) == FAILURE) { if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name_str, &name_len) == FAILURE) { return; } - /* FIXME: Unicode support??? */ if ((tmp = strstr(name_str.s, "::")) == NULL) { zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Invalid method name %s", name_str); return; @@ -2203,7 +2204,7 @@ case IS_UNICODE: if (zend_u_lookup_class(Z_TYPE_P(classname), Z_UNIVAL_P(classname), Z_UNILEN_P(classname), &pce TSRMLS_CC) == FAILURE) { zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, - "Class %v does not exist", Z_UNIVAL_P(classname)); + "Class %R does not exist", Z_TYPE_P(classname), Z_UNIVAL_P(classname)); if (classname == &ztmp) { zval_dtor(&ztmp); } @@ -2231,7 +2232,7 @@ MAKE_STD_ZVAL(classname); ZVAL_TEXTL(classname, ce->name, ce->name_length, 1); - zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); lcname = zend_u_str_case_fold(type, name_str, name_len, 1, &lcname_len); @@ -2245,7 +2246,7 @@ MAKE_STD_ZVAL(name); ZVAL_TEXT(name, mptr->common.function_name, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); intern->ptr = mptr; intern->free_ptr = 0; intern->ce = ce; @@ -2264,7 +2265,7 @@ GET_REFLECTION_OBJECT_PTR(mptr); string_init(&str); _function_string(&str, mptr, intern->ce, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -2650,7 +2651,7 @@ if (argument) { MAKE_STD_ZVAL(classname); ZVAL_TEXTL(classname, Z_OBJCE_P(argument)->name, Z_OBJCE_P(argument)->name_length, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &classname, sizeof(zval *), NULL); intern->ptr = Z_OBJCE_P(argument); if (is_object) { intern->obj = argument; @@ -2666,7 +2667,7 @@ MAKE_STD_ZVAL(classname); ZVAL_TEXTL(classname, (*ce)->name, (*ce)->name_length, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &classname, sizeof(zval *), NULL); intern->ptr = *ce; } @@ -2819,8 +2820,8 @@ zend_hash_get_current_key_ex(&ce->default_properties, &key, &key_len, &num_index, 0, &pos); zend_hash_move_forward_ex(&ce->default_properties, &pos); zend_u_unmangle_property_name(UG(unicode)?IS_UNICODE:IS_STRING, key, key_len-1, &class_name, &prop_name); - /* FIXME: Unicode support??? */ - if (class_name.s && class_name.s[0] != '*' && strcmp(class_name.s, ce->name.s)) { + if (class_name.s && class_name.s[0] != '*' && + (UG(unicode)?u_strcmp(class_name.u, ce->name.u):strcmp(class_name.s, ce->name.s))) { /* filter privates from base classes */ continue; } @@ -2831,7 +2832,7 @@ zval_copy_ctor(prop_copy); INIT_PZVAL(prop_copy); - add_assoc_zval(return_value, prop_name.s, prop_copy); + add_u_assoc_zval(return_value, ZEND_STR_TYPE, prop_name, prop_copy); } } } @@ -2849,7 +2850,7 @@ GET_REFLECTION_OBJECT_PTR(ce); string_init(&str); _class_string(&str, ce, intern->obj, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -2898,7 +2899,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_class_ptr, 0); GET_REFLECTION_OBJECT_PTR(ce); if (ce->type == ZEND_USER_CLASS) { - RETURN_STRING(ce->filename, 1); + RETURN_RT_STRING(ce->filename, 1); } RETURN_FALSE; } @@ -2946,7 +2947,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_class_ptr, 0); GET_REFLECTION_OBJECT_PTR(ce); if (ce->type == ZEND_USER_CLASS && ce->doc_comment) { - RETURN_STRINGL(ce->doc_comment, ce->doc_comment_len, 1); + RETURN_RT_STRINGL(ce->doc_comment, ce->doc_comment_len, 1); } RETURN_FALSE; } @@ -3079,24 +3080,29 @@ { reflection_object *intern; zend_class_entry *ce; - char *name; + zstr name; int name_len; + zend_uchar name_type; zval *property; METHOD_NOTSTATIC(reflection_class_ptr); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &name, &name_len, &name_type) == FAILURE) { return; } GET_REFLECTION_OBJECT_PTR(ce); - if (zend_hash_exists(&ce->properties_info, name, name_len + 1)) { + if (zend_u_hash_exists(&ce->properties_info, name_type, name, name_len + 1)) { RETURN_TRUE; } else { if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property)) { MAKE_STD_ZVAL(property); - ZVAL_STRINGL(property, name, name_len, 1); - if (Z_OBJ_HANDLER_P(intern->obj, has_property)(intern->obj, property, 2 TSRMLS_CC)) { + if (name_type == IS_STRING) { + ZVAL_STRINGL(property, name.s, name_len, 1); + } else { + ZVAL_UNICODEL(property, name.u, name_len, 1); + } + if (Z_OBJ_HANDLER_P(intern->obj, has_property)(intern->obj, property, 0 TSRMLS_CC)) { zval_ptr_dtor(&property); RETURN_TRUE; } @@ -3249,16 +3255,17 @@ { reflection_object *intern; zend_class_entry *ce; - char *name; + zstr name; int name_len; + zend_uchar name_type; METHOD_NOTSTATIC(reflection_class_ptr); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &name, &name_len, &name_type) == FAILURE) { return; } GET_REFLECTION_OBJECT_PTR(ce); - if (zend_hash_exists(&ce->constants_table, name, name_len + 1)) { + if (zend_u_hash_exists(&ce->constants_table, name_type, name, name_len + 1)) { RETURN_TRUE; } else { RETURN_FALSE; @@ -3289,17 +3296,18 @@ reflection_object *intern; zend_class_entry *ce; zval **value; - char *name; + zstr name; int name_len; + zend_uchar name_type; METHOD_NOTSTATIC(reflection_class_ptr); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &name, &name_len, &name_type) == FAILURE) { return; } GET_REFLECTION_OBJECT_PTR(ce); zend_hash_apply_with_argument(&ce->constants_table, (apply_func_arg_t) zval_update_constant, (void*)1 TSRMLS_CC); - if (zend_hash_find(&ce->constants_table, name, name_len + 1, (void **) &value) == FAILURE) { + if (zend_u_hash_find(&ce->constants_table, name_type, name, name_len + 1, (void **) &value) == FAILURE) { RETURN_FALSE; } *return_value = **value; @@ -3741,7 +3749,7 @@ GET_REFLECTION_OBJECT_PTR(ce); if (ce->module) { - RETURN_STRING(ce->module->name, 1); + RETURN_ASCII_STRING(ce->module->name, 1); } else { RETURN_FALSE; } @@ -3838,12 +3846,12 @@ MAKE_STD_ZVAL(classname); ZVAL_TEXTL(classname, ce->name, ce->name_length, 1); - zend_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "class", sizeof("class"), (void **) &classname, sizeof(zval *), NULL); zend_u_unmangle_property_name(UG(unicode)?IS_UNICODE:IS_STRING, property_info->name, property_info->name_length, &class_name, &prop_name); MAKE_STD_ZVAL(propname); ZVAL_TEXT(propname, prop_name, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &propname, sizeof(zval *), NULL); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &propname, sizeof(zval *), NULL); reference = (property_reference*) emalloc(sizeof(property_reference)); reference->ce = ce; @@ -3865,8 +3873,8 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_property_ptr, 0); GET_REFLECTION_OBJECT_PTR(ref); string_init(&str); - _property_string(&str, ref->prop, NULL, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + _property_string(&str, ref->prop, NULL_ZSTR, "" TSRMLS_CC); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -4128,7 +4136,7 @@ METHOD_NOTSTATIC_NUMPARAMS(reflection_property_ptr, 0); GET_REFLECTION_OBJECT_PTR(ref); if (ref->prop->doc_comment) { - RETURN_STRINGL(ref->prop->doc_comment, ref->prop->doc_comment_len, 1); + RETURN_RT_STRINGL(ref->prop->doc_comment, ref->prop->doc_comment_len, 1); } RETURN_FALSE; } @@ -4173,8 +4181,8 @@ } free_alloca(lcname); MAKE_STD_ZVAL(name); - ZVAL_STRING(name, module->name, 1); - zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); + ZVAL_ASCII_STRING(name, module->name, 1); + zend_ascii_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL); intern->ptr = module; intern->free_ptr = 0; intern->ce = NULL; @@ -4193,7 +4201,7 @@ GET_REFLECTION_OBJECT_PTR(module); string_init(&str); _extension_string(&str, module, "" TSRMLS_CC); - RETURN_STRINGL(str.string, str.len - 1, 0); + RETURN_RT_STRINGL(str.string, str.len - 1, ZSTR_AUTOFREE); } /* }}} */ @@ -4220,7 +4228,7 @@ if (module->version == NO_VERSION_YET) { RETURN_NULL(); } else { - RETURN_STRING(module->version, 1); + RETURN_ASCII_STRING(module->version, 1); } } /* }}} */ @@ -4243,14 +4251,14 @@ /* Is there a better way of doing this? */ while (func->fname) { - if (zend_hash_find(EG(function_table), func->fname, strlen(func->fname) + 1, (void**) &fptr) == FAILURE) { + if (zend_ascii_hash_find(EG(function_table), func->fname, strlen(func->fname) + 1, (void**) &fptr) == FAILURE) { zend_error(E_WARNING, "Internal error: Cannot find extension function %s in global function table", func->fname); continue; } ALLOC_ZVAL(function); reflection_function_factory(fptr, function TSRMLS_CC); - add_assoc_zval_ex(return_value, func->fname, strlen(func->fname)+1, function); + add_ascii_assoc_zval_ex(return_value, func->fname, strlen(func->fname)+1, function); func++; } } @@ -4264,12 +4272,13 @@ int number = va_arg(args, int); if (number == constant->module_number) { + TSRMLS_FETCH(); + ALLOC_ZVAL(const_val); *const_val = constant->value; zval_copy_ctor(const_val); INIT_PZVAL(const_val); - /* FIXME: Unicode support???*/ - add_assoc_zval_ex(retval, constant->name.s, constant->name_len, const_val); + add_u_assoc_zval_ex(retval, ZEND_STR_TYPE, constant->name, constant->name_len, const_val); } return 0; } @@ -4296,10 +4305,12 @@ int number = va_arg(args, int); if (number == ini_entry->module_number) { + TSRMLS_FETCH(); + if (ini_entry->value) { - add_assoc_stringl(retval, ini_entry->name, ini_entry->value, ini_entry->value_length, 1); + add_ascii_assoc_rt_stringl(retval, ini_entry->name, ini_entry->value, ini_entry->value_length, 1); } else { - add_assoc_null(retval, ini_entry->name); + add_ascii_assoc_null(retval, ini_entry->name); } } return ZEND_HASH_APPLY_KEEP; @@ -4333,8 +4344,7 @@ if (add_reflection_class) { ALLOC_ZVAL(zclass); zend_reflection_class_factory(*pce, zclass TSRMLS_CC); - /* FIXME: Unicode support??? */ - add_assoc_zval_ex(class_array, (*pce)->name.s, (*pce)->name_length + 1, zclass); + add_u_assoc_zval_ex(class_array, ZEND_STR_TYPE, (*pce)->name, (*pce)->name_length + 1, zclass); } else { add_next_index_textl(class_array, (*pce)->name, (*pce)->name_length, 1); } @@ -4419,7 +4429,7 @@ dep->rel ? dep->rel : "", dep->version ? " " : "", dep->version ? dep->version : ""); - add_assoc_stringl(return_value, dep->name, relation, len, 0); + add_ascii_assoc_ascii_stringl(return_value, dep->name, relation, len, ZSTR_AUTOFREE); dep++; } } @@ -4920,7 +4930,7 @@ php_info_print_table_start(); php_info_print_table_header(2, "Reflection", "enabled"); - php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.261 2006/10/11 15:51:17 tony2001 Exp $"); + php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.262 2006/10/17 11:11:45 dmitry Exp $"); php_info_print_table_end(); } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/005.phpt?r1=1.4&r2=1.5&diff_format=u Index: php-src/ext/reflection/tests/005.phpt diff -u php-src/ext/reflection/tests/005.phpt:1.4 php-src/ext/reflection/tests/005.phpt:1.5 --- php-src/ext/reflection/tests/005.phpt:1.4 Tue Sep 19 12:06:49 2006 +++ php-src/ext/reflection/tests/005.phpt Tue Oct 17 11:11:45 2006 @@ -54,3 +54,10 @@ bool(false) string(22) "* Comment for A::baz()" ===DONE=== +--UEXPECT-- +unicode(19) "Comment for class A" +unicode(15) "Method A::bla()" +bool(false) +bool(false) +unicode(22) "* Comment for A::baz()" +===DONE=== http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/009.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/reflection/tests/009.phpt diff -u php-src/ext/reflection/tests/009.phpt:1.1 php-src/ext/reflection/tests/009.phpt:1.2 --- php-src/ext/reflection/tests/009.phpt:1.1 Wed Oct 11 15:51:17 2006 +++ php-src/ext/reflection/tests/009.phpt Tue Oct 17 11:11:45 2006 @@ -26,7 +26,7 @@ echo "Done\n"; ?> ---EXPECTF-- +--EXPECT-- string(20) "Invalid method name " string(21) "Invalid method name 1" string(21) "Class does not exist" @@ -37,3 +37,14 @@ string(66) "The parameter class is expected to be either a string or an object" string(21) "Class does not exist" Done +--UEXPECT-- +unicode(20) "Invalid method name " +unicode(21) "Invalid method name 1" +unicode(21) "Class does not exist" +unicode(22) "Class a does not exist" +unicode(21) "Class does not exist" +unicode(22) "Class a does not exist" +unicode(21) "Class does not exist" +unicode(66) "The parameter class is expected to be either a string or an object" +unicode(21) "Class does not exist" +Done http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/010.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/010.phpt +++ php-src/ext/reflection/tests/010.phpt --TEST-- ReflectionMethod::__toString() tests (overriden method) --FILE-- <?php class Foo { function func() { } } class Bar extends Foo { function func() { } } $m = new ReflectionMethod("Bar::func"); echo $m; ?> --EXPECTF-- Method [ <user, overwrites Foo, prototype Foo> public method func ] { @@ %s010.php 7 - 8 } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/011.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/011.phpt +++ php-src/ext/reflection/tests/011.phpt --TEST-- ReflectionExtension::getClasses() --FILE-- <?php $ext = new ReflectionExtension("reflection"); $classes = $ext->getClasses(); echo $classes["ReflectionException"]->getName(); ?> --EXPECT-- ReflectionException http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/012.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/012.phpt +++ php-src/ext/reflection/tests/012.phpt --TEST-- ReflectionClass::getDefaultProperties() --FILE-- <?php class Foo { public $test = "ok"; } $class = new ReflectionClass("Foo"); $props = $class->getDefaultProperties(); echo $props["test"]; ?> --EXPECT-- ok http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/013.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/013.phpt +++ php-src/ext/reflection/tests/013.phpt --TEST-- ReflectionExtension::getFunctions() --FILE-- <?php $ext = new ReflectionExtension("standard"); $funcs = $ext->getFunctions(); echo $funcs["sleep"]->getName(); ?> --EXPECT-- sleep http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/014.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/014.phpt +++ php-src/ext/reflection/tests/014.phpt --TEST-- ReflectionExtension::getConstants() --FILE-- <?php $ext = new ReflectionExtension("standard"); $consts = $ext->getConstants(); var_dump($consts["CONNECTION_NORMAL"]); ?> --EXPECT-- int(0) http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/015.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/015.phpt +++ php-src/ext/reflection/tests/015.phpt --TEST-- ReflectionExtension::getINIEntries() --INI-- user_agent=php --FILE-- <?php $ext = new ReflectionExtension("standard"); $inis = $ext->getINIEntries(); var_dump($inis["user_agent"]); ?> --EXPECT-- string(3) "php" --UEXPECT-- unicode(3) "php" http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/016.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/016.phpt +++ php-src/ext/reflection/tests/016.phpt --TEST-- ReflectionExtension::getDependencies() --SKIPIF-- <?php if (!extension_loaded("xml")) { die('skip xml extension not available'); } ?> --FILE-- <?php $ext = new ReflectionExtension("xml"); $deps = $ext->getDependencies(); var_dump($deps); ?> --EXPECT-- array(1) { ["libxml"]=> string(8) "Required" } --UEXPECT-- array(1) { [u"libxml"]=> unicode(8) "Required" } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/017.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/017.phpt +++ php-src/ext/reflection/tests/017.phpt --TEST-- ReflectionClass::__toString() (constants) --FILE-- <?php class Foo { const test = "ok"; } $class = new ReflectionClass("Foo"); echo $class; ?> --EXPECTF-- Class [ <user> class Foo ] { @@ %s017.php 2-4 - Constants [1] { Constant [ string test ] { ok } } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [0] { } } --UEXPECTF-- Class [ <user> class Foo ] { @@ %s017.php 2-4 - Constants [1] { Constant [ Unicode string test ] { ok } } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [0] { } } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/018.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/018.phpt +++ php-src/ext/reflection/tests/018.phpt --TEST-- Reflection::getModifierNames --FILE-- <?php var_dump(Reflection::getModifierNames(ReflectionMethod::IS_FINAL | ReflectionMethod::IS_PROTECTED)); ?> --EXPECT-- array(2) { [0]=> string(5) "final" [1]=> string(9) "protected" } --UEXPECT-- array(2) { [0]=> unicode(5) "final" [1]=> unicode(9) "protected" } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/019.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/019.phpt +++ php-src/ext/reflection/tests/019.phpt --TEST-- ReflectionFunction::getExtensionName --FILE-- <?php $f = new ReflectionFunction("sleep"); var_dump($f->getExtensionName()); ?> --EXPECT-- string(8) "standard" --UEXPECT-- unicode(8) "standard" http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/020.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/020.phpt +++ php-src/ext/reflection/tests/020.phpt --TEST-- ReflectionObject::hasProperty --FILE-- <?php class Foo { public $p1; protected $p2; private $p3; function __isset($name) { var_dump($name); return false; } } $obj = new ReflectionObject(new Foo()); var_dump($obj->hasProperty("p1")); var_dump($obj->hasProperty("p2")); var_dump($obj->hasProperty("p3")); var_dump($obj->hasProperty("p4")); ?> --EXPECT-- bool(true) bool(true) bool(true) string(2) "p4" bool(false) --UEXPECT-- bool(true) bool(true) bool(true) unicode(2) "p4" bool(false) http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/021.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/021.phpt +++ php-src/ext/reflection/tests/021.phpt --TEST-- ReflectionClass::hasConstant --FILE-- <?php class Foo { const c1 = 1; } $class = new ReflectionClass("Foo"); var_dump($class->hasConstant("c1")); var_dump($class->hasConstant("c2")); ?> --EXPECT-- bool(true) bool(false) http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/022.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/022.phpt +++ php-src/ext/reflection/tests/022.phpt --TEST-- ReflectionClass::getConstant --FILE-- <?php class Foo { const c1 = 1; } $class = new ReflectionClass("Foo"); var_dump($class->getConstant("c1")); var_dump($class->getConstant("c2")); ?> --EXPECT-- int(1) bool(false) http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/023.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/023.phpt +++ php-src/ext/reflection/tests/023.phpt --TEST-- ReflectionClass::getDefaultProperties (filtering parent privates) --FILE-- <?php class C1 { private $p1 = 1; protected $p2 = 2; public $p3 = 3; } class C2 extends C1 { private $p4 = 4; protected $p5 = 5; public $p6 = 6; } $class = new ReflectionClass("C2"); var_dump($class->getDefaultProperties()); ?> --EXPECT-- array(5) { ["p4"]=> int(4) ["p5"]=> int(5) ["p6"]=> int(6) ["p2"]=> int(2) ["p3"]=> int(3) } --UEXPECT-- array(5) { [u"p4"]=> int(4) [u"p5"]=> int(5) [u"p6"]=> int(6) [u"p2"]=> int(2) [u"p3"]=> int(3) } http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/024.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/024.phpt +++ php-src/ext/reflection/tests/024.phpt --TEST-- ReflectionObject::__toString (filtering privates/protected dynamic properties) --FILE-- <?php class C1 { private $p1 = 1; protected $p2 = 2; public $p3 = 3; } $obj = new ReflectionObject(new C1()); echo $obj; ?> --EXPECTF-- Object of class [ <user> class C1 ] { @@ %s024.php 2-6 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [3] { Property [ <default> private $p1 ] Property [ <default> protected $p2 ] Property [ <default> public $p3 ] } - Dynamic properties [1] { Property [ <dynamic> public $p3 ] } - Methods [0] { } }