cvs: php-src /ext/spl spl_functions.c spl_iterators.c ZendEngine2 zend_API.c zend_compile.c zend_compile.h zend_execute.c zend_execute_API.c
zend_interfaces.c zend_language_parser.y zend_reflection_api.c
| From: | Marcus Boerger | Date: | Tue, 09 Mar 2004 16:38:38 +0000 |
| Subject: | cvs: php-src /ext/spl spl_functions.c spl_iterators.c ZendEngine2 zend_API.c zend_compile.c zend_compile.h zend_execute.c zend_execute_API.c zend_interfaces.c zend_language_parser.y zend_reflection_api.c |
||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-26569@lists.php.net to get a copy of this message | ||
helly Tue Mar 9 11:38:38 2004 EDT
Modified files:
/ZendEngine2 zend_API.c zend_compile.c zend_compile.h
zend_execute.c zend_execute_API.c zend_interfaces.c
zend_language_parser.y zend_reflection_api.c
/php-src/ext/spl spl_functions.c spl_iterators.c
Log:
Clearify the different method/class flags (as discussed with Andi).
http://cvs.php.net/diff.php/ZendEngine2/zend_API.c?r1=1.245&r2=1.246&ty=u Index: ZendEngine2/zend_API.c diff -u ZendEngine2/zend_API.c:1.245 ZendEngine2/zend_API.c:1.246 --- ZendEngine2/zend_API.c:1.245 Tue Mar 2 11:17:58 2004 +++ ZendEngine2/zend_API.c Tue Mar 9 11:38:33 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_API.c,v 1.245 2004/03/02 16:17:58 helly Exp $ */ +/* $Id: zend_API.c,v 1.246 2004/03/09 16:38:33 helly Exp $ */ #include "zend.h" #include "zend_execute.h" @@ -1237,11 +1237,12 @@ if (ptr->flags & ZEND_ACC_ABSTRACT) { if (scope) { /* This is a class that must be abstract itself. Here we set the check info. */ - scope->ce_flags |= ZEND_ACC_ABSTRACT; + scope->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; if (!(scope->ce_flags & ZEND_ACC_INTERFACE)) { /* Since the class is not an interface it needs to be declared as a abstract class. */ + /* Since here we are handling internal functions only we can add the keyword flag. */ /* This time we set the flag for the keyword 'abstratc'. */ - scope->ce_flags |= ZEND_ACC_ABSTRACT_CLASS; + scope->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; } } } else { @@ -1522,7 +1523,7 @@ ZEND_API zend_class_entry *zend_register_internal_interface(zend_class_entry *orig_class_entry TSRMLS_DC) { - return do_register_internal_class(orig_class_entry, ZEND_ACC_ABSTRACT|ZEND_ACC_INTERFACE TSRMLS_CC); + return do_register_internal_class(orig_class_entry, ZEND_ACC_INTERFACE TSRMLS_CC); } ZEND_API int zend_set_hash_symbol(zval *symbol, char *name, int name_length, http://cvs.php.net/diff.php/ZendEngine2/zend_compile.c?r1=1.555&r2=1.556&ty=u Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.555 ZendEngine2/zend_compile.c:1.556 --- ZendEngine2/zend_compile.c:1.555 Tue Mar 9 10:27:39 2004 +++ ZendEngine2/zend_compile.c Tue Mar 9 11:38:33 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.c,v 1.555 2004/03/09 15:27:39 andi Exp $ */ +/* $Id: zend_compile.c,v 1.556 2004/03/09 16:38:33 helly Exp $ */ #include "zend_language_parser.h" #include "zend.h" @@ -974,7 +974,7 @@ } if (fn_flags & ZEND_ACC_ABSTRACT) { - CG(active_class_entry)->ce_flags |= ZEND_ACC_ABSTRACT; + CG(active_class_entry)->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; } if (!(fn_flags & ZEND_ACC_PPP_MASK)) { @@ -1749,8 +1749,8 @@ TSRMLS_FETCH(); if (zend_hash_quick_find(child_function_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void **) &child)==FAILURE) { - if (parent_flags & ZEND_ACC_ABSTRACT) { - child_ce->ce_flags |= ZEND_ACC_ABSTRACT; + if (parent_flags & (ZEND_ACC_ABSTRACT)) { + child_ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; } return 1; /* method doesn't exist in child, copy from parent */ } @@ -2537,8 +2537,7 @@ if (ce->num_interfaces > 0) { ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *)*ce->num_interfaces); } - if (!(ce->ce_flags & ZEND_ACC_INTERFACE) - && !(ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS) + if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) && ((parent_token->op_type != IS_UNUSED) || (ce->num_interfaces > 0))) { zend_verify_abstract_class(ce TSRMLS_CC); if (ce->parent || ce->num_interfaces) { http://cvs.php.net/diff.php/ZendEngine2/zend_compile.h?r1=1.281&r2=1.282&ty=u Index: ZendEngine2/zend_compile.h diff -u ZendEngine2/zend_compile.h:1.281 ZendEngine2/zend_compile.h:1.282 --- ZendEngine2/zend_compile.h:1.281 Tue Mar 9 10:27:39 2004 +++ ZendEngine2/zend_compile.h Tue Mar 9 11:38:33 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.h,v 1.281 2004/03/09 15:27:39 andi Exp $ */ +/* $Id: zend_compile.h,v 1.282 2004/03/09 16:38:33 helly Exp $ */ #ifndef ZEND_COMPILE_H #define ZEND_COMPILE_H @@ -99,18 +99,21 @@ } zend_try_catch_element; +/* method flags (types) */ #define ZEND_ACC_STATIC 0x01 #define ZEND_ACC_ABSTRACT 0x02 #define ZEND_ACC_FINAL 0x04 -#define ZEND_ACC_INTERFACE 0x08 -/* ZEND_ACC_ABSTRACT is used for abstract classes and methods. Abstract checks work only on this flag. */ -/* ZEND_ACC_ABSTRACT_CLASS denotes that a class was explicitly defined as abstract by using the keyword. */ -#define ZEND_ACC_ABSTRACT_CLASS 0x10 -#define ZEND_ACC_FINAL_CLASS 0x20 -#define ZEND_ACC_IMPLEMENTED_ABSTRACT 0x40 +#define ZEND_ACC_IMPLEMENTED_ABSTRACT 0x08 -#define ZEND_ACC_ALLOW_STATIC 0x80 +/* class flags (types) */ +/* ZEND_ACC_IMPLICIT_ABSTRACT_CLASS is used for abstract classes (since it is set by any abstract method even interfaces MAY have it set, too). */ +/* ZEND_ACC_EXPLICIT_ABSTRACT_CLASS denotes that a class was explicitly defined as abstract by using the keyword. */ +#define ZEND_ACC_IMPLICIT_ABSTRACT_CLASS 0x10 +#define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS 0x20 +#define ZEND_ACC_FINAL_CLASS 0x40 +#define ZEND_ACC_INTERFACE 0x80 +/* method flags (visibility) */ /* The order of those must be kept - public < protected < private */ #define ZEND_ACC_PUBLIC 0x100 #define ZEND_ACC_PROTECTED 0x200 @@ -120,10 +123,14 @@ #define ZEND_ACC_CHANGED 0x800 #define ZEND_ACC_IMPLICIT_PUBLIC 0x1000 +/* method flags (special method detection) */ #define ZEND_ACC_CTOR 0x2000 #define ZEND_ACC_DTOR 0x4000 #define ZEND_ACC_CLONE 0x8000 +/* method flag (bc only), any method that has this flag can be used statically and non statically. */ +#define ZEND_ACC_ALLOW_STATIC 0x10000 + char *zend_visibility_string(zend_uint fn_flags); http://cvs.php.net/diff.php/ZendEngine2/zend_execute.c?r1=1.621&r2=1.622&ty=u Index: ZendEngine2/zend_execute.c diff -u ZendEngine2/zend_execute.c:1.621 ZendEngine2/zend_execute.c:1.622 --- ZendEngine2/zend_execute.c:1.621 Tue Mar 9 10:27:39 2004 +++ ZendEngine2/zend_execute.c Tue Mar 9 11:38:33 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.c,v 1.621 2004/03/09 15:27:39 andi Exp $ */ +/* $Id: zend_execute.c,v 1.622 2004/03/09 16:38:33 helly Exp $ */ #define ZEND_INTENSIVE_DEBUGGING 0 @@ -3169,7 +3169,7 @@ 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|ZEND_ACC_ABSTRACT_CLASS)) { + if (EX_T(opline->op1.u.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { char *class_type; if (EX_T(opline->op1.u.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) { http://cvs.php.net/diff.php/ZendEngine2/zend_execute_API.c?r1=1.273&r2=1.274&ty=u Index: ZendEngine2/zend_execute_API.c diff -u ZendEngine2/zend_execute_API.c:1.273 ZendEngine2/zend_execute_API.c:1.274 --- ZendEngine2/zend_execute_API.c:1.273 Mon Mar 8 11:52:59 2004 +++ ZendEngine2/zend_execute_API.c Tue Mar 9 11:38:34 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute_API.c,v 1.273 2004/03/08 16:52:59 helly Exp $ */ +/* $Id: zend_execute_API.c,v 1.274 2004/03/09 16:38:34 helly Exp $ */ #include <stdio.h> #include <signal.h> @@ -1225,7 +1225,7 @@ { zend_abstract_info ai; - if ((ce->ce_flags & ZEND_ACC_ABSTRACT) && !(ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS)) { + if ((ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) && !(ce->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { memset(&ai, 0, sizeof(ai)); zend_hash_apply_with_argument(&ce->function_table, (apply_func_arg_t) zend_verify_abstract_class_function, &ai TSRMLS_CC); http://cvs.php.net/diff.php/ZendEngine2/zend_interfaces.c?r1=1.16&r2=1.17&ty=u Index: ZendEngine2/zend_interfaces.c diff -u ZendEngine2/zend_interfaces.c:1.16 ZendEngine2/zend_interfaces.c:1.17 --- ZendEngine2/zend_interfaces.c:1.16 Mon Mar 8 13:05:41 2004 +++ ZendEngine2/zend_interfaces.c Tue Mar 9 11:38:34 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_interfaces.c,v 1.16 2004/03/08 18:05:41 helly Exp $ */ +/* $Id: zend_interfaces.c,v 1.17 2004/03/09 16:38:34 helly Exp $ */ #include "zend.h" #include "zend_API.h" @@ -293,7 +293,7 @@ if (class_type->get_iterator || (class_type->parent && class_type->parent->get_iterator)) { return SUCCESS; - } + } for (i = 0; i < class_type->num_interfaces; i++) { if (class_type->interfaces[i] == zend_ce_aggregate || class_type->interfaces[i] == zend_ce_iterator) { return SUCCESS; http://cvs.php.net/diff.php/ZendEngine2/zend_language_parser.y?r1=1.141&r2=1.142&ty=u Index: ZendEngine2/zend_language_parser.y diff -u ZendEngine2/zend_language_parser.y:1.141 ZendEngine2/zend_language_parser.y:1.142 --- ZendEngine2/zend_language_parser.y:1.141 Thu Feb 26 14:59:49 2004 +++ ZendEngine2/zend_language_parser.y Tue Mar 9 11:38:34 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_parser.y,v 1.141 2004/02/26 19:59:49 helly Exp $ */ +/* $Id: zend_language_parser.y,v 1.142 2004/03/09 16:38:34 helly Exp $ */ /* * LALR shift/reduce conflicts and how they are resolved: @@ -287,7 +287,7 @@ class_entry_type: T_CLASS { $$.u.constant.value.lval = 0; } - | T_ABSTRACT T_CLASS { $$.u.constant.value.lval = ZEND_ACC_ABSTRACT_CLASS; } + | T_ABSTRACT T_CLASS { $$.u.constant.value.lval = ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; } | T_FINAL T_CLASS { $$.u.constant.value.lval = ZEND_ACC_FINAL_CLASS; } ; http://cvs.php.net/diff.php/ZendEngine2/zend_reflection_api.c?r1=1.93&r2=1.94&ty=u Index: ZendEngine2/zend_reflection_api.c diff -u ZendEngine2/zend_reflection_api.c:1.93 ZendEngine2/zend_reflection_api.c:1.94 --- ZendEngine2/zend_reflection_api.c:1.93 Sun Mar 7 19:19:43 2004 +++ ZendEngine2/zend_reflection_api.c Tue Mar 9 11:38:34 2004 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_reflection_api.c,v 1.93 2004/03/08 00:19:43 helly Exp $ */ +/* $Id: zend_reflection_api.c,v 1.94 2004/03/09 16:38:34 helly Exp $ */ #include "zend.h" #include "zend_API.h" #include "zend_exceptions.h" @@ -269,13 +269,17 @@ if (ce->get_iterator != NULL) { string_printf(str, "<iterateable> "); } - if (ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS) { - string_printf(str, "abstract "); + if (ce->ce_flags & ZEND_ACC_INTERFACE) { + string_printf(str, "interface "); + } else { + if (ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { + string_printf(str, "abstract "); + } + if (ce->ce_flags & ZEND_ACC_FINAL_CLASS) { + string_printf(str, "final "); + } + string_printf(str, "class "); } - if (ce->ce_flags & ZEND_ACC_FINAL_CLASS) { - string_printf(str, "final "); - } - string_printf(str, (ce->ce_flags & ZEND_ACC_INTERFACE) ? "interface " : "class "); string_write(str, ce->name, ce->name_length); if (ce->parent) { string_printf(str, " extends %s", ce->parent->name); @@ -952,7 +956,7 @@ array_init(return_value); - if (modifiers & (ZEND_ACC_ABSTRACT | ZEND_ACC_ABSTRACT_CLASS)) { + if (modifiers & (ZEND_ACC_ABSTRACT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { add_next_index_stringl(return_value, "abstract", sizeof("abstract"), 1); } if (modifiers & (ZEND_ACC_FINAL | ZEND_ACC_FINAL_CLASS)) { @@ -2252,7 +2256,7 @@ Returns whether this class is abstract */ ZEND_METHOD(reflection_class, isAbstract) { - _class_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_ABSTRACT_CLASS); + _class_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_IMPLICIT_ABSTRACT_CLASS); } /* }}} */ @@ -3192,7 +3196,8 @@ REGISTER_MAIN_LONG_CONSTANT("M_FINAL", ZEND_ACC_FINAL, CONST_PERSISTENT|CONST_CS); /* Class modifiers */ - REGISTER_MAIN_LONG_CONSTANT("C_ABSTRACT", ZEND_ACC_ABSTRACT_CLASS, CONST_PERSISTENT|CONST_CS); + REGISTER_MAIN_LONG_CONSTANT("C_IMPLICIT_ABSTRACT", ZEND_ACC_IMPLICIT_ABSTRACT_CLASS, CONST_PERSISTENT|CONST_CS); + REGISTER_MAIN_LONG_CONSTANT("C_EXPLICIT_ABSTRACT", ZEND_ACC_EXPLICIT_ABSTRACT_CLASS, CONST_PERSISTENT|CONST_CS); REGISTER_MAIN_LONG_CONSTANT("C_FINAL", ZEND_ACC_FINAL_CLASS, CONST_PERSISTENT|CONST_CS); } /* }}} */ http://cvs.php.net/diff.php/php-src/ext/spl/spl_functions.c?r1=1.24&r2=1.25&ty=u Index: php-src/ext/spl/spl_functions.c diff -u php-src/ext/spl/spl_functions.c:1.24 php-src/ext/spl/spl_functions.c:1.25 --- php-src/ext/spl/spl_functions.c:1.24 Thu Feb 5 22:14:06 2004 +++ php-src/ext/spl/spl_functions.c Tue Mar 9 11:38:37 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_functions.c,v 1.24 2004/02/06 03:14:06 iliaa Exp $ */ +/* $Id: spl_functions.c,v 1.25 2004/03/09 16:38:37 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -45,7 +45,7 @@ *ppce = zend_register_internal_class(&ce TSRMLS_CC); /* entries changed by initialize */ - (*ppce)->ce_flags = ZEND_ACC_ABSTRACT | ZEND_ACC_INTERFACE; + (*ppce)->ce_flags = ZEND_ACC_INTERFACE; } /* }}} */ http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.24&r2=1.25&ty=u Index: php-src/ext/spl/spl_iterators.c diff -u php-src/ext/spl/spl_iterators.c:1.24 php-src/ext/spl/spl_iterators.c:1.25 --- php-src/ext/spl/spl_iterators.c:1.24 Mon Mar 8 13:05:41 2004 +++ php-src/ext/spl/spl_iterators.c Tue Mar 9 11:38:37 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_iterators.c,v 1.24 2004/03/08 18:05:41 helly Exp $ */ +/* $Id: spl_iterators.c,v 1.25 2004/03/09 16:38:37 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -1204,7 +1204,7 @@ REGISTER_SPL_STD_CLASS_EX(FilterIterator, spl_dual_it_new, spl_funcs_FilterIterator); REGISTER_SPL_ITERATOR(FilterIterator); - spl_ce_FilterIterator->ce_flags |= ZEND_ACC_ABSTRACT_CLASS; + spl_ce_FilterIterator->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; REGISTER_SPL_SUB_CLASS_EX(ParentIterator, FilterIterator, spl_dual_it_new, spl_funcs_ParentIterator); REGISTER_SPL_IMPLEMENTS(ParentIterator, RecursiveIterator);
http://cvs.php.net/diff.php/ZendEngine2/zend_API.c?r1=1.245&r2=1.246&ty=u Index: ZendEngine2/zend_API.c diff -u ZendEngine2/zend_API.c:1.245 ZendEngine2/zend_API.c:1.246 --- ZendEngine2/zend_API.c:1.245 Tue Mar 2 11:17:58 2004 +++ ZendEngine2/zend_API.c Tue Mar 9 11:38:33 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_API.c,v 1.245 2004/03/02 16:17:58 helly Exp $ */ +/* $Id: zend_API.c,v 1.246 2004/03/09 16:38:33 helly Exp $ */ #include "zend.h" #include "zend_execute.h" @@ -1237,11 +1237,12 @@ if (ptr->flags & ZEND_ACC_ABSTRACT) { if (scope) { /* This is a class that must be abstract itself. Here we set the check info. */ - scope->ce_flags |= ZEND_ACC_ABSTRACT; + scope->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; if (!(scope->ce_flags & ZEND_ACC_INTERFACE)) { /* Since the class is not an interface it needs to be declared as a abstract class. */ + /* Since here we are handling internal functions only we can add the keyword flag. */ /* This time we set the flag for the keyword 'abstratc'. */ - scope->ce_flags |= ZEND_ACC_ABSTRACT_CLASS; + scope->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; } } } else { @@ -1522,7 +1523,7 @@ ZEND_API zend_class_entry *zend_register_internal_interface(zend_class_entry *orig_class_entry TSRMLS_DC) { - return do_register_internal_class(orig_class_entry, ZEND_ACC_ABSTRACT|ZEND_ACC_INTERFACE TSRMLS_CC); + return do_register_internal_class(orig_class_entry, ZEND_ACC_INTERFACE TSRMLS_CC); } ZEND_API int zend_set_hash_symbol(zval *symbol, char *name, int name_length, http://cvs.php.net/diff.php/ZendEngine2/zend_compile.c?r1=1.555&r2=1.556&ty=u Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.555 ZendEngine2/zend_compile.c:1.556 --- ZendEngine2/zend_compile.c:1.555 Tue Mar 9 10:27:39 2004 +++ ZendEngine2/zend_compile.c Tue Mar 9 11:38:33 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.c,v 1.555 2004/03/09 15:27:39 andi Exp $ */ +/* $Id: zend_compile.c,v 1.556 2004/03/09 16:38:33 helly Exp $ */ #include "zend_language_parser.h" #include "zend.h" @@ -974,7 +974,7 @@ } if (fn_flags & ZEND_ACC_ABSTRACT) { - CG(active_class_entry)->ce_flags |= ZEND_ACC_ABSTRACT; + CG(active_class_entry)->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; } if (!(fn_flags & ZEND_ACC_PPP_MASK)) { @@ -1749,8 +1749,8 @@ TSRMLS_FETCH(); if (zend_hash_quick_find(child_function_table, hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void **) &child)==FAILURE) { - if (parent_flags & ZEND_ACC_ABSTRACT) { - child_ce->ce_flags |= ZEND_ACC_ABSTRACT; + if (parent_flags & (ZEND_ACC_ABSTRACT)) { + child_ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; } return 1; /* method doesn't exist in child, copy from parent */ } @@ -2537,8 +2537,7 @@ if (ce->num_interfaces > 0) { ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *)*ce->num_interfaces); } - if (!(ce->ce_flags & ZEND_ACC_INTERFACE) - && !(ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS) + if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) && ((parent_token->op_type != IS_UNUSED) || (ce->num_interfaces > 0))) { zend_verify_abstract_class(ce TSRMLS_CC); if (ce->parent || ce->num_interfaces) { http://cvs.php.net/diff.php/ZendEngine2/zend_compile.h?r1=1.281&r2=1.282&ty=u Index: ZendEngine2/zend_compile.h diff -u ZendEngine2/zend_compile.h:1.281 ZendEngine2/zend_compile.h:1.282 --- ZendEngine2/zend_compile.h:1.281 Tue Mar 9 10:27:39 2004 +++ ZendEngine2/zend_compile.h Tue Mar 9 11:38:33 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.h,v 1.281 2004/03/09 15:27:39 andi Exp $ */ +/* $Id: zend_compile.h,v 1.282 2004/03/09 16:38:33 helly Exp $ */ #ifndef ZEND_COMPILE_H #define ZEND_COMPILE_H @@ -99,18 +99,21 @@ } zend_try_catch_element; +/* method flags (types) */ #define ZEND_ACC_STATIC 0x01 #define ZEND_ACC_ABSTRACT 0x02 #define ZEND_ACC_FINAL 0x04 -#define ZEND_ACC_INTERFACE 0x08 -/* ZEND_ACC_ABSTRACT is used for abstract classes and methods. Abstract checks work only on this flag. */ -/* ZEND_ACC_ABSTRACT_CLASS denotes that a class was explicitly defined as abstract by using the keyword. */ -#define ZEND_ACC_ABSTRACT_CLASS 0x10 -#define ZEND_ACC_FINAL_CLASS 0x20 -#define ZEND_ACC_IMPLEMENTED_ABSTRACT 0x40 +#define ZEND_ACC_IMPLEMENTED_ABSTRACT 0x08 -#define ZEND_ACC_ALLOW_STATIC 0x80 +/* class flags (types) */ +/* ZEND_ACC_IMPLICIT_ABSTRACT_CLASS is used for abstract classes (since it is set by any abstract method even interfaces MAY have it set, too). */ +/* ZEND_ACC_EXPLICIT_ABSTRACT_CLASS denotes that a class was explicitly defined as abstract by using the keyword. */ +#define ZEND_ACC_IMPLICIT_ABSTRACT_CLASS 0x10 +#define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS 0x20 +#define ZEND_ACC_FINAL_CLASS 0x40 +#define ZEND_ACC_INTERFACE 0x80 +/* method flags (visibility) */ /* The order of those must be kept - public < protected < private */ #define ZEND_ACC_PUBLIC 0x100 #define ZEND_ACC_PROTECTED 0x200 @@ -120,10 +123,14 @@ #define ZEND_ACC_CHANGED 0x800 #define ZEND_ACC_IMPLICIT_PUBLIC 0x1000 +/* method flags (special method detection) */ #define ZEND_ACC_CTOR 0x2000 #define ZEND_ACC_DTOR 0x4000 #define ZEND_ACC_CLONE 0x8000 +/* method flag (bc only), any method that has this flag can be used statically and non statically. */ +#define ZEND_ACC_ALLOW_STATIC 0x10000 + char *zend_visibility_string(zend_uint fn_flags); http://cvs.php.net/diff.php/ZendEngine2/zend_execute.c?r1=1.621&r2=1.622&ty=u Index: ZendEngine2/zend_execute.c diff -u ZendEngine2/zend_execute.c:1.621 ZendEngine2/zend_execute.c:1.622 --- ZendEngine2/zend_execute.c:1.621 Tue Mar 9 10:27:39 2004 +++ ZendEngine2/zend_execute.c Tue Mar 9 11:38:33 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.c,v 1.621 2004/03/09 15:27:39 andi Exp $ */ +/* $Id: zend_execute.c,v 1.622 2004/03/09 16:38:33 helly Exp $ */ #define ZEND_INTENSIVE_DEBUGGING 0 @@ -3169,7 +3169,7 @@ 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|ZEND_ACC_ABSTRACT_CLASS)) { + if (EX_T(opline->op1.u.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { char *class_type; if (EX_T(opline->op1.u.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) { http://cvs.php.net/diff.php/ZendEngine2/zend_execute_API.c?r1=1.273&r2=1.274&ty=u Index: ZendEngine2/zend_execute_API.c diff -u ZendEngine2/zend_execute_API.c:1.273 ZendEngine2/zend_execute_API.c:1.274 --- ZendEngine2/zend_execute_API.c:1.273 Mon Mar 8 11:52:59 2004 +++ ZendEngine2/zend_execute_API.c Tue Mar 9 11:38:34 2004 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute_API.c,v 1.273 2004/03/08 16:52:59 helly Exp $ */ +/* $Id: zend_execute_API.c,v 1.274 2004/03/09 16:38:34 helly Exp $ */ #include <stdio.h> #include <signal.h> @@ -1225,7 +1225,7 @@ { zend_abstract_info ai; - if ((ce->ce_flags & ZEND_ACC_ABSTRACT) && !(ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS)) { + if ((ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) && !(ce->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { memset(&ai, 0, sizeof(ai)); zend_hash_apply_with_argument(&ce->function_table, (apply_func_arg_t) zend_verify_abstract_class_function, &ai TSRMLS_CC); http://cvs.php.net/diff.php/ZendEngine2/zend_interfaces.c?r1=1.16&r2=1.17&ty=u Index: ZendEngine2/zend_interfaces.c diff -u ZendEngine2/zend_interfaces.c:1.16 ZendEngine2/zend_interfaces.c:1.17 --- ZendEngine2/zend_interfaces.c:1.16 Mon Mar 8 13:05:41 2004 +++ ZendEngine2/zend_interfaces.c Tue Mar 9 11:38:34 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_interfaces.c,v 1.16 2004/03/08 18:05:41 helly Exp $ */ +/* $Id: zend_interfaces.c,v 1.17 2004/03/09 16:38:34 helly Exp $ */ #include "zend.h" #include "zend_API.h" @@ -293,7 +293,7 @@ if (class_type->get_iterator || (class_type->parent && class_type->parent->get_iterator)) { return SUCCESS; - } + } for (i = 0; i < class_type->num_interfaces; i++) { if (class_type->interfaces[i] == zend_ce_aggregate || class_type->interfaces[i] == zend_ce_iterator) { return SUCCESS; http://cvs.php.net/diff.php/ZendEngine2/zend_language_parser.y?r1=1.141&r2=1.142&ty=u Index: ZendEngine2/zend_language_parser.y diff -u ZendEngine2/zend_language_parser.y:1.141 ZendEngine2/zend_language_parser.y:1.142 --- ZendEngine2/zend_language_parser.y:1.141 Thu Feb 26 14:59:49 2004 +++ ZendEngine2/zend_language_parser.y Tue Mar 9 11:38:34 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_parser.y,v 1.141 2004/02/26 19:59:49 helly Exp $ */ +/* $Id: zend_language_parser.y,v 1.142 2004/03/09 16:38:34 helly Exp $ */ /* * LALR shift/reduce conflicts and how they are resolved: @@ -287,7 +287,7 @@ class_entry_type: T_CLASS { $$.u.constant.value.lval = 0; } - | T_ABSTRACT T_CLASS { $$.u.constant.value.lval = ZEND_ACC_ABSTRACT_CLASS; } + | T_ABSTRACT T_CLASS { $$.u.constant.value.lval = ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; } | T_FINAL T_CLASS { $$.u.constant.value.lval = ZEND_ACC_FINAL_CLASS; } ; http://cvs.php.net/diff.php/ZendEngine2/zend_reflection_api.c?r1=1.93&r2=1.94&ty=u Index: ZendEngine2/zend_reflection_api.c diff -u ZendEngine2/zend_reflection_api.c:1.93 ZendEngine2/zend_reflection_api.c:1.94 --- ZendEngine2/zend_reflection_api.c:1.93 Sun Mar 7 19:19:43 2004 +++ ZendEngine2/zend_reflection_api.c Tue Mar 9 11:38:34 2004 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_reflection_api.c,v 1.93 2004/03/08 00:19:43 helly Exp $ */ +/* $Id: zend_reflection_api.c,v 1.94 2004/03/09 16:38:34 helly Exp $ */ #include "zend.h" #include "zend_API.h" #include "zend_exceptions.h" @@ -269,13 +269,17 @@ if (ce->get_iterator != NULL) { string_printf(str, "<iterateable> "); } - if (ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS) { - string_printf(str, "abstract "); + if (ce->ce_flags & ZEND_ACC_INTERFACE) { + string_printf(str, "interface "); + } else { + if (ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { + string_printf(str, "abstract "); + } + if (ce->ce_flags & ZEND_ACC_FINAL_CLASS) { + string_printf(str, "final "); + } + string_printf(str, "class "); } - if (ce->ce_flags & ZEND_ACC_FINAL_CLASS) { - string_printf(str, "final "); - } - string_printf(str, (ce->ce_flags & ZEND_ACC_INTERFACE) ? "interface " : "class "); string_write(str, ce->name, ce->name_length); if (ce->parent) { string_printf(str, " extends %s", ce->parent->name); @@ -952,7 +956,7 @@ array_init(return_value); - if (modifiers & (ZEND_ACC_ABSTRACT | ZEND_ACC_ABSTRACT_CLASS)) { + if (modifiers & (ZEND_ACC_ABSTRACT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { add_next_index_stringl(return_value, "abstract", sizeof("abstract"), 1); } if (modifiers & (ZEND_ACC_FINAL | ZEND_ACC_FINAL_CLASS)) { @@ -2252,7 +2256,7 @@ Returns whether this class is abstract */ ZEND_METHOD(reflection_class, isAbstract) { - _class_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_ABSTRACT_CLASS); + _class_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_IMPLICIT_ABSTRACT_CLASS); } /* }}} */ @@ -3192,7 +3196,8 @@ REGISTER_MAIN_LONG_CONSTANT("M_FINAL", ZEND_ACC_FINAL, CONST_PERSISTENT|CONST_CS); /* Class modifiers */ - REGISTER_MAIN_LONG_CONSTANT("C_ABSTRACT", ZEND_ACC_ABSTRACT_CLASS, CONST_PERSISTENT|CONST_CS); + REGISTER_MAIN_LONG_CONSTANT("C_IMPLICIT_ABSTRACT", ZEND_ACC_IMPLICIT_ABSTRACT_CLASS, CONST_PERSISTENT|CONST_CS); + REGISTER_MAIN_LONG_CONSTANT("C_EXPLICIT_ABSTRACT", ZEND_ACC_EXPLICIT_ABSTRACT_CLASS, CONST_PERSISTENT|CONST_CS); REGISTER_MAIN_LONG_CONSTANT("C_FINAL", ZEND_ACC_FINAL_CLASS, CONST_PERSISTENT|CONST_CS); } /* }}} */ http://cvs.php.net/diff.php/php-src/ext/spl/spl_functions.c?r1=1.24&r2=1.25&ty=u Index: php-src/ext/spl/spl_functions.c diff -u php-src/ext/spl/spl_functions.c:1.24 php-src/ext/spl/spl_functions.c:1.25 --- php-src/ext/spl/spl_functions.c:1.24 Thu Feb 5 22:14:06 2004 +++ php-src/ext/spl/spl_functions.c Tue Mar 9 11:38:37 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_functions.c,v 1.24 2004/02/06 03:14:06 iliaa Exp $ */ +/* $Id: spl_functions.c,v 1.25 2004/03/09 16:38:37 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -45,7 +45,7 @@ *ppce = zend_register_internal_class(&ce TSRMLS_CC); /* entries changed by initialize */ - (*ppce)->ce_flags = ZEND_ACC_ABSTRACT | ZEND_ACC_INTERFACE; + (*ppce)->ce_flags = ZEND_ACC_INTERFACE; } /* }}} */ http://cvs.php.net/diff.php/php-src/ext/spl/spl_iterators.c?r1=1.24&r2=1.25&ty=u Index: php-src/ext/spl/spl_iterators.c diff -u php-src/ext/spl/spl_iterators.c:1.24 php-src/ext/spl/spl_iterators.c:1.25 --- php-src/ext/spl/spl_iterators.c:1.24 Mon Mar 8 13:05:41 2004 +++ php-src/ext/spl/spl_iterators.c Tue Mar 9 11:38:37 2004 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: spl_iterators.c,v 1.24 2004/03/08 18:05:41 helly Exp $ */ +/* $Id: spl_iterators.c,v 1.25 2004/03/09 16:38:37 helly Exp $ */ #ifdef HAVE_CONFIG_H # include "config.h" @@ -1204,7 +1204,7 @@ REGISTER_SPL_STD_CLASS_EX(FilterIterator, spl_dual_it_new, spl_funcs_FilterIterator); REGISTER_SPL_ITERATOR(FilterIterator); - spl_ce_FilterIterator->ce_flags |= ZEND_ACC_ABSTRACT_CLASS; + spl_ce_FilterIterator->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; REGISTER_SPL_SUB_CLASS_EX(ParentIterator, FilterIterator, spl_dual_it_new, spl_funcs_ParentIterator); REGISTER_SPL_IMPLEMENTS(ParentIterator, RecursiveIterator);