Re: ZE2 constructors

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


« previous php.dev (#94695) next »