cvs: ZendEngine2(PHP_5_2) / zend_compile.c zend_object_handlers.c /tests bug37632.phpt
| From: | Marcus Boerger | Date: | Mon, 29 May 2006 20:06:44 +0000 |
| Subject: | cvs: ZendEngine2(PHP_5_2) / zend_compile.c zend_object_handlers.c /tests bug37632.phpt | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-4943@lists.php.net to get a copy of this message | ||
helly Mon May 29 20:06:44 2006 UTC
Added files: (Branch: PHP_5_2)
/ZendEngine2/tests bug37632.phpt
Modified files:
/ZendEngine2 zend_compile.c zend_object_handlers.c
Log:
- MFH Bugfix #37632 (Protected method access problem)
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.5&r2=1.647.2.27.2.6&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.5 ZendEngine2/zend_compile.c:1.647.2.27.2.6
--- ZendEngine2/zend_compile.c:1.647.2.27.2.5 Sat May 27 18:23:48 2006
+++ ZendEngine2/zend_compile.c Mon May 29 20:06:43 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.c,v 1.647.2.27.2.5 2006/05/27 18:23:48 johannes Exp $ */
+/* $Id: zend_compile.c,v 1.647.2.27.2.6 2006/05/29 20:06:43 helly Exp $ */
#include <zend_language_parser.h>
#include "zend.h"
@@ -2028,8 +2028,9 @@
if (parent_flags & ZEND_ACC_ABSTRACT) {
child->common.fn_flags |= ZEND_ACC_IMPLEMENTED_ABSTRACT;
child->common.prototype = parent;
- } else {
- child->common.prototype = parent->common.prototype;
+ } else if (!(parent->common.fn_flags & ZEND_ACC_CTOR) || (parent->common.prototype
&& parent->common.prototype->common.scope->ce_flags && ZEND_ACC_INTERFACE))
{
+ /* ctors only have a prototype if it comes from an interface */
+ child->common.prototype = parent->common.prototype ? parent->common.prototype : parent;
}
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_object_handlers.c?r1=1.135.2.6.2.3&r2=1.135.2.6.2.4&diff_format=u
Index: ZendEngine2/zend_object_handlers.c
diff -u ZendEngine2/zend_object_handlers.c:1.135.2.6.2.3
ZendEngine2/zend_object_handlers.c:1.135.2.6.2.4
--- ZendEngine2/zend_object_handlers.c:1.135.2.6.2.3 Sat May 27 18:39:53 2006
+++ ZendEngine2/zend_object_handlers.c Mon May 29 20:06:43 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_object_handlers.c,v 1.135.2.6.2.3 2006/05/27 18:39:53 helly Exp $ */
+/* $Id: zend_object_handlers.c,v 1.135.2.6.2.4 2006/05/29 20:06:43 helly Exp $ */
#include "zend.h"
#include "zend_globals.h"
@@ -724,6 +724,12 @@
}
+static inline zend_class_entry * zend_get_function_root_class(zend_function *fbc)
+{
+ return fbc->common.prototype ? fbc->common.prototype->common.scope :
fbc->common.scope;
+}
+
+
static union _zend_function *zend_std_get_method(zval **object_ptr, char *method_name, int
method_len TSRMLS_DC)
{
zend_object *zobj;
@@ -784,7 +790,7 @@
} else if ((fbc->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
- if (!zend_check_protected(fbc->common.scope, EG(scope))) {
+ if (!zend_check_protected(zend_get_function_root_class(fbc), EG(scope))) {
zend_error(E_ERROR, "Call to %s method %s::%s() from context '%s'",
zend_visibility_string(fbc->common.fn_flags), ZEND_FN_SCOPE_NAME(fbc), method_name, EG(scope) ?
EG(scope)->name : "");
}
}
@@ -822,7 +828,7 @@
} else if ((fbc->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
- if (!zend_check_protected(EG(scope), fbc->common.scope)) {
+ if (!zend_check_protected(zend_get_function_root_class(fbc), EG(scope))) {
zend_error(E_ERROR, "Call to %s method %s::%s() from context '%s'",
zend_visibility_string(fbc->common.fn_flags), ZEND_FN_SCOPE_NAME(fbc), function_name_strval,
EG(scope) ? EG(scope)->name : "");
}
}
@@ -898,7 +904,7 @@
} else if ((constructor->common.fn_flags & ZEND_ACC_PROTECTED)) {
/* Ensure that if we're calling a protected function, we're allowed to do so.
*/
- if (!zend_check_protected(constructor->common.scope, EG(scope))) {
+ if (!zend_check_protected(zend_get_function_root_class(constructor), EG(scope))) {
zend_error(E_ERROR, "Call to protected %s::%s() from context '%s'",
constructor->common.scope->name, constructor->common.function_name, EG(scope) ?
EG(scope)->name : "");
}
}
http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/bug37632.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug37632.phpt
+++ ZendEngine2/tests/bug37632.phpt
--TEST--
Bug #37632 (Protected method access problem)
--FILE--
<?php
class A1
{
protected function test()
{
echo __METHOD__ . "\n";
}
}
class B1 extends A1
{
public function doTest(A1 $obj)
{
echo __METHOD__ . "\n";
$obj->test();
}
}
class C1 extends A1
{
protected function test()
{
echo __METHOD__ . "\n";
}
}
$b = new B1;
$b->doTest(new C1);
class A2
{
static protected function test()
{
echo __METHOD__ . "\n";
}
}
class B2 extends A2
{
static public function doTest(A2 $obj)
{
echo __METHOD__ . "\n";
$obj->test();
}
}
class C2 extends A2
{
static protected function test()
{
echo __METHOD__ . "\n";
}
}
B2::doTest(new C2);
/* Right now Ctor's cannot be made protected when defined in a ctor. That is
* we cannot decrease visibility.
*
interface Ctor
{
function __construct($x);
}
class A3 implements Ctor
{
protected function __construct()
{
echo __METHOD__ . "\n";
}
}
class B3 extends A3
{
static public function doTest()
{
echo __METHOD__ . "\n";
new C3;
}
}
class C3 extends A3
{
protected function __construct()
{
echo __METHOD__ . "\n";
}
}
B3::doTest();
*/
class A4
{
protected function __construct()
{
echo __METHOD__ . "\n";
}
}
class B4 extends A4
{
static public function doTest()
{
echo __METHOD__ . "\n";
new C4;
}
}
class C4 extends A4
{
protected function __construct()
{
echo __METHOD__ . "\n";
}
}
B4::doTest();
?>
===DONE===
--EXPECTF--
B1::doTest
C1::test
B2::doTest
C2::test
B4::doTest
Fatal error: Call to protected C4::__construct() from context 'B4' in %sbug37632.php on
line %d