From 830c2e0df6f6813217fc1bc224eeb78674530ae3 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Sun, 10 Nov 2002 17:50:27 +0000 Subject: [PATCH] fix statics - make it behave like $this (fetch type "static") Side effect: indirect references to statics won't work. --- Zend/zend_compile.c | 49 ++++++++++++++++++++++--------------- Zend/zend_compile.h | 3 ++- Zend/zend_language_parser.y | 12 ++++----- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index dfd78fe72a..52ed878eae 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -285,11 +285,15 @@ void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar *result = opline_ptr->result; SET_UNUSED(opline_ptr->op2); - if (varname->op_type == IS_CONST && varname->u.constant.type == IS_STRING - && zend_hash_exists(CG(auto_globals), varname->u.constant.value.str.val, varname->u.constant.value.str.len+1)) { - opline_ptr->op2.u.EA.type = ZEND_FETCH_GLOBAL; - } else { - opline_ptr->op2.u.EA.type = ZEND_FETCH_LOCAL; + opline_ptr->op2.u.EA.type = ZEND_FETCH_LOCAL; + if (varname->op_type == IS_CONST && varname->u.constant.type == IS_STRING) { + if(zend_hash_exists(CG(auto_globals), varname->u.constant.value.str.val, varname->u.constant.value.str.len+1)) { + opline_ptr->op2.u.EA.type = ZEND_FETCH_GLOBAL; + } else { + if(CG(active_op_array)->static_variables && zend_hash_exists(CG(active_op_array)->static_variables, varname->u.constant.value.str.val, varname->u.constant.value.str.len+1)) { + opline_ptr->op2.u.EA.type = ZEND_FETCH_STATIC; + } + } } if (bp) { @@ -2557,27 +2561,32 @@ void zend_do_list_end(znode *result, znode *expr TSRMLS_DC) } } - -void zend_do_fetch_global_or_static_variable(znode *varname, znode *static_assignment, int fetch_type TSRMLS_DC) +void zend_do_fetch_static_variable(znode *varname, znode *static_assignment, int fetch_type TSRMLS_DC) { - zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); - znode lval; - znode result; - - if (fetch_type==ZEND_FETCH_STATIC && static_assignment) { - zval *tmp; + zval *tmp; - ALLOC_ZVAL(tmp); - convert_to_string(&varname->u.constant); + ALLOC_ZVAL(tmp); + convert_to_string(&varname->u.constant); + if(static_assignment) { *tmp = static_assignment->u.constant; - if (!CG(active_op_array)->static_variables) { - ALLOC_HASHTABLE(CG(active_op_array)->static_variables); - zend_hash_init(CG(active_op_array)->static_variables, 2, NULL, ZVAL_PTR_DTOR, 0); - } - zend_hash_update(CG(active_op_array)->static_variables, varname->u.constant.value.str.val, varname->u.constant.value.str.len+1, &tmp, sizeof(zval *), NULL); + } else { + INIT_ZVAL(*tmp); + } + if (!CG(active_op_array)->static_variables) { + ALLOC_HASHTABLE(CG(active_op_array)->static_variables); + zend_hash_init(CG(active_op_array)->static_variables, 2, NULL, ZVAL_PTR_DTOR, 0); } + zend_hash_update(CG(active_op_array)->static_variables, varname->u.constant.value.str.val, varname->u.constant.value.str.len+1, &tmp, sizeof(zval *), NULL); + zval_dtor(&varname->u.constant); +} +void zend_do_fetch_global_variable(znode *varname, znode *static_assignment, int fetch_type TSRMLS_DC) +{ + zend_op *opline; + znode lval; + znode result; + opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_FETCH_W; /* the default mode must be Write, since fetch_simple_variable() is used to define function arguments */ opline->result.op_type = IS_VAR; opline->result.u.EA.type = 0; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 606760efd6..14a5029c68 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -247,7 +247,8 @@ void zend_do_assign_ref(znode *result, znode *lvar, znode *rvar TSRMLS_DC); void fetch_simple_variable(znode *result, znode *varname, int bp TSRMLS_DC); void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar op TSRMLS_DC); void zend_do_indirect_references(znode *result, znode *num_references, znode *variable TSRMLS_DC); -void zend_do_fetch_global_or_static_variable(znode *varname, znode *static_assignment, int fetch_type TSRMLS_DC); +void zend_do_fetch_static_variable(znode *varname, znode *static_assignment, int fetch_type TSRMLS_DC); +void zend_do_fetch_global_variable(znode *varname, znode *static_assignment, int fetch_type TSRMLS_DC); void fetch_array_begin(znode *result, znode *varname, znode *first_dim TSRMLS_DC); void fetch_array_dim(znode *result, znode *parent, znode *dim TSRMLS_DC); diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index e2dae8de0d..8609c16a71 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -408,8 +408,8 @@ non_empty_function_call_parameter_list: ; global_var_list: - global_var_list ',' global_var { zend_do_fetch_global_or_static_variable(&$3, NULL, ZEND_FETCH_GLOBAL TSRMLS_CC); } - | global_var { zend_do_fetch_global_or_static_variable(&$1, NULL, ZEND_FETCH_GLOBAL TSRMLS_CC); } + global_var_list ',' global_var { zend_do_fetch_global_variable(&$3, NULL, ZEND_FETCH_GLOBAL TSRMLS_CC); } + | global_var { zend_do_fetch_global_variable(&$1, NULL, ZEND_FETCH_GLOBAL TSRMLS_CC); } ; @@ -421,10 +421,10 @@ global_var: static_var_list: - static_var_list ',' T_VARIABLE { zend_do_fetch_global_or_static_variable(&$3, NULL, ZEND_FETCH_STATIC TSRMLS_CC); } - | static_var_list ',' T_VARIABLE '=' static_scalar { zend_do_fetch_global_or_static_variable(&$3, &$5, ZEND_FETCH_STATIC TSRMLS_CC); } - | T_VARIABLE { zend_do_fetch_global_or_static_variable(&$1, NULL, ZEND_FETCH_STATIC TSRMLS_CC); } - | T_VARIABLE '=' static_scalar { zend_do_fetch_global_or_static_variable(&$1, &$3, ZEND_FETCH_STATIC TSRMLS_CC); } + static_var_list ',' T_VARIABLE { zend_do_fetch_static_variable(&$3, NULL, ZEND_FETCH_STATIC TSRMLS_CC); } + | static_var_list ',' T_VARIABLE '=' static_scalar { zend_do_fetch_static_variable(&$3, &$5, ZEND_FETCH_STATIC TSRMLS_CC); } + | T_VARIABLE { zend_do_fetch_static_variable(&$1, NULL, ZEND_FETCH_STATIC TSRMLS_CC); } + | T_VARIABLE '=' static_scalar { zend_do_fetch_static_variable(&$1, &$3, ZEND_FETCH_STATIC TSRMLS_CC); } ; -- 2.40.0