]> granicus.if.org Git - php/commitdiff
Use fast zend_hash_append() API
authorDmitry Stogov <dmitry@zend.com>
Fri, 6 Mar 2015 16:23:54 +0000 (19:23 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 6 Mar 2015 16:23:54 +0000 (19:23 +0300)
Zend/zend_execute_API.c
Zend/zend_hash.h
Zend/zend_object_handlers.c

index 3c1bd87bac112ad54e7f1cfaa2eeb498ba52c2c0..6dda9effa07732284a0c82def869478b8d1593f3 100644 (file)
@@ -1459,16 +1459,23 @@ ZEND_API zend_array *zend_rebuild_symbol_table(void) /* {{{ */
        if (EG(symtable_cache_ptr) >= EG(symtable_cache)) {
                /*printf("Cache hit!  Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
                symbol_table = ex->symbol_table = *(EG(symtable_cache_ptr)--);
+               if (!ex->func->op_array.last_var) {
+                       return symbol_table;
+               }
+               zend_hash_extend(symbol_table, ex->func->op_array.last_var, 0);
        } else {
                symbol_table = ex->symbol_table = emalloc(sizeof(zend_array));
                zend_hash_init(symbol_table, ex->func->op_array.last_var, NULL, ZVAL_PTR_DTOR, 0);
+               if (!ex->func->op_array.last_var) {
+                       return symbol_table;
+               }
+               zend_hash_real_init(symbol_table, 0);
                /*printf("Cache miss!  Initialized %x\n", EG(active_symbol_table));*/
        }
        for (i = 0; i < ex->func->op_array.last_var; i++) {
-               zval zv;
-
-               ZVAL_INDIRECT(&zv, ZEND_CALL_VAR_NUM(ex, i));
-               zend_hash_add_new(symbol_table, ex->func->op_array.vars[i], &zv);
+               zend_string_addref(ex->func->op_array.vars[i]);
+               _zend_hash_append_ind(symbol_table, ex->func->op_array.vars[i],
+                       ZEND_CALL_VAR_NUM(ex, i));
        }
        return symbol_table;
 }
index 35341945d4b95b6aa66597eabcda64740ccb3943..1a9d613348ccb2bd5d8040bfca1f4685b8576d62 100644 (file)
@@ -841,6 +841,22 @@ static zend_always_inline void _zend_hash_append_ptr(HashTable *ht, zend_string
        ht->nNumOfElements++;
 }
 
+static zend_always_inline void _zend_hash_append_ind(HashTable *ht, zend_string *key, zval *ptr)
+{
+       uint32_t idx = ht->nNumUsed++;
+       uint32_t nIndex;
+       Bucket *p = ht->arData + idx;
+
+       ZVAL_INDIRECT(&p->val, ptr);
+       p->key = key;
+       p->h = key->h;
+       nIndex = p->h & ht->nTableMask;
+       Z_NEXT(p->val) = ht->arHash[nIndex];
+       ht->arHash[nIndex] = idx;
+       ht->nNumUsed = idx + 1;
+       ht->nNumOfElements++;
+}
+
 #endif                                                 /* ZEND_HASH_H */
 
 /*
index 6c0e2f35334b0b5516180f986087407a6adc713a..af604e2675dd790ae0f3f6d5fcad8c8bfdacbb4f 100644 (file)
@@ -77,14 +77,16 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
                ALLOC_HASHTABLE(zobj->properties);
                zend_hash_init(zobj->properties, ce->default_properties_count, NULL, ZVAL_PTR_DTOR, 0);
                if (ce->default_properties_count) {
+                       zend_hash_real_init(zobj->properties, 0);
+                       zobj->properties->nInternalPointer = 0;
                        ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
                                if (/*prop_info->ce == ce &&*/
                                    (prop_info->flags & ZEND_ACC_STATIC) == 0 &&
                                    Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) != IS_UNDEF) {
-                                       zval zv;
 
-                                       ZVAL_INDIRECT(&zv, OBJ_PROP(zobj, prop_info->offset));
-                                       zend_hash_add_new(zobj->properties, prop_info->name, &zv);
+                                       zend_string_addref(prop_info->name);
+                                       _zend_hash_append_ind(zobj->properties, prop_info->name, 
+                                               OBJ_PROP(zobj, prop_info->offset));
                                }
                        } ZEND_HASH_FOREACH_END();
                        while (ce->parent && ce->parent->default_properties_count) {