diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2014-11-25 01:22:59 +0300 | 
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2014-11-25 01:22:59 +0300 | 
| commit | a271c7a5cf77b83e54dbecb9d86099bb88d537e5 (patch) | |
| tree | 695b31dba527a81c32d41240369e59401536185c | |
| parent | d7808ddae423c43b64622bb19b97938fa773028e (diff) | |
| download | php-git-a271c7a5cf77b83e54dbecb9d86099bb88d537e5.tar.gz | |
Use specialized destructors when types of zvals are known.
| -rw-r--r-- | Zend/zend_vm_def.h | 33 | ||||
| -rw-r--r-- | Zend/zend_vm_execute.h | 274 | 
2 files changed, 158 insertions, 149 deletions
| diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index cd748b73f0..95968d8ac6 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -385,7 +385,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -711,7 +711,7 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR|  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -798,7 +798,7 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -2080,7 +2080,7 @@ ZEND_VM_HANDLER(56, ZEND_ADD_VAR, TMP|UNUSED, TMP|VAR|CV)  	add_string_to_string(str, str, var);  	if (use_copy) { -		zval_dtor(var); +		zend_string_release(Z_STR_P(var));  	}  	/* original comment, possibly problematic:  	 * FREE_OP is missing intentionally here - we're always working on the same temporary variable @@ -2980,9 +2980,7 @@ ZEND_VM_HANDLER(107, ZEND_CATCH, CONST, CV)  	}  	exception = EG(exception); -	if (Z_REFCOUNTED_P(EX_VAR(opline->op2.var))) { -		zval_ptr_dtor(EX_VAR(opline->op2.var)); -	} +	zval_ptr_dtor(EX_VAR(opline->op2.var));  	ZVAL_OBJ(EX_VAR(opline->op2.var), EG(exception));  	if (UNEXPECTED(EG(exception) != exception)) {  		GC_REFCOUNT(EG(exception))++; @@ -3269,7 +3267,7 @@ ZEND_VM_C_LABEL(send_again):  					if (Z_TYPE(key) == IS_STRING) {  						zend_error(E_RECOVERABLE_ERROR,  							"Cannot unpack Traversable with string keys"); -						zval_dtor(&key); +						zend_string_release(Z_STR(key));  						ZEND_VM_C_GOTO(unpack_iter_dtor);  					} @@ -3721,7 +3719,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, CONST|VAR, ANY)  		if (RETURN_VALUE_USED(opline)) {  			ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &object_zval);  		} else { -			zval_ptr_dtor(&object_zval); +			OBJ_RELEASE(Z_OBJ(object_zval));  		}  		ZEND_VM_JMP(opline->op2.jmp_addr);  	} else { @@ -3799,7 +3797,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMP|VAR|UNUSED|CV, ANY)  	if (EXPECTED(EG(exception) == NULL)) {  		ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));  		if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) { -			zval_ptr_dtor(EX_VAR(opline->result.var)); +			OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));  		}  	}  	FREE_OP1_IF_VAR(); @@ -4206,7 +4204,7 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY)  		}  	}  	if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) { -		zval_ptr_dtor(&tmp_inc_filename); +		zend_string_release(Z_STR(tmp_inc_filename));  	}  	FREE_OP1();  	if (UNEXPECTED(EG(exception) != NULL)) { @@ -4297,8 +4295,8 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (OP1_TYPE != IS_CONST) { -						zval_dtor(&tmp); +					if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					FREE_OP1();  					HANDLE_EXCEPTION(); @@ -4317,8 +4315,8 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (OP1_TYPE != IS_CONST) { -		zval_dtor(&tmp); +	if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	FREE_OP1();  	CHECK_EXCEPTION(); @@ -4901,6 +4899,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)  		zend_free_op free_op1;  		zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_IS); +		ZVAL_UNDEF(&tmp);  		if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -4929,8 +4928,8 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (OP1_TYPE != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		FREE_OP1(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a1f7a3ffc2..cd4a91f27a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -798,7 +798,7 @@ send_again:  					if (Z_TYPE(key) == IS_STRING) {  						zend_error(E_RECOVERABLE_ERROR,  							"Cannot unpack Traversable with string keys"); -						zval_dtor(&key); +						zend_string_release(Z_STR(key));  						goto unpack_iter_dtor;  					} @@ -2766,7 +2766,7 @@ static int ZEND_FASTCALL  ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)  		if (RETURN_VALUE_USED(opline)) {  			ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &object_zval);  		} else { -			zval_ptr_dtor(&object_zval); +			OBJ_RELEASE(Z_OBJ(object_zval));  		}  		ZEND_VM_JMP(opline->op2.jmp_addr);  	} else { @@ -2844,7 +2844,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS  	if (EXPECTED(EG(exception) == NULL)) {  		ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));  		if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) { -			zval_ptr_dtor(EX_VAR(opline->result.var)); +			OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));  		}  	} @@ -3032,7 +3032,7 @@ static int ZEND_FASTCALL  ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HA  		}  	}  	if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) { -		zval_ptr_dtor(&tmp_inc_filename); +		zend_string_release(Z_STR(tmp_inc_filename));  	}  	if (UNEXPECTED(EG(exception) != NULL)) { @@ -4602,8 +4602,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HA  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_CONST != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					HANDLE_EXCEPTION(); @@ -4622,8 +4622,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HA  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_CONST != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	CHECK_EXCEPTION(); @@ -4654,6 +4654,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O  		zval tmp, *varname = opline->op1.zv; +		ZVAL_UNDEF(&tmp);  		if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -4682,8 +4683,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_CONST != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		if (opline->extended_value & ZEND_ISSET) { @@ -7104,8 +7105,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAND  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_CONST != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					HANDLE_EXCEPTION(); @@ -7124,8 +7125,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HAND  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_CONST != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	CHECK_EXCEPTION(); @@ -7156,6 +7157,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC  		zval tmp, *varname = opline->op1.zv; +		ZVAL_UNDEF(&tmp);  		if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -7184,8 +7186,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_CONST != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		if (opline->extended_value & ZEND_ISSET) { @@ -7969,8 +7971,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_H  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_CONST != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					HANDLE_EXCEPTION(); @@ -7989,8 +7991,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_H  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_CONST != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	CHECK_EXCEPTION(); @@ -8021,6 +8023,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_  		zval tmp, *varname = opline->op1.zv; +		ZVAL_UNDEF(&tmp);  		if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -8049,8 +8052,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_CONST != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		if (opline->extended_value & ZEND_ISSET) { @@ -8921,9 +8924,7 @@ static int ZEND_FASTCALL  ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A  	}  	exception = EG(exception); -	if (Z_REFCOUNTED_P(EX_VAR(opline->op2.var))) { -		zval_ptr_dtor(EX_VAR(opline->op2.var)); -	} +	zval_ptr_dtor(EX_VAR(opline->op2.var));  	ZVAL_OBJ(EX_VAR(opline->op2.var), EG(exception));  	if (UNEXPECTED(EG(exception) != exception)) {  		GC_REFCOUNT(EG(exception))++; @@ -9807,7 +9808,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)  	if (EXPECTED(EG(exception) == NULL)) {  		ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));  		if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) { -			zval_ptr_dtor(EX_VAR(opline->result.var)); +			OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));  		}  	} @@ -9996,7 +9997,7 @@ static int ZEND_FASTCALL  ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HAND  		}  	}  	if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) { -		zval_ptr_dtor(&tmp_inc_filename); +		zend_string_release(Z_STR(tmp_inc_filename));  	}  	zval_ptr_dtor_nogc(free_op1);  	if (UNEXPECTED(EG(exception) != NULL)) { @@ -11433,8 +11434,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAND  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_TMP_VAR != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					zval_ptr_dtor_nogc(free_op1);  					HANDLE_EXCEPTION(); @@ -11453,8 +11454,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HAND  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_TMP_VAR != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	zval_ptr_dtor_nogc(free_op1);  	CHECK_EXCEPTION(); @@ -11485,6 +11486,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC  		zend_free_op free_op1;  		zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); +		ZVAL_UNDEF(&tmp);  		if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -11513,8 +11515,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_TMP_VAR != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		zval_ptr_dtor_nogc(free_op1); @@ -12375,7 +12377,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_  	add_string_to_string(str, str, var);  	if (use_copy) { -		zval_dtor(var); +		zend_string_release(Z_STR_P(var));  	}  	/* original comment, possibly problematic:  	 * FREE_OP is missing intentionally here - we're always working on the same temporary variable @@ -13585,7 +13587,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_  	add_string_to_string(str, str, var);  	if (use_copy) { -		zval_dtor(var); +		zend_string_release(Z_STR_P(var));  	}  	/* original comment, possibly problematic:  	 * FREE_OP is missing intentionally here - we're always working on the same temporary variable @@ -13888,8 +13890,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLE  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_TMP_VAR != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					zval_ptr_dtor_nogc(free_op1);  					HANDLE_EXCEPTION(); @@ -13908,8 +13910,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLE  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_TMP_VAR != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	zval_ptr_dtor_nogc(free_op1);  	CHECK_EXCEPTION(); @@ -13940,6 +13942,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD  		zend_free_op free_op1;  		zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); +		ZVAL_UNDEF(&tmp);  		if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -13968,8 +13971,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_TMP_VAR != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		zval_ptr_dtor_nogc(free_op1); @@ -14669,8 +14672,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HAN  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_TMP_VAR != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					zval_ptr_dtor_nogc(free_op1);  					HANDLE_EXCEPTION(); @@ -14689,8 +14692,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HAN  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_TMP_VAR != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	zval_ptr_dtor_nogc(free_op1);  	CHECK_EXCEPTION(); @@ -14721,6 +14724,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP  		zend_free_op free_op1;  		zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); +		ZVAL_UNDEF(&tmp);  		if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -14749,8 +14753,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_TMP_VAR != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_TMP_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		zval_ptr_dtor_nogc(free_op1); @@ -15410,7 +15414,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_A  	add_string_to_string(str, str, var);  	if (use_copy) { -		zval_dtor(var); +		zend_string_release(Z_STR_P(var));  	}  	/* original comment, possibly problematic:  	 * FREE_OP is missing intentionally here - we're always working on the same temporary variable @@ -16715,7 +16719,7 @@ static int ZEND_FASTCALL  ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)  		if (RETURN_VALUE_USED(opline)) {  			ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &object_zval);  		} else { -			zval_ptr_dtor(&object_zval); +			OBJ_RELEASE(Z_OBJ(object_zval));  		}  		ZEND_VM_JMP(opline->op2.jmp_addr);  	} else { @@ -16793,7 +16797,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)  	if (EXPECTED(EG(exception) == NULL)) {  		ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));  		if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) { -			zval_ptr_dtor(EX_VAR(opline->result.var)); +			OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));  		}  	}  	zval_ptr_dtor_nogc(free_op1); @@ -16983,7 +16987,7 @@ static int ZEND_FASTCALL  ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND  		}  	}  	if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) { -		zval_ptr_dtor(&tmp_inc_filename); +		zend_string_release(Z_STR(tmp_inc_filename));  	}  	zval_ptr_dtor_nogc(free_op1);  	if (UNEXPECTED(EG(exception) != NULL)) { @@ -18003,7 +18007,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(int (*b  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -18326,7 +18330,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -18412,7 +18416,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -19600,8 +19604,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_VAR != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					zval_ptr_dtor_nogc(free_op1);  					HANDLE_EXCEPTION(); @@ -19620,8 +19624,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAND  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_VAR != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	zval_ptr_dtor_nogc(free_op1);  	CHECK_EXCEPTION(); @@ -19765,6 +19769,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC  		zend_free_op free_op1;  		zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); +		ZVAL_UNDEF(&tmp);  		if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -19793,8 +19798,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_VAR != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		zval_ptr_dtor_nogc(free_op1); @@ -20482,7 +20487,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(int (*bin  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -20808,7 +20813,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t i  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -20895,7 +20900,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -22508,7 +22513,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -22834,7 +22839,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -22921,7 +22926,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -24049,8 +24054,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_VAR != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					zval_ptr_dtor_nogc(free_op1);  					HANDLE_EXCEPTION(); @@ -24069,8 +24074,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLE  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_VAR != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	zval_ptr_dtor_nogc(free_op1);  	CHECK_EXCEPTION(); @@ -24214,6 +24219,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD  		zend_free_op free_op1;  		zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); +		ZVAL_UNDEF(&tmp);  		if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -24242,8 +24248,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_VAR != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		zval_ptr_dtor_nogc(free_op1); @@ -24658,7 +24664,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (*  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -25507,8 +25513,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_VAR != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					zval_ptr_dtor_nogc(free_op1);  					HANDLE_EXCEPTION(); @@ -25527,8 +25533,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAN  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_VAR != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	zval_ptr_dtor_nogc(free_op1);  	CHECK_EXCEPTION(); @@ -25559,6 +25565,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP  		zend_free_op free_op1;  		zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); +		ZVAL_UNDEF(&tmp);  		if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -25587,8 +25594,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_VAR != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_VAR != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		zval_ptr_dtor_nogc(free_op1); @@ -26095,7 +26102,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(int (*bina  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -26418,7 +26425,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t in  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -26504,7 +26511,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t i  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -27890,7 +27897,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARG  	if (EXPECTED(EG(exception) == NULL)) {  		ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));  		if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) { -			zval_ptr_dtor(EX_VAR(opline->result.var)); +			OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));  		}  	} @@ -27979,7 +27986,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(int  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -28301,7 +28308,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(incde  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -28387,7 +28394,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incd  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -29380,7 +29387,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(int (*  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -29705,7 +29712,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(incdec_  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -29792,7 +29799,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMP(incdec  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -30092,7 +30099,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDL  	add_string_to_string(str, str, var);  	if (use_copy) { -		zval_dtor(var); +		zend_string_release(Z_STR_P(var));  	}  	/* original comment, possibly problematic:  	 * FREE_OP is missing intentionally here - we're always working on the same temporary variable @@ -30699,7 +30706,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -31024,7 +31031,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -31111,7 +31118,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -31411,7 +31418,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDL  	add_string_to_string(str, str, var);  	if (use_copy) { -		zval_dtor(var); +		zend_string_release(Z_STR_P(var));  	}  	/* original comment, possibly problematic:  	 * FREE_OP is missing intentionally here - we're always working on the same temporary variable @@ -32018,7 +32025,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(int  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -32510,7 +32517,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(int (*b  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -32832,7 +32839,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(incdec_t  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -32918,7 +32925,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -33215,7 +33222,7 @@ static int ZEND_FASTCALL  ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLE  	add_string_to_string(str, str, var);  	if (use_copy) { -		zval_dtor(var); +		zend_string_release(Z_STR_P(var));  	}  	/* original comment, possibly problematic:  	 * FREE_OP is missing intentionally here - we're always working on the same temporary variable @@ -34512,7 +34519,7 @@ static int ZEND_FASTCALL  ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)  	if (EXPECTED(EG(exception) == NULL)) {  		ZVAL_OBJ(EX_VAR(opline->result.var), clone_call(obj TSRMLS_CC));  		if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) { -			zval_ptr_dtor(EX_VAR(opline->result.var)); +			OBJ_RELEASE(Z_OBJ_P(EX_VAR(opline->result.var)));  		}  	} @@ -34700,7 +34707,7 @@ static int ZEND_FASTCALL  ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL  		}  	}  	if (Z_TYPE(tmp_inc_filename) != IS_UNDEF) { -		zval_ptr_dtor(&tmp_inc_filename); +		zend_string_release(Z_STR(tmp_inc_filename));  	}  	if (UNEXPECTED(EG(exception) != NULL)) { @@ -35468,7 +35475,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(int (*bi  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -35790,7 +35797,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(incdec_t  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -35876,7 +35883,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(incdec_t  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -36840,8 +36847,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_CV != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					HANDLE_EXCEPTION(); @@ -36860,8 +36867,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDL  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_CV != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	CHECK_EXCEPTION(); @@ -37005,6 +37012,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO  		zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); +		ZVAL_UNDEF(&tmp);  		if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -37033,8 +37041,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_CV != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		if (opline->extended_value & ZEND_ISSET) { @@ -37776,7 +37784,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMP(int (*bina  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -38101,7 +38109,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMP(incdec_t in  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -38188,7 +38196,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMP(incdec_t i  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -39674,7 +39682,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -39999,7 +40007,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -40086,7 +40094,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -41087,8 +41095,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_CV != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					HANDLE_EXCEPTION(); @@ -41107,8 +41115,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_CV != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	CHECK_EXCEPTION(); @@ -41252,6 +41260,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE  		zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); +		ZVAL_UNDEF(&tmp);  		if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -41280,8 +41289,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_CV != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		if (opline->extended_value & ZEND_ISSET) { @@ -41694,7 +41703,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(int (*b  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -42418,8 +42427,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAND  			} else {  				ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);  				if (UNEXPECTED(EG(exception) != NULL)) { -					if (IS_CV != IS_CONST) { -						zval_dtor(&tmp); +					if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +						zend_string_release(Z_STR(tmp));  					}  					HANDLE_EXCEPTION(); @@ -42438,8 +42447,8 @@ static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAND  		zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));  	} -	if (IS_CV != IS_CONST) { -		zval_dtor(&tmp); +	if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +		zend_string_release(Z_STR(tmp));  	}  	CHECK_EXCEPTION(); @@ -42470,6 +42479,7 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC  		zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC); +		ZVAL_UNDEF(&tmp);  		if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {  			ZVAL_STR(&tmp, zval_get_string(varname));  			varname = &tmp; @@ -42498,8 +42508,8 @@ static int ZEND_FASTCALL  ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC  			value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));  		} -		if (IS_CV != IS_CONST && varname == &tmp) { -			zval_dtor(&tmp); +		if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) { +			zend_string_release(Z_STR(tmp));  		}  		if (opline->extended_value & ZEND_ISSET) { @@ -42986,7 +42996,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(int (*binar  					zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  					if (Z_REFCOUNT_P(z) == 0) { -						zval_dtor(z); +						zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  					}  					ZVAL_COPY_VALUE(z, value);  				} @@ -43308,7 +43318,7 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CV(incdec_t inc  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} @@ -43394,7 +43404,7 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(incdec_t in  				zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);  				if (Z_REFCOUNT_P(z) == 0) { -					zval_dtor(z); +					zend_objects_store_del(Z_OBJ_P(z) TSRMLS_CC);  				}  				ZVAL_COPY_VALUE(z, value);  			} | 
