Re: ZE2 constructors
| From: | Andi Gutmans | Date: | Sat, 01 Mar 2003 10:59:31 +0000 |
| Subject: | Re: ZE2 constructors | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-94695@lists.php.net to get a copy of this message | ||
The patch look OK. Go ahead and commit it.
Andi
At 08:20 PM 2/28/2003 +0100, Marcus Börger wrote:
Hi Zeev, according to the plans the following test file should PASS: ################ --TEST-- The new constructor/destructor is called --SKIPIF-- <?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?> --FILE-- <?php class early {function early() { echo "early::early\n"; } function __construct() { echo "early::__construct\n"; } function __destruct() { echo "early::__destruct\n"; }} class late {function __construct() { echo "late::__construct\n"; } function late() { echo "late::late\n"; } function __destruct() { echo "late::__destruct\n"; }} $t = new early(); $t->early(); unset($t); $t = new late(); $t->late(); //unset($t); delay to end of script echo "Done\n"; ?> --EXPECTF-- early::__construct early::early early::__destruct late::__construct late::late Done late::__destruct ######################### However it fails and this patch is needed which also fixees the last final problem mentioned already: ######################### Index: Zend/zend_compile.c =================================================================== RCS file: /repository/ZendEngine2/zend_compile.c,v retrieving revision 1.375 diff -u -r1.375 zend_compile.c--- Zend/zend_compile.c 25 Feb 2003 10:03:26 -0000 1.375+++ Zend/zend_compile.c 28 Feb 2003 19:14:52 -0000 @@ -916,6 +916,9 @@&& ((current_access_type->u.constant.value.lval & ZEND_ACC_PPP_MASK) != (new_modifier->u.constant.value.lval & ZEND_ACC_PPP_MASK))) { zend_error(E_COMPILE_ERROR, "Multiple access type modifiers are not allowed"); } + if (((current_access_type->u.constant.value.lval | new_modifier->u.constant.value.lval) & (ZEND_ACC_ABSTRACT | ZEND_ACC_FINAL)) == (ZEND_ACC_ABSTRACT | ZEND_ACC_FINAL)) { + zend_error(E_COMPILE_ERROR, "Cannot use the final modifier on an abstract class member"); + } if (((current_access_type->u.constant.value.lval | new_modifier->u.constant.value.lval) & (ZEND_ACC_PRIVATE | ZEND_ACC_FINAL)) == (ZEND_ACC_PRIVATE | ZEND_ACC_FINAL)) { zend_error(E_COMPILE_ERROR, "Cannot use the final modifier on a private class member"); }@@ -974,7 +977,7 @@fn_flags |= ZEND_ACC_PUBLIC; }- if ((short_class_name_length == name_len) && (!memcmp(short_class_name, name, name_len))) { + if ((short_class_name_length == name_len) && (!memcmp(short_class_name, name, name_len)) && !CG(active_class_entry)->constructor) { CG(active_class_entry)->constructor = (zend_function *) CG(active_op_array); } else if ((function_name->u.constant.value.str.len == sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) && (!memcmp(function_name->u.constant.value.str.val, ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)))) { CG(active_class_entry)->constructor = (zend_function *) CG(active_op_array);######################### regards marcus -- ---------------------------------------------------------------------- Marcus Börger - Looking for all sorts of freelance work - just ask... Did i help you? Consider a gift: http://www.amazon.de/exec/obidos/wishlist/ho722v0rg1u0 ----------------------------------------------------------------------