static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
	zend_op *opline = EX(opline);
	zval tmp, *varname;
	HashTable *target_symbol_table;
	zend_free_op free_op1;

	if (IS_VAR == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
		if (EG(active_symbol_table)) {
			zend_execute_data *ex = EX(prev_execute_data);
			zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);

			if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
				while (ex && ex->symbol_table == EG(active_symbol_table)) {
					int i;

					if (ex->op_array) {
						for (i = 0; i < ex->op_array->last_var; i++) {
							if (ex->op_array->vars[i].hash_value == cv->hash_value &&
								ex->op_array->vars[i].name_len == cv->name_len &&
								!memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
								ex->CVs[i] = NULL;
								break;
							}
						}
					}
					ex = ex->prev_execute_data;
				}
			}
			EX(CVs)[opline->op1.u.var] = NULL;
		} else if (EX(CVs)[opline->op1.u.var]) {
			zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
			EX(CVs)[opline->op1.u.var] = NULL;
		}
		ZEND_VM_NEXT_OPCODE();
	}

	varname = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);

	if (Z_TYPE_P(varname) != IS_STRING) {
		tmp = *varname;
		zval_copy_ctor(&tmp);
		convert_to_string(&tmp);
		varname = &tmp;
	} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
		Z_ADDREF_P(varname);
	}

	if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
		zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
	} else {
		ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);

		target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
		if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
			zend_execute_data *ex = execute_data;

			do {
				int i;

				if (ex->op_array) {
					for (i = 0; i < ex->op_array->last_var; i++) {
						if (ex->op_array->vars[i].hash_value == hash_value &&
							ex->op_array->vars[i].name_len == varname->value.str.len &&
							!memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) {
							ex->CVs[i] = NULL;
							break;
						}
					}
				}
				ex = ex->prev_execute_data;
			} while (ex && ex->symbol_table == target_symbol_table);
		}
	}

	if (varname == &tmp) {
		zval_dtor(&tmp);
	} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
		zval_ptr_dtor(&varname);
	}
	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
	ZEND_VM_NEXT_OPCODE();
}
static int ZEND_FASTCALL  ZEND_UNSET_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
	zend_op *opline = EX(opline);
	zval tmp, *varname;
	HashTable *target_symbol_table;
	zend_free_op free_op1;

	if (IS_VAR == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
		if (EG(active_symbol_table)) {
			zend_execute_data *ex = EX(prev_execute_data);
			zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);

			if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
				while (ex && ex->symbol_table == EG(active_symbol_table)) {
					int i;

					if (ex->op_array) {
						for (i = 0; i < ex->op_array->last_var; i++) {
							if (ex->op_array->vars[i].hash_value == cv->hash_value &&
								ex->op_array->vars[i].name_len == cv->name_len &&
								!memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
								ex->CVs[i] = NULL;
								break;
							}
						}
					}
					ex = ex->prev_execute_data;
				}
			}
			EX(CVs)[opline->op1.u.var] = NULL;
		} else if (EX(CVs)[opline->op1.u.var]) {
			zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
			EX(CVs)[opline->op1.u.var] = NULL;
		}
		ZEND_VM_NEXT_OPCODE();
	}

	varname = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);

	if (Z_TYPE_P(varname) != IS_STRING) {
		tmp = *varname;
		zval_copy_ctor(&tmp);
		convert_to_string(&tmp);
		varname = &tmp;
	} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
		Z_ADDREF_P(varname);
	}

	if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
		zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
	} else {
		ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);

		target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
		if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
			zend_execute_data *ex = execute_data;

			do {
				int i;

				if (ex->op_array) {
					for (i = 0; i < ex->op_array->last_var; i++) {
						if (ex->op_array->vars[i].hash_value == hash_value &&
							ex->op_array->vars[i].name_len == varname->value.str.len &&
							!memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) {
							ex->CVs[i] = NULL;
							break;
						}
					}
				}
				ex = ex->prev_execute_data;
			} while (ex && ex->symbol_table == target_symbol_table);
		}
	}

	if (varname == &tmp) {
		zval_dtor(&tmp);
	} else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
		zval_ptr_dtor(&varname);
	}
	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
	ZEND_VM_NEXT_OPCODE();
}