@@ -847,55 +847,56 @@ void zend_do_end_variable_parse(int type, int arg_offset TSRMLS_DC)
847
847
zend_llist * fetch_list_ptr ;
848
848
zend_llist_element * le ;
849
849
zend_op * opline , * opline_ptr = NULL ;
850
- int num_of_created_opcodes = 0 ;
851
850
852
851
zend_stack_top (& CG (bp_stack ), (void * * ) & fetch_list_ptr );
853
852
854
853
le = fetch_list_ptr -> head ;
855
854
856
855
/* TODO: $foo->x->y->z = 1 should fetch "x" and "y" for R or RW, not just W */
857
856
858
- while (le ) {
857
+ if (le ) {
859
858
opline_ptr = (zend_op * )le -> data ;
860
- opline = get_next_op (CG (active_op_array ) TSRMLS_CC );
861
- memcpy (opline , opline_ptr , sizeof (zend_op ));
862
- switch (type ) {
863
- case BP_VAR_R :
864
- if (opline -> opcode == ZEND_FETCH_DIM_W && opline -> op2 .op_type == IS_UNUSED ) {
865
- zend_error (E_COMPILE_ERROR , "Cannot use [] for reading" );
866
- }
867
- opline -> opcode -= 3 ;
868
- break ;
869
- case BP_VAR_W :
870
- break ;
871
- case BP_VAR_RW :
872
- opline -> opcode += 3 ;
873
- break ;
874
- case BP_VAR_IS :
875
- if (opline -> opcode == ZEND_FETCH_DIM_W && opline -> op2 .op_type == IS_UNUSED ) {
876
- zend_error (E_COMPILE_ERROR , "Cannot use [] for reading" );
877
- }
878
- opline -> opcode += 6 ; /* 3+3 */
879
- break ;
880
- case BP_VAR_FUNC_ARG :
881
- opline -> opcode += 9 ; /* 3+3+3 */
882
- opline -> extended_value = arg_offset ;
883
- break ;
884
- case BP_VAR_UNSET :
885
- if (opline -> opcode == ZEND_FETCH_DIM_W && opline -> op2 .op_type == IS_UNUSED ) {
886
- zend_error (E_COMPILE_ERROR , "Cannot use [] for unsetting" );
887
- }
888
- opline -> opcode += 12 ; /* 3+3+3+3 */
889
- break ;
859
+ if (opline_is_fetch_this (opline_ptr TSRMLS_CC )) {
860
+ CG (active_op_array )-> uses_this = 1 ;
890
861
}
891
- le = le -> next ;
892
- num_of_created_opcodes ++ ;
893
- }
894
862
895
- if (num_of_created_opcodes == 1 && opline_is_fetch_this (opline_ptr TSRMLS_CC )) {
896
- CG (active_op_array )-> uses_this = 1 ;
863
+ while (1 ) {
864
+ opline = get_next_op (CG (active_op_array ) TSRMLS_CC );
865
+ memcpy (opline , opline_ptr , sizeof (zend_op ));
866
+ switch (type ) {
867
+ case BP_VAR_R :
868
+ if (opline -> opcode == ZEND_FETCH_DIM_W && opline -> op2 .op_type == IS_UNUSED ) {
869
+ zend_error (E_COMPILE_ERROR , "Cannot use [] for reading" );
870
+ }
871
+ opline -> opcode -= 3 ;
872
+ break ;
873
+ case BP_VAR_W :
874
+ break ;
875
+ case BP_VAR_RW :
876
+ opline -> opcode += 3 ;
877
+ break ;
878
+ case BP_VAR_IS :
879
+ if (opline -> opcode == ZEND_FETCH_DIM_W && opline -> op2 .op_type == IS_UNUSED ) {
880
+ zend_error (E_COMPILE_ERROR , "Cannot use [] for reading" );
881
+ }
882
+ opline -> opcode += 6 ; /* 3+3 */
883
+ break ;
884
+ case BP_VAR_FUNC_ARG :
885
+ opline -> opcode += 9 ; /* 3+3+3 */
886
+ opline -> extended_value = arg_offset ;
887
+ break ;
888
+ case BP_VAR_UNSET :
889
+ if (opline -> opcode == ZEND_FETCH_DIM_W && opline -> op2 .op_type == IS_UNUSED ) {
890
+ zend_error (E_COMPILE_ERROR , "Cannot use [] for unsetting" );
891
+ }
892
+ opline -> opcode += 12 ; /* 3+3+3+3 */
893
+ break ;
894
+ }
895
+ le = le -> next ;
896
+ if (le == NULL ) break ;
897
+ opline_ptr = (zend_op * )le -> data ;
898
+ }
897
899
}
898
-
899
900
zend_llist_destroy (fetch_list_ptr );
900
901
zend_stack_del_top (& CG (bp_stack ));
901
902
}
0 commit comments