]> granicus.if.org Git - php/commitdiff
Support for old-style constructors in namespaces
authorDmitry Stogov <dmitry@php.net>
Mon, 5 May 2008 09:44:07 +0000 (09:44 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 5 May 2008 09:44:07 +0000 (09:44 +0000)
Zend/tests/ns_063.phpt [new file with mode: 0644]
Zend/zend_API.c
Zend/zend_compile.c

diff --git a/Zend/tests/ns_063.phpt b/Zend/tests/ns_063.phpt
new file mode 100644 (file)
index 0000000..1be0009
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+063: Support for old-style constructors in namesapces
+--FILE--
+<?php
+namespace Foo;
+class Bar {
+       function Bar() {
+               echo "ok\n";
+       }
+}
+new Bar();
+--EXPECT--
+ok
index c386b66513e2a9db236a088447a09b8fd5f78cfb..aa300fc1e276d02fcd9204c78d8425b87b29570c 100644 (file)
@@ -2118,7 +2118,23 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
        internal_function->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) {
index a8ac9ebde19e3e2d70b2f9558265472a7d5746ae..1a0fc5e323d78ef9322d4ea387609d359beb5ba1 100644 (file)
@@ -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);