mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Fixed bug #61025 (__invoke() visibility not honored)
This commit is contained in:
parent
ac73ca6db4
commit
01049ca7ae
7 changed files with 38 additions and 3 deletions
1
NEWS
1
NEWS
|
@ -6,6 +6,7 @@ PHP NEWS
|
||||||
07 Mar 2013, PHP 5.5.0 Alpha 6
|
07 Mar 2013, PHP 5.5.0 Alpha 6
|
||||||
|
|
||||||
- Core:
|
- Core:
|
||||||
|
. Fixed bug #61025 (__invoke() visibility not honored). (Laruence)
|
||||||
. Fixed bug #49348 (Uninitialized ++$foo->bar; does not cause a notice).
|
. Fixed bug #49348 (Uninitialized ++$foo->bar; does not cause a notice).
|
||||||
(Stas)
|
(Stas)
|
||||||
|
|
||||||
|
|
1
NEWS-5.5
1
NEWS-5.5
|
@ -3,6 +3,7 @@ PHP NEWS
|
||||||
?? ??? 201?, PHP 5.5.0 Beta 1
|
?? ??? 201?, PHP 5.5.0 Beta 1
|
||||||
|
|
||||||
- Core:
|
- Core:
|
||||||
|
. Fixed bug #61025 (__invoke() visibility not honored). (Laruence)
|
||||||
. Fixed bug #49348 (Uninitialized ++$foo->bar; does not cause a notice).
|
. Fixed bug #49348 (Uninitialized ++$foo->bar; does not cause a notice).
|
||||||
(Stas)
|
(Stas)
|
||||||
|
|
||||||
|
|
27
Zend/tests/bug61025.phpt
Normal file
27
Zend/tests/bug61025.phpt
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
--TEST--
|
||||||
|
Bug #61025 (__invoke() visibility not honored)
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
Interface InvokeAble {
|
||||||
|
static function __invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
class Bar {
|
||||||
|
private function __invoke() {
|
||||||
|
return __CLASS__;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$b = new Bar;
|
||||||
|
echo $b();
|
||||||
|
|
||||||
|
echo $b->__invoke();
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
Warning: The magic method __invoke() must have public visibility and cannot be static in %sbug61025.php on line %d
|
||||||
|
|
||||||
|
Warning: The magic method __invoke() must have public visibility and cannot be static in %sbug61025.php on line %d
|
||||||
|
Bar
|
||||||
|
Fatal error: Call to private method Bar::__invoke() from context '' in %sbug61025.php on line %d
|
|
@ -291,7 +291,6 @@ static zend_object_value zend_closure_clone(zval *zobject TSRMLS_DC) /* {{{ */
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
|
||||||
int zend_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC) /* {{{ */
|
int zend_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC) /* {{{ */
|
||||||
{
|
{
|
||||||
zend_closure *closure;
|
zend_closure *closure;
|
||||||
|
|
|
@ -24,8 +24,6 @@
|
||||||
|
|
||||||
BEGIN_EXTERN_C()
|
BEGIN_EXTERN_C()
|
||||||
|
|
||||||
#define ZEND_INVOKE_FUNC_NAME "__invoke"
|
|
||||||
|
|
||||||
void zend_register_closure_ce(TSRMLS_D);
|
void zend_register_closure_ce(TSRMLS_D);
|
||||||
|
|
||||||
extern ZEND_API zend_class_entry *zend_ce_closure;
|
extern ZEND_API zend_class_entry *zend_ce_closure;
|
||||||
|
|
|
@ -1621,6 +1621,10 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
|
||||||
if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
|
if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
|
||||||
zend_error(E_WARNING, "The magic method __toString() must have public visibility and cannot be static");
|
zend_error(E_WARNING, "The magic method __toString() must have public visibility and cannot be static");
|
||||||
}
|
}
|
||||||
|
} else if ((name_len == sizeof(ZEND_INVOKE_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1))) {
|
||||||
|
if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
|
||||||
|
zend_error(E_WARNING, "The magic method __invoke() must have public visibility and cannot be static");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char *class_lcname;
|
char *class_lcname;
|
||||||
|
@ -1677,6 +1681,10 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n
|
||||||
zend_error(E_WARNING, "The magic method __toString() must have public visibility and cannot be static");
|
zend_error(E_WARNING, "The magic method __toString() must have public visibility and cannot be static");
|
||||||
}
|
}
|
||||||
CG(active_class_entry)->__tostring = (zend_function *) CG(active_op_array);
|
CG(active_class_entry)->__tostring = (zend_function *) CG(active_op_array);
|
||||||
|
} else if ((name_len == sizeof(ZEND_INVOKE_FUNC_NAME)-1) && (!memcmp(lcname, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1))) {
|
||||||
|
if (fn_flags & ((ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC) ^ ZEND_ACC_PUBLIC)) {
|
||||||
|
zend_error(E_WARNING, "The magic method __invoke() must have public visibility and cannot be static");
|
||||||
|
}
|
||||||
} else if (!(fn_flags & ZEND_ACC_STATIC)) {
|
} else if (!(fn_flags & ZEND_ACC_STATIC)) {
|
||||||
CG(active_op_array)->fn_flags |= ZEND_ACC_ALLOW_STATIC;
|
CG(active_op_array)->fn_flags |= ZEND_ACC_ALLOW_STATIC;
|
||||||
}
|
}
|
||||||
|
|
|
@ -856,6 +856,7 @@ END_EXTERN_C()
|
||||||
#define ZEND_CALLSTATIC_FUNC_NAME "__callstatic"
|
#define ZEND_CALLSTATIC_FUNC_NAME "__callstatic"
|
||||||
#define ZEND_TOSTRING_FUNC_NAME "__tostring"
|
#define ZEND_TOSTRING_FUNC_NAME "__tostring"
|
||||||
#define ZEND_AUTOLOAD_FUNC_NAME "__autoload"
|
#define ZEND_AUTOLOAD_FUNC_NAME "__autoload"
|
||||||
|
#define ZEND_INVOKE_FUNC_NAME "__invoke"
|
||||||
|
|
||||||
/* The following constants may be combined in CG(compiler_options)
|
/* The following constants may be combined in CG(compiler_options)
|
||||||
* to change the default compiler behavior */
|
* to change the default compiler behavior */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue