From: Dmitry Stogov Date: Mon, 5 May 2008 09:44:07 +0000 (+0000) Subject: Support for old-style constructors in namespaces X-Git-Tag: RELEASE_2_0_0b1~90 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a0f5a72a8afef8282ad5bf0c5e720fdf70f0d0cd;p=php Support for old-style constructors in namespaces --- diff --git a/Zend/tests/ns_063.phpt b/Zend/tests/ns_063.phpt new file mode 100644 index 0000000000..1be000983f --- /dev/null +++ b/Zend/tests/ns_063.phpt @@ -0,0 +1,13 @@ +--TEST-- +063: Support for old-style constructors in namesapces +--FILE-- +module = EG(current_module); if (scope) { - lc_class_name = zend_u_str_case_fold(ZEND_STR_TYPE, scope->name, scope->name_length, 0, &lc_class_name_len); + lc_class_name_len = scope->name_length; + if (UG(unicode)) { + if ((lc_class_name.u = u_memrchr(scope->name.u, ':', lc_class_name_len))) { + lc_class_name.u++; + lc_class_name_len -= (lc_class_name.u - scope->name.u); + } else { + lc_class_name = scope->name; + } + } else { + if ((lc_class_name.s = zend_memrchr(scope->name.s, ':', lc_class_name_len))) { + lc_class_name.s++; + lc_class_name_len -= (lc_class_name.s - scope->name.s); + } else { + lc_class_name = scope->name; + } + } + lc_class_name = zend_u_str_case_fold(ZEND_STR_TYPE, lc_class_name, lc_class_name_len, 0, &lc_class_name_len); } while (ptr->fname) { diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a8ac9ebde1..1a0fc5e323 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1238,9 +1238,6 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n op_array.line_start = zend_get_compiled_lineno(TSRMLS_C); if (is_method) { - zstr short_class_name = CG(active_class_entry)->name; - unsigned int short_class_name_length = CG(active_class_entry)->name_length; - if (zend_u_hash_add(&CG(active_class_entry)->function_table, Z_TYPE(function_name->u.constant), lcname, lcname_len+1, &op_array, sizeof(zend_op_array), (void **) &CG(active_op_array)) == FAILURE) { zend_op_array *child_op_array, *parent_op_array; if (CG(active_class_entry)->parent @@ -1263,10 +1260,31 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n } if (!(CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE)) { - short_class_name = zend_u_str_case_fold(UG(unicode)?IS_UNICODE:IS_STRING, CG(active_class_entry)->name, short_class_name_length, 0, &short_class_name_length); + zstr short_class_name; + unsigned int short_class_name_length; + zstr short_class_lcname; + + if (UG(unicode)) { + if ((short_class_name.u = u_memrchr(CG(active_class_entry)->name.u, ':', CG(active_class_entry)->name_length))) { + short_class_name.u++; + short_class_name_length = CG(active_class_entry)->name_length - (short_class_name.u - CG(active_class_entry)->name.u); + } else { + short_class_name = CG(active_class_entry)->name; + short_class_name_length = CG(active_class_entry)->name_length; + } + } else { + if ((short_class_name.s = zend_memrchr(CG(active_class_entry)->name.s, ':', CG(active_class_entry)->name_length))) { + short_class_name.s++; + short_class_name_length = CG(active_class_entry)->name_length - (short_class_name.s - CG(active_class_entry)->name.s); + } else { + short_class_name = CG(active_class_entry)->name; + short_class_name_length = CG(active_class_entry)->name_length; + } + } + short_class_lcname = zend_u_str_case_fold(UG(unicode)?IS_UNICODE:IS_STRING, short_class_name, short_class_name_length, 0, &short_class_name_length); /* Improve after RC: cache the lowercase class name */ - if ((short_class_name_length == name_len) && (!memcmp(short_class_name.v, lcname.v, UG(unicode)?UBYTES(lcname_len):lcname_len))) { + if ((short_class_name_length == name_len) && (!memcmp(short_class_lcname.v, lcname.v, UG(unicode)?UBYTES(lcname_len):lcname_len))) { if (CG(active_class_entry)->constructor) { zend_error(E_STRICT, "Redefining already defined constructor for class %v", CG(active_class_entry)->name); } else { @@ -1298,7 +1316,7 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n } else if (!(fn_flags & ZEND_ACC_STATIC)) { CG(active_op_array)->fn_flags |= ZEND_ACC_ALLOW_STATIC; } - efree(short_class_name.v); + efree(short_class_lcname.v); } efree(lcname.v);