Refactored EG(active_symbol_table) to be zend_array* instead of HashTable*

This commit is contained in:
Dmitry Stogov 2014-03-17 23:15:22 +04:00
parent 1b6327fd3b
commit aa5f55306b
18 changed files with 97 additions and 90 deletions

View File

@ -1184,8 +1184,8 @@ ZEND_API void zend_error(int type, const char *format, ...) /* {{{ */
if (!EG(active_symbol_table)) {
ZVAL_NULL(&params[4]);
} else {
array_init_size(&params[4], zend_hash_num_elements(EG(active_symbol_table)));
zend_hash_copy(Z_ARRVAL(params[4]), EG(active_symbol_table), zval_add_ref);
array_init_size(&params[4], zend_hash_num_elements(&EG(active_symbol_table)->ht));
zend_hash_copy(Z_ARRVAL(params[4]), &EG(active_symbol_table)->ht, zval_add_ref);
}
ZVAL_COPY_VALUE(&orig_user_error_handler, &EG(user_error_handler));

View File

@ -44,7 +44,7 @@ typedef struct _zend_fcall_info {
size_t size;
HashTable *function_table;
zval function_name;
HashTable *symbol_table;
zend_array *symbol_table;
zval *retval;
zend_uint param_count;
zval *params;
@ -452,7 +452,7 @@ ZEND_API int add_property_zval_ex(zval *arg, const char *key, uint key_len, zval
ZEND_API int call_user_function(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, zend_uint param_count, zval params[] TSRMLS_DC);
ZEND_API int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, zend_uint param_count, zval params[], int no_separation, HashTable *symbol_table TSRMLS_DC);
ZEND_API int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, zend_uint param_count, zval params[], int no_separation, zend_array *symbol_table TSRMLS_DC);
ZEND_API extern const zend_fcall_info empty_fcall_info;
ZEND_API extern const zend_fcall_info_cache empty_fcall_info_cache;
@ -519,7 +519,7 @@ ZEND_API void zend_delete_variable(zend_execute_data *ex, HashTable *ht, zend_st
ZEND_API int zend_delete_global_variable(zend_string *name TSRMLS_DC);
ZEND_API void zend_reset_all_cv(HashTable *symbol_table TSRMLS_DC);
ZEND_API void zend_reset_all_cv(zend_array *symbol_table TSRMLS_DC);
ZEND_API void zend_rebuild_symbol_table(TSRMLS_D);

View File

@ -1726,9 +1726,9 @@ ZEND_FUNCTION(get_defined_vars)
zend_rebuild_symbol_table(TSRMLS_C);
}
array_init_size(return_value, zend_hash_num_elements(EG(active_symbol_table)));
array_init_size(return_value, zend_hash_num_elements(&EG(active_symbol_table)->ht));
zend_hash_copy(Z_ARRVAL_P(return_value), EG(active_symbol_table), zval_add_ref);
zend_hash_copy(Z_ARRVAL_P(return_value), &EG(active_symbol_table)->ht, zval_add_ref);
}
/* }}} */

View File

