@@ -4251,29 +4251,37 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
4251
4251
zval tmp , * varname ;
4252
4252
HashTable * target_symbol_table ;
4253
4253
zend_free_op free_op1 ;
4254
- zend_bool tmp_is_dup = 0 ;
4255
4254
4256
4255
SAVE_OPLINE ();
4257
4256
if (OP1_TYPE == IS_CV &&
4258
4257
OP2_TYPE == IS_UNUSED &&
4259
4258
(opline -> extended_value & ZEND_QUICK_SET )) {
4260
- ZVAL_COPY_VALUE (& tmp , EX_VAR (opline -> op1 .var ));
4261
- ZVAL_UNDEF (EX_VAR (opline -> op1 .var ));
4262
- zval_ptr_dtor (& tmp );
4259
+ zval * var = EX_VAR (opline -> op1 .var );
4260
+
4261
+ if (Z_REFCOUNTED_P (var )) {
4262
+ zend_refcounted * garbage = Z_COUNTED_P (var );
4263
+
4264
+ if (!-- GC_REFCOUNT (garbage )) {
4265
+ ZVAL_UNDEF (var );
4266
+ _zval_dtor_func_for_ptr (garbage ZEND_FILE_LINE_CC );
4267
+ } else {
4268
+ GC_ZVAL_CHECK_POSSIBLE_ROOT (var );
4269
+ ZVAL_UNDEF (var );
4270
+ }
4271
+ } else {
4272
+ ZVAL_UNDEF (var );
4273
+ }
4263
4274
CHECK_EXCEPTION ();
4264
4275
ZEND_VM_NEXT_OPCODE ();
4265
4276
}
4266
4277
4267
4278
varname = GET_OP1_ZVAL_PTR (BP_VAR_R );
4268
4279
4280
+ ZVAL_UNDEF (& tmp );
4269
4281
if (OP1_TYPE != IS_CONST && Z_TYPE_P (varname ) != IS_STRING ) {
4270
4282
ZVAL_DUP (& tmp , varname );
4271
4283
convert_to_string (& tmp );
4272
4284
varname = & tmp ;
4273
- tmp_is_dup = 1 ;
4274
- } else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV ) {
4275
- ZVAL_COPY (& tmp , varname );
4276
- varname = & tmp ;
4277
4285
}
4278
4286
4279
4287
if (OP2_TYPE != IS_UNUSED ) {
@@ -4285,10 +4293,8 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
4285
4293
} else {
4286
4294
ce = zend_fetch_class_by_name (Z_STR_P (opline -> op2 .zv ), opline -> op2 .zv + 1 , 0 TSRMLS_CC );
4287
4295
if (UNEXPECTED (EG (exception ) != NULL )) {
4288
- if (OP1_TYPE != IS_CONST && tmp_is_dup ) {
4296
+ if (OP1_TYPE != IS_CONST ) {
4289
4297
zval_dtor (& tmp );
4290
- } else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV ) {
4291
- zval_ptr_dtor (& tmp );
4292
4298
}
4293
4299
FREE_OP1 ();
4294
4300
HANDLE_EXCEPTION ();
@@ -4307,10 +4313,8 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
4307
4313
zend_hash_del_ind (target_symbol_table , Z_STR_P (varname ));
4308
4314
}
4309
4315
4310
- if (OP1_TYPE != IS_CONST && tmp_is_dup ) {
4316
+ if (OP1_TYPE != IS_CONST ) {
4311
4317
zval_dtor (& tmp );
4312
- } else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV ) {
4313
- zval_ptr_dtor (& tmp );
4314
4318
}
4315
4319
FREE_OP1 ();
4316
4320
CHECK_EXCEPTION ();
@@ -4351,28 +4355,16 @@ ZEND_VM_C_LABEL(num_index_dim):
4351
4355
zend_hash_index_del (ht , hval );
4352
4356
break ;
4353
4357
case IS_STRING :
4354
- if (OP2_TYPE == IS_CV || OP2_TYPE == IS_VAR ) {
4355
- if (Z_REFCOUNTED_P (offset )) Z_ADDREF_P (offset );
4356
- }
4357
4358
if (OP2_TYPE != IS_CONST ) {
4358
4359
if (ZEND_HANDLE_NUMERIC (Z_STR_P (offset ), hval )) {
4359
- ZEND_VM_C_GOTO (numeric_index_dim );
4360
+ ZEND_VM_C_GOTO (num_index_dim );
4360
4361
}
4361
4362
}
4362
4363
if (ht == & EG (symbol_table ).ht ) {
4363
4364
zend_delete_global_variable (Z_STR_P (offset ) TSRMLS_CC );
4364
4365
} else {
4365
4366
zend_hash_del (ht , Z_STR_P (offset ));
4366
4367
}
4367
- if (OP2_TYPE == IS_CV || OP2_TYPE == IS_VAR ) {
4368
- zval_ptr_dtor (offset );
4369
- }
4370
- break ;
4371
- ZEND_VM_C_LABEL (numeric_index_dim ):
4372
- zend_hash_index_del (ht , hval );
4373
- if (OP2_TYPE == IS_CV || OP2_TYPE == IS_VAR ) {
4374
- zval_ptr_dtor (offset );
4375
- }
4376
4368
break ;
4377
4369
case IS_NULL :
4378
4370
zend_hash_del (ht , STR_EMPTY_ALLOC ());
0 commit comments