]> granicus.if.org Git - php/commitdiff
- Start putting error handling where method calls are being used in a
authorAndi Gutmans <andi@php.net>
Sun, 17 Mar 2002 19:13:46 +0000 (19:13 +0000)
committerAndi Gutmans <andi@php.net>
Sun, 17 Mar 2002 19:13:46 +0000 (19:13 +0000)
- context where only writable variables should be used.

Zend/zend_compile.c
Zend/zend_language_parser.y

index 674aa0c429d1525b24f6442c194881ff4635e33d..6ff52c25ff0f608052b599e23b2a0cb0525a2d2e 100644 (file)
@@ -2434,6 +2434,8 @@ void zend_do_add_list_element(znode *element TSRMLS_DC)
        list_llist_element lle;
 
        if (element) {
+               zend_check_writable_variable(element);
+
                lle.var = *element;
                zend_llist_copy(&lle.dimensions, &CG(dimension_llist));
                zend_llist_prepend_element(&CG(list_llist), &lle);
@@ -2624,6 +2626,8 @@ void zend_do_unset(znode *variable, int type TSRMLS_DC)
 {
        zend_op *last_op;
 
+       zend_check_writable_variable(variable);
+
        last_op = &CG(active_op_array)->opcodes[get_next_op_number(CG(active_op_array))-1];
 
        switch (last_op->opcode) {
@@ -2646,10 +2650,8 @@ void zend_do_isset_or_isempty(int type, znode *result, znode *variable TSRMLS_DC
 
        zend_do_end_variable_parse(BP_VAR_IS, 0 TSRMLS_CC);
 
-       /* Check what to do with this later on when adding all of the check writable stuff
-        * zend_check_writable_variable(variable);
-        */
-
+       zend_check_writable_variable(variable);
+       
        last_op = &CG(active_op_array)->opcodes[get_next_op_number(CG(active_op_array))-1];
        
        switch (last_op->opcode) {
index 0e36bc02a51a69c18969463aedf5021660288434..7d0f20fb0227bcca5d7c2614c7c583f837ccd3d9 100644 (file)
@@ -202,7 +202,7 @@ unticked_statement:
        |       expr ';'                                { zend_do_free(&$1 TSRMLS_CC); }
        |       T_USE use_filename ';'          { zend_error(E_COMPILE_ERROR,"use: Not yet supported. Please use include_once() or require_once()");  zval_dtor(&$2.u.constant); }
        |       T_UNSET '(' unset_variables ')' ';'
-       |       T_FOREACH '(' cvar T_AS { zend_do_foreach_begin(&$1, &$3, &$2, &$4, 1 TSRMLS_CC); } w_cvar foreach_optional_arg ')' { zend_do_foreach_cont(&$6, &$7, &$4 TSRMLS_CC); } foreach_statement { zend_do_foreach_end(&$1, &$2 TSRMLS_CC); }
+       |       T_FOREACH '(' variable T_AS { zend_do_foreach_begin(&$1, &$3, &$2, &$4, 1 TSRMLS_CC); } w_cvar foreach_optional_arg ')' { zend_do_foreach_cont(&$6, &$7, &$4 TSRMLS_CC); } foreach_statement { zend_do_foreach_end(&$1, &$2 TSRMLS_CC); }
        |       T_FOREACH '(' expr_without_variable T_AS { zend_do_foreach_begin(&$1, &$3, &$2, &$4, 0 TSRMLS_CC); } w_cvar foreach_optional_arg ')' { zend_do_foreach_cont(&$6, &$7, &$4 TSRMLS_CC); } foreach_statement { zend_do_foreach_end(&$1, &$2 TSRMLS_CC); }
        |       T_DECLARE { zend_do_declare_begin(TSRMLS_C); } '(' declare_list ')' declare_statement { zend_do_declare_end(TSRMLS_C); }
        |       ';'             /* empty statement */
@@ -210,7 +210,7 @@ unticked_statement:
                T_CATCH '(' catch_or_import_class_entry T_VARIABLE ')' { zend_do_begin_catch(&$1, &$8, &$9, 1 TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); }
                additional_catches
        |       T_THROW expr ';' { zend_do_throw(&$2 TSRMLS_CC); }
-       |       T_DELETE  cvar  ';' { zend_do_end_variable_parse(BP_VAR_UNSET, 0 TSRMLS_CC); zend_do_unset(&$1, ZEND_UNSET_OBJ TSRMLS_CC); }
+       |       T_DELETE  variable      ';' { zend_do_end_variable_parse(BP_VAR_UNSET, 0 TSRMLS_CC); zend_do_unset(&$1, ZEND_UNSET_OBJ TSRMLS_CC); }
        |       T_IMPORT { zend_do_begin_import(TSRMLS_C); } import_rule T_FROM catch_or_import_class_entry { zend_do_end_import(&$5 TSRMLS_CC); } ';'
 ;
 
@@ -251,7 +251,7 @@ unset_variables:
 ;
 
 unset_variable:
-               cvar    { zend_do_end_variable_parse(BP_VAR_UNSET, 0 TSRMLS_CC); zend_do_unset(&$1, ZEND_UNSET_REG TSRMLS_CC); }
+               variable        { zend_do_end_variable_parse(BP_VAR_UNSET, 0 TSRMLS_CC); zend_do_unset(&$1, ZEND_UNSET_REG TSRMLS_CC); }
 ;
 
 use_filename:
@@ -647,24 +647,27 @@ expr:
 
 
 r_cvar:
-       cvar { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); $$ = $1; }
+       variable { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); $$ = $1; }
 ;
 
 
 w_cvar:
-       cvar    { zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC); $$ = $1; }
-                       { zend_check_writable_variable(&$$); }
+       variable        { zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC); $$ = $1; }
+                               { zend_check_writable_variable(&$$); }
 ;
 
 rw_cvar:
-       cvar    { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); $$ = $1; }
-                       { zend_check_writable_variable(&$$); }
+       variable        { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); $$ = $1; }
+                               { zend_check_writable_variable(&$$); }
 ;
 
 r_cvar_without_static_member:
                cvar_without_objects { zend_do_end_variable_parse(BP_VAR_R, 0 TSRMLS_CC); $$ = $1; }
 ;
 
