summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2002-11-10 17:50:27 +0000
committerStanislav Malyshev <stas@php.net>2002-11-10 17:50:27 +0000
commit830c2e0df6f6813217fc1bc224eeb78674530ae3 (patch)
treeb7cfe16ce725aedfa16823a95bb1cc0ff62a66e8
parent8e6cd6361ca53d7271c232f6d4b5400c9c643e45 (diff)
downloadphp-git-830c2e0df6f6813217fc1bc224eeb78674530ae3.tar.gz
fix statics - make it behave like $this (fetch type "static")
Side effect: indirect references to statics won't work.
-rw-r--r--Zend/zend_compile.c49
-rw-r--r--Zend/zend_compile.h3
-rw-r--r--Zend/zend_language_parser.y12
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); }
;