]> granicus.if.org Git - php/commitdiff
Fixes for abstract classes/methods
authorMarcus Boerger <helly@php.net>
Fri, 27 Feb 2004 09:14:55 +0000 (09:14 +0000)
committerMarcus Boerger <helly@php.net>
Fri, 27 Feb 2004 09:14:55 +0000 (09:14 +0000)
Zend/zend_API.c
Zend/zend_compile.c
Zend/zend_execute.c

index ea5534ac5141cc20a9e8b46a0657648d97a1a6ec..a56c0c67abb67a16e6a76b446b10874f18f06f15 100644 (file)
@@ -1245,12 +1245,15 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, zend_function_entr
                } else {
                        internal_function->fn_flags = ZEND_ACC_PUBLIC;
                }
-               if (ptr->flags&ZEND_ACC_ABSTRACT) {
+               if (ptr->flags & ZEND_ACC_ABSTRACT) {
                        if (scope) {
-                               scope->ce_flags |= ZEND_ACC_ABSTRACT_CLASS;
+                               scope->ce_flags |= ZEND_ACC_ABSTRACT;
+                               if (!(scope->ce_flags & ZEND_ACC_INTERFACE)) {
+                                       scope->ce_flags |= ZEND_ACC_ABSTRACT_CLASS;
+                               }
                        }
                } else {
-                       if (scope && scope->ce_flags&ZEND_ACC_INTERFACE) {
+                       if (scope && (scope->ce_flags & ZEND_ACC_INTERFACE)) {
                                zend_error(error_type, "Interface %s cannot contain non abstract method %s()", scope->name, ptr->fname);
                                return FAILURE;
                        }
index 3f627563deff815016bdea86ce837d56438a1a53..a56709aa34c0c8cd8aaddf3bcc542e657f663e6a 100644 (file)
@@ -2563,7 +2563,10 @@ void zend_do_end_class_declaration(znode *class_token, znode *parent_token TSRML
        if (!(ce->ce_flags & ZEND_ACC_INTERFACE)
                && !(ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS)
                && ((parent_token->op_type != IS_UNUSED) || (ce->num_interfaces > 0))) {
-               do_verify_abstract_class(TSRMLS_C);
+               zend_verify_abstract_class(ce TSRMLS_CC);
+               if (ce->parent || ce->num_interfaces) {
+                       do_verify_abstract_class(TSRMLS_C);
+               }
        }
        CG(active_class_entry) = NULL;
 }
index f0fc74db6f7aa4cabda61ffc12e2023987574616..1e2a515d3b4a232b18184d0e47f62c603c56b72b 100644 (file)
@@ -3167,7 +3167,7 @@ int zend_switch_free_handler(ZEND_OPCODE_HANDLER_ARGS)
 
 int zend_new_handler(ZEND_OPCODE_HANDLER_ARGS)
 {
-       if (EX_T(opline->op1.u.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_ABSTRACT_CLASS)) {
+       if (EX_T(opline->op1.u.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_ABSTRACT|ZEND_ACC_ABSTRACT_CLASS)) {
                char *class_type;
 
                if (EX_T(opline->op1.u.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) {