From: Dmitry Stogov Date: Fri, 6 Mar 2015 16:23:54 +0000 (+0300) Subject: Use fast zend_hash_append() API X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~782 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9f9ffdd0a022138056608d1e21e57b09fb120fae;p=php Use fast zend_hash_append() API --- diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 3c1bd87bac..6dda9effa0 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -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; } diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 35341945d4..1a9d613348 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -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 */ /* diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 6c0e2f3533..af604e2675 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -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) {