summaryrefslogtreecommitdiff
path: root/Zend/zend_execute_API.c
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2014-03-10 16:25:05 +0800
committerXinchen Hui <laruence@gmail.com>2014-03-10 16:25:05 +0800
commit60c354510b6731ec8348af9c5e230a4859c7c383 (patch)
tree120d38937c49bd2e9336177c0c151181f716c13a /Zend/zend_execute_API.c
parent80625f20e59a195966d721bb467ce8cbf54bf807 (diff)
downloadphp-git-60c354510b6731ec8348af9c5e230a4859c7c383.tar.gz
An demo(for review) to show how to fix the problem(symbol table resize)
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r--Zend/zend_execute_API.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 8faba97fc7..2d6cc38d92 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -156,7 +156,7 @@ void init_executor(TSRMLS_D) /* {{{ */
ZVAL_LONG(&tmp, 0);
zend_vm_stack_push(&tmp TSRMLS_CC);
- zend_hash_init(&EG(symbol_table).ht, 50, NULL, ZVAL_PTR_DTOR, 0);
+ zend_hash_init(&EG(symbol_table).ht, 50, NULL, ZVAL_INDIRECT_PTR_DTOR, 0);
EG(active_symbol_table) = &EG(symbol_table).ht;
zend_llist_apply(&zend_extensions, (llist_apply_func_t) zend_extension_activator TSRMLS_CC);
@@ -426,6 +426,16 @@ ZEND_API void _zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) /* {{{ */
}
/* }}} */
+ZEND_API void zval_indirect_ptr_dtor(zval *zval_ptr) /* {{{ */
+{
+ if (Z_TYPE_P(zval_ptr) == IS_INDIRECT) {
+ zval_ptr = Z_INDIRECT_P(zval_ptr);
+ }
+ zval_ptr_dtor(zval_ptr);
+}
+
+/* }}} */
+
ZEND_API void _zval_internal_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) /* {{{ */
{
if (Z_REFCOUNTED_P(zval_ptr)) {
@@ -1716,7 +1726,7 @@ ZEND_API void zend_rebuild_symbol_table(TSRMLS_D) /* {{{ */
EG(active_symbol_table) = *(EG(symtable_cache_ptr)--);
} else {
ALLOC_HASHTABLE(EG(active_symbol_table));
- zend_hash_init(EG(active_symbol_table), ex->op_array->last_var, NULL, ZVAL_PTR_DTOR, 0);
+ zend_hash_init(EG(active_symbol_table), ex->op_array->last_var, NULL, ZVAL_INDIRECT_PTR_DTOR, 0);
/*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/
}
ex->symbol_table = EG(active_symbol_table);
@@ -1728,10 +1738,9 @@ ZEND_API void zend_rebuild_symbol_table(TSRMLS_D) /* {{{ */
}
for (i = 0; i < ex->op_array->last_var; i++) {
if (Z_TYPE_P(EX_VAR_NUM_2(ex, i)) != IS_UNDEF) {
- zval *zv = zend_hash_update(EG(active_symbol_table),
- ex->op_array->vars[i],
- EX_VAR_NUM_2(ex, i));
- ZVAL_INDIRECT(EX_VAR_NUM_2(ex, i), zv);
+ zval zv;
+ ZVAL_INDIRECT(&zv, EX_VAR_NUM_2(ex, i));
+ zend_hash_update(EG(active_symbol_table), ex->op_array->vars[i], &zv);
}
}
}