cvs: ZendEngine2 / zend_API.c php-src/ext/standard type.c php-src/ext/standard/tests/general_functions bug47857.phpt is_callable_basic2.phpt
[email protected] ("Dmitry Stogov") Thu, 02 Apr 2009 09:56:53 -0000
| Newsgroups | php.zend-engine.cvs |
|---|---|
| Message-ID | <cvsdmitry1238666213@cvsserver> |
dmitry Thu Apr 2 09:56:53 2009 UTC
Modified files:
/php-src/ext/standard type.c
/php-src/ext/standard/tests/general_functions bug47857.phpt
is_callable_basic2.phpt
/ZendEngine2 zend_API.c
Log:
Fixed bug #47851 (is_callable throws fatal error)
dmitry-20090402095653.txt
(text/plain, 9 KB)
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/type.c?r1=1.61&r2=1.62&diff_format=u
Index: php-src/ext/standard/type.c
diff -u php-src/ext/standard/type.c:1.61 php-src/ext/standard/type.c:1.62
--- php-src/ext/standard/type.c:1.61 Thu Mar 26 20:02:29 2009
+++ php-src/ext/standard/type.c Thu Apr 2 09:56:53 2009
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: type.c,v 1.61 2009/03/26 20:02:29 felipe Exp $ */
+/* $Id: type.c,v 1.62 2009/04/02 09:56:53 dmitry Exp $ */
#include "php.h"
#include "php_incomplete_class.h"
@@ -433,20 +433,28 @@
{
zval *var, **callable_name = NULL;
zval name;
+ char *error;
zend_bool retval;
zend_bool syntax_only = 0;
+ int check_flags = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|bZ", &var,
&syntax_only, &callable_name) == FAILURE) {
return;
}
- syntax_only = syntax_only ? IS_CALLABLE_CHECK_SYNTAX_ONLY : 0;
+ if (syntax_only) {
+ check_flags |= IS_CALLABLE_CHECK_SYNTAX_ONLY;
+ }
if (ZEND_NUM_ARGS() > 2) {
- retval = zend_is_callable(var, syntax_only, &name TSRMLS_CC);
+ retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, &error TSRMLS_CC);
REPLACE_ZVAL_VALUE(callable_name, &name, 0);
} else {
- retval = zend_is_callable(var, syntax_only, NULL TSRMLS_CC);
+ retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error TSRMLS_CC);
+ }
+ if (error) {
+ /* ignore errors */
+ efree(error);
}
RETURN_BOOL(retval);
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/bug47857.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/ext/standard/tests/general_functions/bug47857.phpt
diff -u /dev/null php-src/ext/standard/tests/general_functions/bug47857.phpt:1.2
--- /dev/null Thu Apr 2 09:56:53 2009
+++ php-src/ext/standard/tests/general_functions/bug47857.phpt Thu Apr 2 09:56:53 2009
@@ -0,0 +1,23 @@
+--TEST--
+Bug #47851 (is_callable throws fatal error)
+--FILE--
+<?php
+class foo {
+ function bar() {
+ echo "ok\n";
+ }
+}
+var_dump(is_callable(array('foo','bar')));
+foo::bar();
+var_dump(is_callable(array('Exception','getMessage')));
+Exception::getMessage();
+?>
+--EXPECTF--
+bool(true)
+
+Strict Standards: Non-static method foo::bar() should not be called statically in %sbug47857.php on line %d
+ok
+bool(false)
+
+Fatal error: Non-static method Exception::getMessage() cannot be called statically in %sbug47857.php on line %d
+
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/is_callable_basic2.phpt?r1=1.2&r2=1.3&diff_format=u
Index: php-src/ext/standard/tests/general_functions/is_callable_basic2.phpt
diff -u php-src/ext/standard/tests/general_functions/is_callable_basic2.phpt:1.2 php-src/ext/standard/tests/general_functions/is_callable_basic2.phpt:1.3
--- php-src/ext/standard/tests/general_functions/is_callable_basic2.phpt:1.2 Sun Jan 25 22:16:37 2009
+++ php-src/ext/standard/tests/general_functions/is_callable_basic2.phpt Thu Apr 2 09:56:53 2009
@@ -210,17 +210,11 @@
bool(false)
object_class::func
-- Innerloop iteration 10 of Outerloop iteration 1 --
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
object_class::foo1
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
object_class::foo1
--- Outerloop iteration 2 ---
@@ -297,17 +291,11 @@
bool(false)
no_member_class::func
-- Innerloop iteration 10 of Outerloop iteration 2 --
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
object_class::foo1
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
object_class::foo1
--- Outerloop iteration 3 ---
@@ -384,17 +372,11 @@
bool(true)
contains_object_class::func
-- Innerloop iteration 10 of Outerloop iteration 3 --
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
object_class::foo1
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
object_class::foo1
--- Outerloop iteration 4 ---
@@ -471,17 +453,11 @@
bool(true)
contains_object_class::func
-- Innerloop iteration 10 of Outerloop iteration 4 --
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
object_class::foo1
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
object_class::foo1
--- Outerloop iteration 5 ---
@@ -558,17 +534,11 @@
bool(false)
object_class::func
-- Innerloop iteration 10 of Outerloop iteration 5 --
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
object_class::foo1
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
object_class::foo1
--- Outerloop iteration 6 ---
@@ -645,17 +615,11 @@
bool(false)
no_member_class::func
-- Innerloop iteration 10 of Outerloop iteration 6 --
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
object_class::foo1
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
object_class::foo1
--- Outerloop iteration 7 ---
@@ -732,17 +696,11 @@
bool(false)
object_class::func
-- Innerloop iteration 10 of Outerloop iteration 7 --
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
object_class::foo1
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
object_class::foo1
--- Outerloop iteration 8 ---
@@ -819,17 +777,11 @@
bool(false)
Array
-- Innerloop iteration 10 of Outerloop iteration 8 --
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
bool(true)
object_class::foo1
-
-Strict Standards: Non-static method object_class::foo1() should not be called statically in %s on line %d
bool(true)
object_class::foo1
===DONE===
\ No newline at end of file
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_API.c?r1=1.498&r2=1.499&diff_format=u
Index: ZendEngine2/zend_API.c
diff -u ZendEngine2/zend_API.c:1.498 ZendEngine2/zend_API.c:1.499
--- ZendEngine2/zend_API.c:1.498 Thu Mar 26 20:01:38 2009
+++ ZendEngine2/zend_API.c Thu Apr 2 09:56:53 2009
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_API.c,v 1.498 2009/03/26 20:01:38 felipe Exp $ */
+/* $Id: zend_API.c,v 1.499 2009/04/02 09:56:53 dmitry Exp $ */
#include "zend.h"
#include "zend_execute.h"
@@ -2927,12 +2927,18 @@
fcc->object_ptr = EG(This);
if (error) {
zend_spprintf(error, 0, "non-static method %v::%v() %s be called statically, assuming $this from compatible context %v", fcc->calling_scope->name, fcc->function_handler->common.function_name, verb, Z_OBJCE_P(EG(This))->name);
+ if (severity == E_ERROR) {
+ retval = 0;
+ }
} else if (retval) {
zend_error(severity, "Non-static method %v::%v() %s be called statically, assuming $this from compatible context %v", fcc->calling_scope->name, fcc->function_handler->common.function_name, verb, Z_OBJCE_P(EG(This))->name);
}
} else {
if (error) {
zend_spprintf(error, 0, "non-static method %v::%v() %s be called statically", fcc->calling_scope->name, fcc->function_handler->common.function_name, verb);
+ if (severity == E_ERROR) {
+ retval = 0;
+ }
} else if (retval) {
zend_error(severity, "Non-static method %v::%v() %s be called statically", fcc->calling_scope->name, fcc->function_handler->common.function_name, verb);
}