cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_operators.c

From: Date: Thu, 29 May 2003 19:00:41 +0000
Subject: cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_operators.c
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-1282@lists.php.net to get a copy of this message
helly Thu May 29 15:00:41 2003 EDT Modified files: /ZendEngine2 zend_compile.c zend_compile.h zend_operators.c Log: Faster interface inheritance & faster inheritance checks Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.420 ZendEngine2/zend_compile.c:1.421 --- ZendEngine2/zend_compile.c:1.420 Thu May 29 05:01:55 2003 +++ ZendEngine2/zend_compile.c Thu May 29 15:00:40 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.c,v 1.420 2003/05/29 09:01:55 wez Exp $ */ +/* $Id: zend_compile.c,v 1.421 2003/05/29 19:00:40 helly Exp $ */ #include "zend_language_parser.h" #include "zend.h" @@ -1826,6 +1826,22 @@ } +ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, zend_class_entry *ce2) +{ + int num = ce2->num_interfaces; + + if (num) { + if (ce->type == ZEND_INTERNAL_CLASS) { + ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (ce->num_interfaces + num)); + } else { + ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (ce->num_interfaces + num)); + } + memcpy(&ce->interfaces[ce->num_interfaces], ce2->interfaces, num * sizeof(zend_class_entry*)); + ce->num_interfaces += num; + } +} + + void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce) { if ((ce->ce_flags & ZEND_ACC_INTERFACE) @@ -1834,6 +1850,8 @@ } ce->parent = parent_ce; + /* Inherit interfaces */ + zend_do_inherit_interfaces(ce, parent_ce); /* Inherit properties */ zend_hash_merge(&ce->default_properties, &parent_ce->default_properties, (void (*)(void *)) zval_add_ref, NULL, sizeof(zval *), 0); @@ -1847,10 +1865,12 @@ } -void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) +ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) { zend_hash_merge(&ce->constants_table, &iface->constants_table, (void (*)(void *)) zval_add_ref, NULL, sizeof(zval *), 0); zend_hash_merge_ex(&ce->function_table, &iface->function_table, (copy_ctor_func_t) do_inherit_method, sizeof(zend_function), (merge_checker_func_t) do_inherit_method_check, ce); + + zend_do_inherit_interfaces(ce, iface); } @@ -2305,16 +2325,19 @@ void zend_do_end_class_declaration(znode *class_token, znode *parent_token TSRMLS_DC) { - do_inherit_parent_constructor(CG(active_class_entry)); + zend_class_entry *ce = CG(active_class_entry); - CG(active_class_entry)->line_end = zend_get_compiled_lineno(TSRMLS_C); + do_inherit_parent_constructor(ce); - if (CG(active_class_entry)->num_interfaces > 0) { - CG(active_class_entry)->interfaces = (zend_class_entry **) emalloc(sizeof(zend_class_entry *)*CG(active_class_entry)->num_interfaces); - } - if (!(CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE) - && !(CG(active_class_entry)->ce_flags & ZEND_ACC_ABSTRACT_CLASS) - && ((parent_token->op_type != IS_UNUSED) || (CG(active_class_entry)->num_interfaces > 0))) { + ce->line_end = zend_get_compiled_lineno(TSRMLS_C); + + /* Inherit interfaces */ + 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) + && ((parent_token->op_type != IS_UNUSED) || (ce->num_interfaces > 0))) { do_verify_abstract_class(TSRMLS_C); } CG(active_class_entry) = NULL; Index: ZendEngine2/zend_compile.h diff -u ZendEngine2/zend_compile.h:1.237 ZendEngine2/zend_compile.h:1.238 --- ZendEngine2/zend_compile.h:1.237 Fri Apr 11 13:30:42 2003 +++ ZendEngine2/zend_compile.h Thu May 29 15:00:40 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.h,v 1.237 2003/04/11 17:30:42 sebastian Exp $ */ +/* $Id: zend_compile.h,v 1.238 2003/05/29 19:00:40 helly Exp $ */ #ifndef ZEND_COMPILE_H #define ZEND_COMPILE_H @@ -347,6 +347,8 @@ ZEND_API int do_bind_function(zend_op *opline, HashTable *function_table, HashTable *class_table, int compile_time); ZEND_API zend_class_entry *do_bind_class(zend_op *opline, HashTable *function_table, HashTable *class_table TSRMLS_DC); ZEND_API zend_class_entry *do_bind_inherited_class(zend_op *opline, HashTable *function_table, HashTable *class_table, zend_class_entry *parent_ce TSRMLS_DC); +ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, zend_class_entry *ce2); +ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface); void zend_do_implements_interface(znode *interface_znode TSRMLS_DC); void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce); Index: ZendEngine2/zend_operators.c diff -u ZendEngine2/zend_operators.c:1.154 ZendEngine2/zend_operators.c:1.155 --- ZendEngine2/zend_operators.c:1.154 Tue May 27 14:52:25 2003 +++ ZendEngine2/zend_operators.c Thu May 29 15:00:40 2003 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_operators.c,v 1.154 2003/05/27 18:52:25 sterling Exp $ */ +/* $Id: zend_operators.c,v 1.155 2003/05/29 19:00:40 helly Exp $ */ #include <ctype.h> @@ -1431,15 +1431,14 @@ { zend_uint i; + for (i=0; i<instance_ce->num_interfaces; i++) { + if (instanceof_function(instance_ce->interfaces[i], ce TSRMLS_CC)) { + return 1; + } + } while (instance_ce) { if (instance_ce == ce) { return 1; - } - for (i=0; i<instance_ce->num_interfaces; i++) { - - if (instanceof_function(instance_ce->interfaces[i], ce TSRMLS_CC)) { - return 1; - } } instance_ce = instance_ce->parent; }

« previous php.zend-engine.cvs (#1282) next »