]> granicus.if.org Git - php/commitdiff
fix statics - make it behave like $this (fetch type "static")
authorStanislav Malyshev <stas@php.net>
Sun, 10 Nov 2002 17:50:27 +0000 (17:50 +0000)
committerStanislav Malyshev <stas@php.net>
Sun, 10 Nov 2002 17:50:27 +0000 (17:50 +0000)
Side effect: indirect references to statics won't work.

Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_language_parser.y

index dfd78fe72a49951d9755e9b0404bd6fa1088a88f..52ed878eaed216652779c41d727de500ffab8eb3 100644 (file)
@@ -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;
index 606760efd6b744a3da456e2e16f84a78b1c33b3c..14a5029c686ba81886f5264c230382bb60fbd891 100644 (file)
@@ -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);
index e2dae8de0d3a3bb153b4bdfaf2eb52ca84e97180..8609c16a71a87881a9c7bddc2f76f4f8e3c51bb4 100644 (file)
@@ -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); }
 
 ;