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;
}
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 */
/*
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) {