cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_operators.c
| From: | Marcus Boerger | 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;
}