cvs: ZendEngine2(PHP_5_2) / zend_compile.c zend_object_handlers.c /tests bug37632.phpt

From: 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

« previous php.zend-engine.cvs (#4943) next »