mirror of
https://github.com/php/php-src.git
synced 2024-12-03 23:05:57 +08:00
Fixed bug #43332 (self and parent as type hint in namespace)
This commit is contained in:
parent
678c532eee
commit
4de1707062
15
Zend/tests/bug43332_1.phpt
Normal file
15
Zend/tests/bug43332_1.phpt
Normal file
@ -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
|
15
Zend/tests/bug43332_2.phpt
Normal file
15
Zend/tests/bug43332_2.phpt
Normal file
@ -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
|
@ -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) {
|
if (class_type->op_type != IS_UNUSED) {
|
||||||
cur_arg_info->allow_null = 0;
|
cur_arg_info->allow_null = 0;
|
||||||
if (Z_TYPE(class_type->u.constant) == IS_STRING || Z_TYPE(class_type->u.constant) == IS_UNICODE) {
|
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 = Z_UNIVAL(class_type->u.constant);
|
||||||
cur_arg_info->class_name_len = Z_UNILEN(class_type->u.constant);
|
cur_arg_info->class_name_len = Z_UNILEN(class_type->u.constant);
|
||||||
if (op == ZEND_RECV_INIT) {
|
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) = eurealloc(
|
||||||
Z_USTRVAL(class_name->u.constant),
|
Z_USTRVAL(class_name->u.constant),
|
||||||
Z_USTRLEN(class_name->u.constant) + 1);
|
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 &&
|
} else if (Z_TYPE(class_name->u.constant) == IS_STRING &&
|
||||||
Z_STRVAL(class_name->u.constant)[0] == ':') {
|
Z_STRVAL(class_name->u.constant)[0] == ':') {
|
||||||
/* The STRING name has "::" prefix */
|
/* 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) = erealloc(
|
||||||
Z_STRVAL(class_name->u.constant),
|
Z_STRVAL(class_name->u.constant),
|
||||||
Z_STRLEN(class_name->u.constant) + 1);
|
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)) {
|
} else if (CG(current_import)) {
|
||||||
if (Z_TYPE(class_name->u.constant) == IS_UNICODE) {
|
if (Z_TYPE(class_name->u.constant) == IS_UNICODE) {
|
||||||
len = compound.u - Z_USTRVAL(class_name->u.constant);
|
len = compound.u - Z_USTRVAL(class_name->u.constant);
|
||||||
|
Loading…
Reference in New Issue
Block a user