From: Marcus Boerger Date: Fri, 27 Feb 2004 09:14:55 +0000 (+0000) Subject: Fixes for abstract classes/methods X-Git-Tag: RELEASE_0_2_0~136 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f449c8fdf7f2d14572a798fdec5682d2dd487c99;p=php Fixes for abstract classes/methods --- diff --git a/Zend/zend_API.c b/Zend/zend_API.c index ea5534ac51..a56c0c67ab 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -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; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3f627563de..a56709aa34 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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; } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f0fc74db6f..1e2a515d3b 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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) {