@ -379,7 +379,7 @@ struct _zend_execute_data {
zend_function_state function_state;
zend_op_array *op_array;
zval object;
HashTable *symbol_table;
zend_array *symbol_table;
struct _zend_execute_data *prev_execute_data;
zval old_error_reporting;
zend_bool nested;

View File

@ -212,7 +212,7 @@ static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, zend_uint var, int
zval *ret = NULL;
if (EG(active_symbol_table)) {
ret = zend_hash_find(EG(active_symbol_table), cv);
ret = zend_hash_find(&EG(active_symbol_table)->ht, cv);
if (ret) {
ZVAL_INDIRECT(ptr, ret);
return ret;
@ -231,7 +231,7 @@ static zend_never_inline zval *_get_zval_cv_lookup(zval *ptr, zend_uint var, int
/* break missing intentionally */
case BP_VAR_W:
if (EG(active_symbol_table)) {
ret = zend_hash_update(EG(active_symbol_table), cv, ret);
ret = zend_hash_update(&EG(active_symbol_table)->ht, cv, ret);
ZVAL_INDIRECT(ptr, ret);
} else {
ZVAL_NULL(ptr);
@ -248,7 +248,7 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_R(zval *ptr, zend_uint
zval *ret = NULL;
if (EG(active_symbol_table)) {
ret = zend_hash_find(EG(active_symbol_table), cv);
ret = zend_hash_find(&EG(active_symbol_table)->ht, cv);
if (ret) {
ZVAL_INDIRECT(ptr, ret);
return ret;
@ -265,7 +265,7 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_UNSET(zval *ptr, zend_
zval *ret;
if (EG(active_symbol_table)) {
ret = zend_hash_find(EG(active_symbol_table), cv);
ret = zend_hash_find(&EG(active_symbol_table)->ht, cv);
if (ret) {
ZVAL_INDIRECT(ptr, ret);
return ret;
@ -282,7 +282,7 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_IS(zval *ptr, zend_uin
zval *ret;
if (EG(active_symbol_table)) {
ret = zend_hash_find(EG(active_symbol_table), cv);
ret = zend_hash_find(&EG(active_symbol_table)->ht, cv);
if (ret) {
ZVAL_INDIRECT(ptr, ret);
return ret;
@ -298,12 +298,12 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_RW(zval *ptr, zend_uin
zval *ret;
if (EG(active_symbol_table)) {
ret = zend_hash_find(EG(active_symbol_table), cv);
ret = zend_hash_find(&EG(active_symbol_table)->ht, cv);
if (ret) {
ZVAL_INDIRECT(ptr, ret);
return ret;
}
ret = zend_hash_update(EG(active_symbol_table), cv, &EG(uninitialized_zval));
ret = zend_hash_update(&EG(active_symbol_table)->ht, cv, &EG(uninitialized_zval));
ZVAL_INDIRECT(ptr, ret);
zend_error(E_NOTICE, "Undefined variable: %s", cv->val);
return ret;
@ -320,12 +320,12 @@ static zend_never_inline zval *_get_zval_cv_lookup_BP_VAR_W(zval *ptr, zend_uint
zval *ret;
if (EG(active_symbol_table)) {
ret = zend_hash_find(EG(active_symbol_table), cv);
ret = zend_hash_find(&EG(active_symbol_table)->ht, cv);
if (ret) {
ZVAL_INDIRECT(ptr, ret);
return ret;
}
ret = zend_hash_update(EG(active_symbol_table), cv, &EG(uninitialized_zval));
ret = zend_hash_update(&EG(active_symbol_table)->ht, cv, &EG(uninitialized_zval));
ZVAL_INDIRECT(ptr, ret);
return ret;
} else {
@ -1060,7 +1060,7 @@ static inline HashTable *zend_get_target_symbol_table(int fetch_type TSRMLS_DC)
if (!EG(active_symbol_table)) {
zend_rebuild_symbol_table(TSRMLS_C);
}
return EG(active_symbol_table);
return &EG(active_symbol_table)->ht;
break;
case ZEND_FETCH_GLOBAL:
case ZEND_FETCH_GLOBAL_LOCK:
@ -1570,15 +1570,15 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, zend_fcall_i
}
}
void zend_clean_and_cache_symbol_table(HashTable *symbol_table TSRMLS_DC) /* {{{ */
void zend_clean_and_cache_symbol_table(zend_array *symbol_table TSRMLS_DC) /* {{{ */
{
if (EG(symtable_cache_ptr) >= EG(symtable_cache_limit)) {
zend_hash_destroy(symbol_table);
FREE_HASHTABLE(symbol_table);
zend_hash_destroy(&symbol_table->ht);
efree(symbol_table);
} else {
/* clean before putting into the cache, since clean
could call dtors, which could use cached hash */
zend_hash_clean(symbol_table);
zend_hash_clean(&symbol_table->ht);
*(++EG(symtable_cache_ptr)) = symbol_table;
}
}
@ -1732,7 +1732,7 @@ static zend_always_inline zend_execute_data *i_create_execute_data_from_op_array
ZVAL_COPY(EX_VAR_NUM(op_array->this_var), &EG(This));
} else {
ZVAL_COPY(EX_VAR_NUM(op_array->this_var), &EG(This));
zval *zv = zend_hash_str_add(EG(active_symbol_table), "this", sizeof("this")-1, EX_VAR(op_array->this_var));
zval *zv = zend_hash_str_add(&EG(active_symbol_table)->ht, "this", sizeof("this")-1, EX_VAR(op_array->this_var));
if (zv) {
ZVAL_INDIRECT(EX_VAR_NUM(op_array->this_var), zv);
}

View File

@ -374,7 +374,7 @@ ZEND_API zval *zend_get_zval_ptr(int op_type, const znode_op *node, const zend_e
ZEND_API int zend_do_fcall(ZEND_OPCODE_HANDLER_ARGS);
void zend_clean_and_cache_symbol_table(HashTable *symbol_table TSRMLS_DC);
void zend_clean_and_cache_symbol_table(zend_array *symbol_table TSRMLS_DC);
void zend_free_compiled_variables(zend_execute_data *execute_data TSRMLS_DC);
#define CACHED_PTR(num) \

View File

@ -157,7 +157,7 @@ void init_executor(TSRMLS_D) /* {{{ */
zend_vm_stack_push(&tmp TSRMLS_CC);
zend_hash_init(&EG(symbol_table).ht, 50, NULL, ZVAL_PTR_DTOR, 0);
EG(active_symbol_table) = &EG(symbol_table).ht;
EG(active_symbol_table) = &EG(symbol_table);
zend_llist_apply(&zend_extensions, (llist_apply_func_t) zend_extension_activator TSRMLS_CC);
EG(opline_ptr) = NULL;
@ -302,8 +302,8 @@ void shutdown_executor(TSRMLS_D) /* {{{ */
}
while (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
zend_hash_destroy(*EG(symtable_cache_ptr));
FREE_HASHTABLE(*EG(symtable_cache_ptr));
zend_hash_destroy(&(*EG(symtable_cache_ptr))->ht);
efree(*EG(symtable_cache_ptr));
EG(symtable_cache_ptr)--;
}
} zend_end_try();
@ -714,7 +714,7 @@ int call_user_function(HashTable *function_table, zval *object, zval *function_n
}
/* }}} */
int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, zend_uint param_count, zval params[], int no_separation, HashTable *symbol_table TSRMLS_DC) /* {{{ */
int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, zend_uint param_count, zval params[], int no_separation, zend_array *symbol_table TSRMLS_DC) /* {{{ */
{
zend_fcall_info fci;
@ -735,7 +735,7 @@ int call_user_function_ex(HashTable *function_table, zval *object, zval *functio
int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TSRMLS_DC) /* {{{ */
{
zend_uint i;
HashTable *calling_symbol_table;
zend_array *calling_symbol_table;
zend_op_array *original_op_array;
zend_op **original_opline_ptr;
zend_class_entry *current_scope;
@ -1636,7 +1636,7 @@ void zend_verify_abstract_class(zend_class_entry *ce TSRMLS_DC) /* {{{ */
}
/* }}} */
ZEND_API void zend_reset_all_cv(HashTable *symbol_table TSRMLS_DC) /* {{{ */
ZEND_API void zend_reset_all_cv(zend_array *symbol_table TSRMLS_DC) /* {{{ */
{
zend_execute_data *ex;
int i;
@ -1654,7 +1654,7 @@ ZEND_API void zend_reset_all_cv(HashTable *symbol_table TSRMLS_DC) /* {{{ */
ZEND_API void zend_delete_variable(zend_execute_data *ex, HashTable *ht, zend_string *name TSRMLS_DC) /* {{{ */
{
if (zend_hash_del(ht, name) == SUCCESS) {
while (ex && ex->symbol_table == ht) {
while (ex && &ex->symbol_table->ht == ht) {
int i;
if (ex->op_array) {
@ -1679,7 +1679,7 @@ ZEND_API int zend_delete_global_variable(zend_string *name TSRMLS_DC) /* {{{ */
if (zend_hash_del(&EG(symbol_table).ht, name) == SUCCESS) {
for (ex = EG(current_execute_data); ex; ex = ex->prev_execute_data) {
if (ex->op_array && ex->symbol_table == &EG(symbol_table).ht) {
if (ex->op_array && ex->symbol_table == &EG(symbol_table)) {
int i;
for (i = 0; i < ex->op_array->last_var; i++) {
if (ex->op_array->vars[i]->h == name->h &&
@ -1720,8 +1720,10 @@ ZEND_API void zend_rebuild_symbol_table(TSRMLS_D) /* {{{ */
/*printf("Cache hit! Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
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);
EG(active_symbol_table) = emalloc(sizeof(zend_array));
EG(active_symbol_table)->gc.refcount = 0;
EG(active_symbol_table)->gc.u.v.type = IS_ARRAY;
zend_hash_init(&EG(active_symbol_table)->ht, ex->op_array->last_var, NULL, ZVAL_PTR_DTOR, 0);
/*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/
}
ex->symbol_table = EG(active_symbol_table);
@ -1733,7 +1735,7 @@ 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),
zval *zv = zend_hash_update(&EG(active_symbol_table)->ht,
ex->op_array->vars[i],
EX_VAR_NUM_2(ex, i));
ZVAL_INDIRECT(EX_VAR_NUM_2(ex, i), zv);

View File

@ -245,7 +245,7 @@ ZEND_API void zend_generator_create_zval(zend_op_array *op_array, zval *return_v
zend_generator *generator;
zend_execute_data *current_execute_data;
zend_op **opline_ptr;
HashTable *current_symbol_table;
zend_array *current_symbol_table;
zend_execute_data *execute_data;
zend_vm_stack current_stack = EG(argument_stack);
@ -335,7 +335,7 @@ ZEND_API void zend_generator_resume(zend_generator *generator TSRMLS_DC) /* {{{
zend_execute_data *original_execute_data = EG(current_execute_data);
zend_op **original_opline_ptr = EG(opline_ptr);
zend_op_array *original_active_op_array = EG(active_op_array);
HashTable *original_active_symbol_table = EG(active_symbol_table);
zend_array *original_active_symbol_table = EG(active_symbol_table);
zval original_This;
zend_class_entry *original_scope = EG(scope);
zend_class_entry *original_called_scope = EG(called_scope);

View File

@ -162,13 +162,13 @@ struct _zend_executor_globals {
zval error_zval;
/* symbol table cache */
HashTable *symtable_cache[SYMTABLE_CACHE_SIZE];
HashTable **symtable_cache_limit;
HashTable **symtable_cache_ptr;
zend_array *symtable_cache[SYMTABLE_CACHE_SIZE];
zend_array **symtable_cache_limit;
zend_array **symtable_cache_ptr;
zend_op **opline_ptr;
HashTable *active_symbol_table;
zend_array *active_symbol_table;
zend_array symbol_table; /* main symbol table */
HashTable included_files; /* files already included */

View File

@ -306,13 +306,13 @@ ZEND_API int zval_copy_static_var(zval *p TSRMLS_DC, int num_args, va_list args,
if (!EG(active_symbol_table)) {
zend_rebuild_symbol_table(TSRMLS_C);
}
p = zend_hash_find(EG(active_symbol_table), key->key);
p = zend_hash_find(&EG(active_symbol_table)->ht, key->key);
if (!p) {
p = &tmp;
ZVAL_NULL(&tmp);
if (is_ref) {
ZVAL_NEW_REF(&tmp, &tmp);
zend_hash_add(EG(active_symbol_table), key->key, &tmp);
zend_hash_add(&EG(active_symbol_table)->ht, key->key, &tmp);
} else {
zend_error(E_NOTICE,"Undefined variable: %s", key->key->val);
}

View File

@ -3032,7 +3032,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV)
ZVAL_OBJ(EX_VAR_NUM(opline->op2.var), EG(exception));
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op2.var);
zval *zv = zend_hash_update(EG(active_symbol_table), cv, EX_VAR_NUM(opline->op2.var));
zval *zv = zend_hash_update(&EG(active_symbol_table)->ht, cv, EX_VAR_NUM(opline->op2.var));
ZVAL_INDIRECT(EX_VAR_NUM(opline->op2.var), zv);
}
if (UNEXPECTED(EG(exception) != exception)) {
@ -4066,7 +4066,7 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -4615,7 +4615,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {

View File

@ -4090,7 +4090,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HA
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -4176,7 +4176,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -5754,7 +5754,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAND
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -5840,7 +5840,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -6429,7 +6429,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_H
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -6515,7 +6515,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -7196,7 +7196,7 @@ static int ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
ZVAL_OBJ(EX_VAR_NUM(opline->op2.var), EG(exception));
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op2.var);
zval *zv = zend_hash_update(EG(active_symbol_table), cv, EX_VAR_NUM(opline->op2.var));
zval *zv = zend_hash_update(&EG(active_symbol_table)->ht, cv, EX_VAR_NUM(opline->op2.var));
ZVAL_INDIRECT(EX_VAR_NUM(opline->op2.var), zv);
}
if (UNEXPECTED(EG(exception) != exception)) {
@ -9149,7 +9149,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAND
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -9235,7 +9235,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -10800,7 +10800,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLE
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -10886,7 +10886,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -11364,7 +11364,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HAN
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -11450,7 +11450,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -15625,7 +15625,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -15859,7 +15859,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -20166,7 +20166,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -20400,7 +20400,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -21592,7 +21592,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -21678,7 +21678,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -32829,7 +32829,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -33061,7 +33061,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -37119,7 +37119,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -37351,7 +37351,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {
@ -38425,7 +38425,7 @@ static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAND
if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv TSRMLS_CC);
zend_delete_variable(EX(prev_execute_data), &EG(active_symbol_table)->ht, cv TSRMLS_CC);
ZVAL_UNDEF(EX_VAR_NUM(opline->op1.var));
} else if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
zval_ptr_dtor(EX_VAR_NUM(opline->op1.var));
@ -38511,7 +38511,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
if ((value = zend_hash_find(EG(active_symbol_table), cv)) == NULL) {
if ((value = zend_hash_find(&EG(active_symbol_table)->ht, cv)) == NULL) {
isset = 0;
}
} else {

View File

@ -1338,7 +1338,7 @@ PHP_FUNCTION(extract)
var_exists = 0;
if (key_type == HASH_KEY_IS_STRING) {
var_exists = zend_hash_exists(EG(active_symbol_table), var_name);
var_exists = zend_hash_exists(&EG(active_symbol_table)->ht, var_name);
} else if (key_type == HASH_KEY_IS_LONG && (extract_type == EXTR_PREFIX_ALL || extract_type == EXTR_PREFIX_INVALID)) {
zval num;
@ -1409,15 +1409,15 @@ PHP_FUNCTION(extract)
SEPARATE_ZVAL_TO_MAKE_IS_REF(entry);
Z_ADDREF_P(entry);
if ((orig_var = zend_hash_find(EG(active_symbol_table), Z_STR(final_name))) != NULL) {
if ((orig_var = zend_hash_find(&EG(active_symbol_table)->ht, Z_STR(final_name))) != NULL) {
zval_ptr_dtor(orig_var);
ZVAL_COPY_VALUE(orig_var, entry);
} else {
zend_hash_update(EG(active_symbol_table), Z_STR(final_name), entry);
zend_hash_update(&EG(active_symbol_table)->ht, Z_STR(final_name), entry);
}
} else {
ZVAL_DUP(&data, entry);
ZEND_SET_SYMBOL_WITH_LENGTH(EG(active_symbol_table), Z_STRVAL(final_name), Z_STRLEN(final_name), &data, 1, 0);
ZEND_SET_SYMBOL_WITH_LENGTH(&EG(active_symbol_table)->ht, Z_STRVAL(final_name), Z_STRLEN(final_name), &data, 1, 0);
}
count++;
}
@ -1489,7 +1489,7 @@ PHP_FUNCTION(compact)
}
for (i=0; i<ZEND_NUM_ARGS(); i++) {
php_compact_var(EG(active_symbol_table), return_value, &args[i] TSRMLS_CC);
php_compact_var(&EG(active_symbol_table)->ht, return_value, &args[i] TSRMLS_CC);
}
}
/* }}} */
@ -2043,7 +2043,7 @@ PHP_FUNCTION(array_unshift)
new_hash = php_splice(Z_ARRVAL_P(stack), 0, 0, &args[0], argc, NULL);
old_hash = *Z_ARRVAL_P(stack);
if (Z_ARRVAL_P(stack) == &EG(symbol_table).ht) {
zend_reset_all_cv(&EG(symbol_table).ht TSRMLS_CC);
zend_reset_all_cv(&EG(symbol_table) TSRMLS_CC);
}
*Z_ARRVAL_P(stack) = *new_hash;
FREE_HASHTABLE(new_hash);
@ -2126,7 +2126,7 @@ PHP_FUNCTION(array_splice)
/* Replace input array's hashtable with the new one */
old_hash = *Z_ARRVAL_P(array);
if (Z_ARRVAL_P(array) == &EG(symbol_table).ht) {
zend_reset_all_cv(&EG(symbol_table).ht TSRMLS_CC);
zend_reset_all_cv(&EG(symbol_table) TSRMLS_CC);
}
*Z_ARRVAL_P(array) = *new_hash;
FREE_HASHTABLE(new_hash);
@ -2789,7 +2789,7 @@ PHP_FUNCTION(array_pad)
/* Copy the result hash into return value */
old_hash = *Z_ARRVAL_P(return_value);
if (Z_ARRVAL_P(return_value) == &EG(symbol_table).ht) {
zend_reset_all_cv(&EG(symbol_table).ht TSRMLS_CC);
zend_reset_all_cv(&EG(symbol_table) TSRMLS_CC);
}
*Z_ARRVAL_P(return_value) = *new_hash;
FREE_HASHTABLE(new_hash);

View File

@ -659,10 +659,10 @@ finish:
if (header_init) {
zval ztmp;
array_init(&ztmp);
ZEND_SET_SYMBOL(EG(active_symbol_table), "http_response_header", &ztmp);
ZEND_SET_SYMBOL(&EG(active_symbol_table)->ht, "http_response_header", &ztmp);
}
response_header = zend_hash_str_find(EG(active_symbol_table), "http_response_header", sizeof("http_response_header")-1);
response_header = zend_hash_str_find(&EG(active_symbol_table)->ht, "http_response_header", sizeof("http_response_header")-1);
if (!php_stream_eof(stream)) {
size_t tmp_line_len;

View File

@ -4420,7 +4420,7 @@ PHP_FUNCTION(parse_str)
if (!EG(active_symbol_table)) {
zend_rebuild_symbol_table(TSRMLS_C);
}
//??? Z_ARRVAL(tmp) = EG(active_symbol_table);
ZVAL_ARR(&tmp, EG(active_symbol_table));
sapi_module.treat_data(PARSE_STRING, res, &tmp TSRMLS_CC);
} else {
zval ret;
@ -4428,6 +4428,9 @@ PHP_FUNCTION(parse_str)
array_init(&ret);
sapi_module.treat_data(PARSE_STRING, res, &ret TSRMLS_CC);
/* Clear out the array that was passed in. */
if (Z_ISREF_P(arrayArg)) {
arrayArg = Z_REFVAL_P(arrayArg);
}
zval_dtor(arrayArg);
ZVAL_COPY_VALUE(arrayArg, &ret);
}

View File

@ -863,7 +863,7 @@ PHPAPI void php_verror(const char *docref, const char *params, int type, const c
if (EG(active_symbol_table)) {
zval tmp;
ZVAL_STRINGL(&tmp, buffer, buffer_len);
zend_hash_str_update(EG(active_symbol_table), "php_errormsg", sizeof("php_errormsg")-1, &tmp);
zend_hash_str_update(&EG(active_symbol_table)->ht, "php_errormsg", sizeof("php_errormsg")-1, &tmp);
}
}
if (replace_buffer) {
@ -1195,7 +1195,7 @@ static void php_error_cb(int type, const char *error_filename, const uint error_
if (EG(active_symbol_table)) {
zval tmp;
ZVAL_STRINGL(&tmp, buffer, buffer_len);
zend_hash_str_update(EG(active_symbol_table), "php_errormsg", sizeof("php_errormsg")-1, &tmp);
zend_hash_str_update(&EG(active_symbol_table)->ht, "php_errormsg", sizeof("php_errormsg")-1, &tmp);
}
}

View File

@ -67,7 +67,7 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars
assert(var_name != NULL);
if (track_vars_array) {
if (track_vars_array && Z_TYPE_P(track_vars_array) == IS_ARRAY) {
symtable1 = Z_ARRVAL_P(track_vars_array);
}
@ -110,7 +110,8 @@ PHPAPI void php_register_variable_ex(char *var_name, zval *val, zval *track_vars
}
/* GLOBALS hijack attempt, reject parameter */
if (symtable1 == EG(active_symbol_table) &&
if (symtable1 && EG(active_symbol_table) &&
symtable1 == &EG(active_symbol_table)->ht &&
var_len == sizeof("GLOBALS")-1 &&
!memcmp(var, "GLOBALS", sizeof("GLOBALS")-1)) {
zval_dtor(val);
@ -353,6 +354,7 @@ SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
char *strtok_buf = NULL;
long count = 0;
ZVAL_UNDEF(&array);
switch (arg) {
case PARSE_POST:
case PARSE_GET:

View File

@ -92,13 +92,13 @@ PHPDBG_INFO(vars) /* {{{ */
zend_hash_init(&vars, 8, NULL, NULL, 0);
zend_hash_internal_pointer_reset_ex(EG(active_symbol_table), &pos);
while (zend_hash_get_current_key_ex(EG(active_symbol_table), &var, NULL, 0, &pos) == HASH_KEY_IS_STRING) {
data = zend_hash_get_current_data_ex(EG(active_symbol_table), &pos);
zend_hash_internal_pointer_reset_ex(&EG(active_symbol_table)->ht, &pos);
while (zend_hash_get_current_key_ex(&EG(active_symbol_table)->ht, &var, NULL, 0, &pos) == HASH_KEY_IS_STRING) {
data = zend_hash_get_current_data_ex(&EG(active_symbol_table)->ht, &pos);
if (*(var->val) != '_') {
zend_hash_update(&vars, var, data);
}
zend_hash_move_forward_ex(EG(active_symbol_table), &pos);
zend_hash_move_forward_ex(&EG(active_symbol_table)->ht, &pos);
}
{