]> granicus.if.org Git - php/commitdiff
- Optimize class instanciation
authorZeev Suraski <zeev@php.net>
Sun, 21 Nov 1999 18:11:10 +0000 (18:11 +0000)
committerZeev Suraski <zeev@php.net>
Sun, 21 Nov 1999 18:11:10 +0000 (18:11 +0000)
- Fix constant instanciation for array elements inside objects

Zend/zend.h
Zend/zend_API.c
Zend/zend_compile.c
Zend/zend_execute.h
Zend/zend_execute_API.c

index 429f9fae7911df265d54167a035ba0df3acfb73d..313f151be13e9617811a49d6c3c105fd3cc9f1b0 100644 (file)
@@ -160,6 +160,7 @@ struct _zend_class_entry {
        uint name_length;
        struct _zend_class_entry *parent; 
        int *refcount;
+       zend_bool constants_updated;
 
        HashTable function_table;
        HashTable default_properties;
index fdcda0c5bee4f8c7600ceb0365a67daa2647d277..81bf12a89440b3c350ab3a13c635d2a4e0990ee1 100644 (file)
@@ -199,21 +199,17 @@ ZEND_API inline int array_init(zval *arg)
 }
 
 
-static void zval_update_const_and_ref(zval **p)
-{
-       zval_update_constant(*p);
-       zval_add_ref(p);
-}
-
-
-
 ZEND_API inline int object_init_ex(zval *arg, zend_class_entry *class_type)
 {
        zval *tmp;
 
+       if (!class_type->constants_updated) {
+               zend_hash_apply(&class_type->default_properties, (int (*)(void *)) zval_update_constant);
+               class_type->constants_updated = 1;
+       }
        arg->value.obj.properties = (HashTable *) emalloc(sizeof(HashTable));
        zend_hash_init(arg->value.obj.properties, 0, NULL, PVAL_PTR_DTOR, 0);
-       zend_hash_copy(arg->value.obj.properties, &class_type->default_properties, (void (*)(void *)) zval_update_const_and_ref, (void *) &tmp, sizeof(zval *));
+       zend_hash_copy(arg->value.obj.properties, &class_type->default_properties, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *));
        arg->type = IS_OBJECT;
        arg->value.obj.ce = class_type;
        return SUCCESS;
index c5483d19ee244c68d2d03d36a17d6159d4a5a164..f33593619e5889ef66d6c921b26dde4004c92698 100644 (file)
@@ -1384,6 +1384,7 @@ void do_begin_class_declaration(znode *class_name, znode *parent_class_name CLS_
        CG(class_entry).name_length = class_name->u.constant.value.str.len;
        CG(class_entry).refcount = (int *) emalloc(sizeof(int));
        *CG(class_entry).refcount = 1;
+       CG(class_entry).constants_updated = 0;
        
        zend_str_tolower(CG(class_entry).name, CG(class_entry).name_length);
 
index ae984990c808b06d9d6f7d53ecf48d40b345de5a..84296c089d3edd50083fb131b09076b4c02f187f 100644 (file)
@@ -49,7 +49,7 @@ ZEND_API int zend_is_true(zval *op);
 ZEND_API inline void safe_free_zval_ptr(zval *p);
 ZEND_API void zend_eval_string(char *str, zval *retval CLS_DC ELS_DC);
 ZEND_API inline int i_zend_is_true(zval *op);
-ZEND_API void zval_update_constant(zval *p);
+ZEND_API int zval_update_constant(zval **pp);
 ZEND_API inline void zend_assign_to_variable_reference(znode *result, zval **variable_ptr_ptr, zval **value_ptr_ptr, temp_variable *Ts ELS_DC);
 
 /* dedicated Zend executor functions - do not use! */
index 19b8e4b6ed43b58acf7d8d1d8bb7c4fcfe242cff..43ce0868bd2f763489554d18d56c3f17a829b88d 100644 (file)
@@ -260,8 +260,10 @@ ZEND_API int zend_is_true(zval *op)
 }
 
 
-ZEND_API void zval_update_constant(zval *p)
+ZEND_API int zval_update_constant(zval **pp)
 {
+       zval *p = *pp;
+
        if (p->type == IS_CONSTANT) {
                zval c;
                int refcount = p->refcount;
@@ -277,7 +279,10 @@ ZEND_API void zval_update_constant(zval *p)
                }
                INIT_PZVAL(p);
                p->refcount = refcount;
+       } else if (p->type == IS_ARRAY) {
+               zend_hash_apply(p->value.ht, (int (*)(void *)) zval_update_constant);
        }
+       return 0;
 }