]> granicus.if.org Git - php/commitdiff
Fixed bug #43332 (self and parent as type hint in namespace)
authorDmitry Stogov <dmitry@php.net>
Mon, 3 Dec 2007 14:15:55 +0000 (14:15 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 3 Dec 2007 14:15:55 +0000 (14:15 +0000)
Zend/tests/bug43332_1.phpt [new file with mode: 0644]
Zend/tests/bug43332_2.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/bug43332_1.phpt b/Zend/tests/bug43332_1.phpt
new file mode 100644 (file)
index 0000000..ef32162
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Bug #43332.1 (self and parent as type hint in namespace)
+--FILE--
+<?php
+namespace foobar;
+
+class foo {
+  public function bar(self $a) { }
+}
+
+$foo = new foo;
+$foo->bar($foo); // Ok!
+$foo->bar(new stdclass); // Error, ok!
+--EXPECTF--
+Catchable fatal error: Argument 1 passed to foobar::foo::bar() must be an instance of foobar::foo, instance of stdClass given, called in %sbug43332_1.php on line 10 and defined in %sbug43332_1.php on line 5
diff --git a/Zend/tests/bug43332_2.phpt b/Zend/tests/bug43332_2.phpt
new file mode 100644 (file)
index 0000000..916f6fa
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Bug #43332.2 (self and parent as type hint in namespace)
+--FILE--
+<?php
+namespace foobar;
+
+class foo {
+  public function bar(::self $a) { }
+}
+
+$foo = new foo;
+$foo->bar($foo); // Ok!
+$foo->bar(new stdclass); // Error, ok!
+--EXPECTF--
+Fatal error: '::self' is a wrong class name in %sbug43332_2.php on line 5
index 656d3758f7f7c2c70349e8e13147b88f198a9217..f9c5305f507ae7b1f50182363c99235c6e5e5806 100644 (file)
@@ -1436,7 +1436,9 @@ void zend_do_receive_arg(zend_uchar op, znode *var, znode *offset, znode *initia
        if (class_type->op_type != IS_UNUSED) {
                cur_arg_info->allow_null = 0;
                if (Z_TYPE(class_type->u.constant) == IS_STRING || Z_TYPE(class_type->u.constant) == IS_UNICODE) {
-                       zend_resolve_class_name(class_type, &opline->extended_value, 1 TSRMLS_CC);
+                       if (ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_TYPE(class_type->u.constant), Z_UNIVAL(class_type->u.constant), Z_UNILEN(class_type->u.constant))) {
+                               zend_resolve_class_name(class_type, &opline->extended_value, 1 TSRMLS_CC);
+                       }
                        cur_arg_info->class_name = Z_UNIVAL(class_type->u.constant);
                        cur_arg_info->class_name_len = Z_UNILEN(class_type->u.constant);
                        if (op == ZEND_RECV_INIT) {
@@ -1665,6 +1667,9 @@ void zend_resolve_class_name(znode *class_name, ulong *fetch_type, int check_ns_
                        Z_USTRVAL(class_name->u.constant) = eurealloc(
                                Z_USTRVAL(class_name->u.constant),
                                Z_USTRLEN(class_name->u.constant) + 1);
+                       if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(Z_TYPE(class_name->u.constant), Z_UNIVAL(class_name->u.constant), Z_UNILEN(class_name->u.constant))) {
+                               zend_error(E_COMPILE_ERROR, "'::%R' is a wrong class name", Z_TYPE(class_name->u.constant), Z_UNIVAL(class_name->u.constant));
+                       }
                } else if (Z_TYPE(class_name->u.constant) == IS_STRING &&
                           Z_STRVAL(class_name->u.constant)[0] == ':') {
                    /* The STRING name has "::" prefix */
@@ -1673,6 +1678,9 @@ void zend_resolve_class_name(znode *class_name, ulong *fetch_type, int check_ns_
                        Z_STRVAL(class_name->u.constant) = erealloc(
                                Z_STRVAL(class_name->u.constant),
                                Z_STRLEN(class_name->u.constant) + 1);
+                       if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(Z_TYPE(class_name->u.constant), Z_UNIVAL(class_name->u.constant), Z_UNILEN(class_name->u.constant))) {
+                               zend_error(E_COMPILE_ERROR, "'::%R' is a wrong class name", Z_TYPE(class_name->u.constant), Z_UNIVAL(class_name->u.constant));
+                       }
                } else if (CG(current_import)) {
                        if (Z_TYPE(class_name->u.constant) == IS_UNICODE) {
                                len = compound.u - Z_USTRVAL(class_name->u.constant);