php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #65969
Patch bug65969-2.patch revision 2013-11-27 08:56 UTC by dmitry at zend dot com
revision 2013-11-27 08:55 UTC by dmitry at zend dot com
Patch bug65969.patch revision 2013-11-27 06:32 UTC by laruence@php.net
revision 2013-11-27 05:35 UTC by laruence@php.net
Patch bug65969.phpt revision 2013-11-27 05:39 UTC by laruence@php.net

Patch bug65969-2.patch for Variables related Bug #65969

Patch version 2013-11-27 08:55 UTC

Return to Bug #65969 | Download this patch
This patch is obsolete

Obsoleted by patches:

Patch Revisions: 2013-11-27 08:56 UTC | 2013-11-27 08:55 UTC

Developer: dmitry@zend.com



  +		container = GET_OP1_ZVAL_PTR(BP_VAR_R);
   		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE, BP_VAR_R TSRMLS_CC);
   	}
   	FREE_OP2();
 diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
 index b21f6bf..d8b5f5b 100644
 --- a/Zend/zend_vm_execute.h
 +++ b/Zend/zend_vm_execute.h
 @@ -3483,27 +3483,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_
  {
  	USE_OPLINE
  
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_CONST != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_CONST == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
 -		zval *container = opline->op1.zv;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 -
 -
 -	} else {
 -		container = NULL;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 -
 +	container = opline->op1.zv;
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
  
 -	}
  
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
 @@ -4506,27 +4496,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HA
  {
  	USE_OPLINE
  	zend_free_op free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_CONST != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_CONST == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
 -		zval *container = opline->op1.zv;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 -		zval_dtor(free_op2.var);
 -
 -	} else {
 -		container = NULL;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 -		zval_dtor(free_op2.var);
 -
 -	}
 +	container = opline->op1.zv;
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 +	zval_dtor(free_op2.var);
  
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
 @@ -5370,27 +5350,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HA
  {
  	USE_OPLINE
  	zend_free_op free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_CONST != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_CONST == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
 -		zval *container = opline->op1.zv;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 -		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 -
 -	} else {
 -		container = NULL;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 -		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 -
 -	}
 +	container = opline->op1.zv;
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 +	if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
  
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
 @@ -6955,27 +6925,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HAN
  {
  	USE_OPLINE
  
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_CONST != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_CONST == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_CONST == IS_TMP_VAR || IS_CONST == IS_CONST) {
 -		zval *container = opline->op1.zv;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 -
 -
 -	} else {
 -		container = NULL;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 -
 +	container = opline->op1.zv;
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
  
 -	}
  
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
 @@ -8864,28 +8824,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HA
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_TMP_VAR != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_TMP_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
 -		zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 -
 -		zval_dtor(free_op1.var);
 -	} else {
 -		container = NULL;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 -
 -
 -	}
 +	container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
  
 +	zval_dtor(free_op1.var);
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
  }
 @@ -9752,28 +9702,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HAND
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_TMP_VAR != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 -	}
 -
 -	if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
 -		zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 -		zval_dtor(free_op2.var);
 -		zval_dtor(free_op1.var);
 -	} else {
 -		container = NULL;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 -		zval_dtor(free_op2.var);
 -
 +	if (IS_TMP_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 +	container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 +	zval_dtor(free_op2.var);
 +	zval_dtor(free_op1.var);
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
  }
 @@ -10618,28 +10558,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HAND
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_TMP_VAR != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 -	}
 -
 -	if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
 -		zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 -		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 -		zval_dtor(free_op1.var);
 -	} else {
 -		container = NULL;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 -		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 -
 +	if (IS_TMP_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 +	container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 +	if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 +	zval_dtor(free_op1.var);
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
  }
 @@ -12064,28 +11994,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDL
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_TMP_VAR != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_TMP_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_TMP_VAR == IS_TMP_VAR || IS_TMP_VAR == IS_CONST) {
 -		zval *container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 -
 -		zval_dtor(free_op1.var);
 -	} else {
 -		container = NULL;
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 -
 -
 -	}
 +	container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
  
 +	zval_dtor(free_op1.var);
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
  }
 @@ -14771,28 +14691,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HA
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_VAR != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
 -		zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 -
 -		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 -	} else {
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 -
 -		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 -	}
 +	container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
  
 +	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
  }
 @@ -14857,10 +14767,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_H
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
 -	container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_IS TSRMLS_CC);
  
  	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 @@ -14872,12 +14782,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -14886,10 +14795,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OP
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_CONST == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
  	}
  
 @@ -17120,28 +17030,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAND
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_VAR != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 -	}
 -
 -	if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
 -		zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 -		zval_dtor(free_op2.var);
 -		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 -	} else {
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 -		zval_dtor(free_op2.var);
 -		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 +	if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 +	container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 +	zval_dtor(free_op2.var);
 +	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
  }
 @@ -17206,10 +17106,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HAN
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
 -	container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_IS TSRMLS_CC);
  	zval_dtor(free_op2.var);
  	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 @@ -17221,12 +17121,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -17235,10 +17134,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCO
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_TMP_VAR == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
  	}
  	zval_dtor(free_op2.var);
 @@ -19376,28 +19276,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAND
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_VAR != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 -	}
 -
 -	if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
 -		zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 -		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 -		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 -	} else {
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 -		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 -		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 +	if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 +	container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 +	if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 +	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
  }
 @@ -19462,10 +19352,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HAN
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
 -	container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC);
  	if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
  	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 @@ -19477,12 +19367,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -19491,10 +19380,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCO
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_VAR == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
  	}
  	if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 @@ -21424,12 +21314,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -21438,10 +21327,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_O
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_UNUSED == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
  	}
  
 @@ -22834,28 +22724,18 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDL
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_VAR != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_VAR == IS_TMP_VAR || IS_VAR == IS_CONST) {
 -		zval *container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 -
 -		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 -	} else {
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 -
 -		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 -	}
 +	container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
  
 +	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
  }
 @@ -22920,10 +22800,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HAND
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
 -	container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +	container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_IS TSRMLS_CC);
  
  	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 @@ -22935,12 +22815,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -22949,10 +22828,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCOD
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_CV == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
 +		container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
  	}
  
 @@ -32213,27 +32093,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAN
  {
  	USE_OPLINE
  
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_CV != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
 -		zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 -
 -
 -	} else {
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
 -
 +	container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
  
 -	}
  
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
 @@ -32298,10 +32168,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HA
  {
  	USE_OPLINE
  
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
 -	container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
 +	container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
  	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_IS TSRMLS_CC);
  
  
 @@ -32313,12 +32183,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPC
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
  		if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -32327,10 +32196,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPC
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_CONST == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 +		container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
  	}
  
 @@ -34327,27 +34197,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDL
  {
  	USE_OPLINE
  	zend_free_op free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_CV != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
 -		zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 -		zval_dtor(free_op2.var);
 -
 -	} else {
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 -		zval_dtor(free_op2.var);
 -
 -	}
 +	container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
 +	zval_dtor(free_op2.var);
  
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
 @@ -34412,10 +34272,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HAND
  {
  	USE_OPLINE
  	zend_free_op free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
 -	container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
 +	container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
  	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_IS TSRMLS_CC);
  	zval_dtor(free_op2.var);
  
 @@ -34427,12 +34287,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCOD
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
  		if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -34441,10 +34300,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCOD
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_TMP_VAR == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 +		container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
  	}
  	zval_dtor(free_op2.var);
 @@ -36445,27 +36305,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDL
  {
  	USE_OPLINE
  	zend_free_op free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_CV != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
 -		zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 -		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 -
 -	} else {
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 -		if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 -
 -	}
 +	container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
 +	if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
  
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
 @@ -36530,10 +36380,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HAND
  {
  	USE_OPLINE
  	zend_free_op free_op2;
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
 -	container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
 +	container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
  	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC);
  	if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
  
 @@ -36545,12 +36395,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD
  {
  	USE_OPLINE
  	zend_free_op free_op1, free_op2;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
  		if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -36559,10 +36408,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCOD
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_VAR == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 +		container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
  	}
  	if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
 @@ -38353,12 +38203,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OP
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
  		if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -38367,10 +38216,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OP
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_UNUSED == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 +		container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
  	}
  
 @@ -39616,27 +39466,17 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLE
  {
  	USE_OPLINE
  
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
  
 -	if ((opline->extended_value & ZEND_FETCH_ADD_LOCK) &&
 -	    IS_CV != IS_CV &&
 -	    EX_T(opline->op1.var).var.ptr_ptr) {
 -		PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
 +	if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
 +		PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
  	}
  
 -	if (IS_CV == IS_TMP_VAR || IS_CV == IS_CONST) {
 -		zval *container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), &container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 -
 -
 -	} else {
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 -		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
 -
 +	container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 +	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
  
 -	}
  
  	CHECK_EXCEPTION();
  	ZEND_VM_NEXT_OPCODE();
 @@ -39701,10 +39541,10 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDL
  {
  	USE_OPLINE
  
 -	zval **container;
 +	zval *container;
  
  	SAVE_OPLINE();
 -	container = _get_zval_ptr_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
 +	container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
  	zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_IS TSRMLS_CC);
  
  
 @@ -39716,12 +39556,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE
  {
  	USE_OPLINE
  	zend_free_op free_op1;
 -	zval **container;
  
  	SAVE_OPLINE();
  
  	if (ARG_SHOULD_BE_SENT_BY_REF(EX(call)->fbc, (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
 +		zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(execute_data, opline->op1.var TSRMLS_CC);
  		if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
  			zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
  		}
 @@ -39730,10 +39569,11 @@ static int ZEND_FASTCALL  ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE
  			EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
  		}
  	} else {
 +		zval *container;
  		if (IS_CV == IS_UNUSED) {
  			zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
  		}
 -		container = _get_zval_ptr_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
 +		container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
  		zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
  	}
  
 diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c
 index 6c83f28..daa79c7 100644
 --- a/sapi/cgi/cgi_main.c
 +++ b/sapi/cgi/cgi_main.c
 @@ -154,6 +154,7 @@ static const opt_struct OPTIONS[] = {
  	{'?', 0, "usage"},/* help alias (both '?' and 'usage') */
  	{'v', 0, "version"},
  	{'z', 1, "zend-extension"},
 + 	{'W', 1, "warmup"},
   	{'T', 1, "timing"},
  	{'-', 0, NULL} /* end of args */
  };
 @@ -1754,6 +1755,7 @@ int main(int argc, char *argv[])
  	int fcgi_fd = 0;
  	fcgi_request *request = NULL;
  	int repeats = 1;
 +	int warmup_repeats = 0;
  	int benchmark = 0;
  #if HAVE_GETTIMEOFDAY
  	struct timeval start, end;
 @@ -2103,6 +2105,9 @@ consult the installation file that came with this distribution, or visit \n\
  					time(&start);
  #endif
  					break;
 +				case 'W':
 +					warmup_repeats = atoi(php_optarg);
 +					break;
  				case 'h':
  				case '?':
  					if (request) {
 @@ -2516,12 +2521,24 @@ fastcgi_request_done:
  
  			if (!fastcgi) {
  				if (benchmark) {
 -					repeats--;
 -					if (repeats > 0) {
 -						script_file = NULL;
 -						php_optind = orig_optind;
 -						php_optarg = orig_optarg;
 +					if (warmup_repeats) {
 +						warmup_repeats--;
 +						if (!warmup_repeats) {
 +#ifdef HAVE_GETTIMEOFDAY
 +							gettimeofday(&start, NULL);
 +#else
 +							time(&start);						
 +#endif
 +						}
  						continue;
 +					} else {
 +						repeats--;
 +						if (repeats > 0) {
 +							script_file = NULL;
 +							php_optind = orig_optind;
 +							php_optarg = orig_optarg;
 +							continue;
 +						}
  					}
  				}
  				break;
 
PHP Copyright © 2001-2022 The PHP Group
All rights reserved.
Last updated: Mon Jan 24 06:03:34 2022 UTC