+variable:
+               cvar { $$ = $1; }
+;
 
 cvar:
                base_cvar_without_objects T_OBJECT_OPERATOR { zend_do_push_object(&$1 TSRMLS_CC); }
@@ -755,7 +758,7 @@ assignment_list:
 
 
 assignment_list_element:
-               cvar                                                            { zend_do_add_list_element(&$1 TSRMLS_CC); }
+               variable                                                                { zend_do_add_list_element(&$1 TSRMLS_CC); }
        |       T_LIST '(' { zend_do_new_list_begin(TSRMLS_C); } assignment_list ')'    { zend_do_new_list_end(TSRMLS_C); }
        |       /* empty */                                                     { zend_do_add_list_element(NULL TSRMLS_CC); }
 ;
@@ -814,7 +817,7 @@ encaps_var_offset:
 
 internal_functions_in_yacc:
                T_ISSET '(' isset_variables ')' { $$ = $3; }
-       |       T_EMPTY '(' cvar ')'    { zend_do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 TSRMLS_CC); }
+       |       T_EMPTY '(' variable ')'        { zend_do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 TSRMLS_CC); }
        |       T_INCLUDE expr                  { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
        |       T_INCLUDE_ONCE expr     { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }
        |       T_EVAL '(' expr ')'     { zend_do_include_or_eval(ZEND_EVAL, &$$, &$3 TSRMLS_CC); }
@@ -823,8 +826,8 @@ internal_functions_in_yacc:
 ;
 
 isset_variables:
-               cvar                            { zend_do_isset_or_isempty(ZEND_ISSET, &$$, &$1 TSRMLS_CC); }
-       |       isset_variables ',' { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } cvar { znode tmp; zend_do_isset_or_isempty(ZEND_ISSET, &tmp, &$4 TSRMLS_CC); zend_do_boolean_and_end(&$$, &$1, &tmp, &$2 TSRMLS_CC); }
+               variable                                { zend_do_isset_or_isempty(ZEND_ISSET, &$$, &$1 TSRMLS_CC); }
+       |       isset_variables ',' { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } variable { znode tmp; zend_do_isset_or_isempty(ZEND_ISSET, &tmp, &$4 TSRMLS_CC); zend_do_boolean_and_end(&$$, &$1, &tmp, &$2 TSRMLS_CC); }
 ;      
 
 %%