Skip to content

Commit a057f06

Browse files
committed
Optimized unset()
1 parent 9c0fa41 commit a057f06

File tree

2 files changed

+247
-351
lines changed

2 files changed

+247
-351
lines changed

Zend/zend_vm_def.h

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4251,29 +4251,37 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
42514251
zval tmp, *varname;
42524252
HashTable *target_symbol_table;
42534253
zend_free_op free_op1;
4254-
zend_bool tmp_is_dup = 0;
42554254

42564255
SAVE_OPLINE();
42574256
if (OP1_TYPE == IS_CV &&
42584257
OP2_TYPE == IS_UNUSED &&
42594258
(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+
}
42634274
CHECK_EXCEPTION();
42644275
ZEND_VM_NEXT_OPCODE();
42654276
}
42664277

42674278
varname = GET_OP1_ZVAL_PTR(BP_VAR_R);
42684279

4280+
ZVAL_UNDEF(&tmp);
42694281
if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
42704282
ZVAL_DUP(&tmp, varname);
42714283
convert_to_string(&tmp);
42724284
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;
42774285
}
42784286

42794287
if (OP2_TYPE != IS_UNUSED) {
@@ -4285,10 +4293,8 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
42854293
} else {
42864294
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
42874295
if (UNEXPECTED(EG(exception) != NULL)) {
4288-
if (OP1_TYPE != IS_CONST && tmp_is_dup) {
4296+
if (OP1_TYPE != IS_CONST) {
42894297
zval_dtor(&tmp);
4290-
} else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
4291-
zval_ptr_dtor(&tmp);
42924298
}
42934299
FREE_OP1();
42944300
HANDLE_EXCEPTION();
@@ -4307,10 +4313,8 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
43074313
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
43084314
}
43094315

4310-
if (OP1_TYPE != IS_CONST && tmp_is_dup) {
4316+
if (OP1_TYPE != IS_CONST) {
43114317
zval_dtor(&tmp);
4312-
} else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
4313-
zval_ptr_dtor(&tmp);
43144318
}
43154319
FREE_OP1();
43164320
CHECK_EXCEPTION();
@@ -4351,28 +4355,16 @@ ZEND_VM_C_LABEL(num_index_dim):
43514355
zend_hash_index_del(ht, hval);
43524356
break;
43534357
case IS_STRING:
4354-
if (OP2_TYPE == IS_CV || OP2_TYPE == IS_VAR) {
4355-
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
4356-
}
43574358
if (OP2_TYPE != IS_CONST) {
43584359
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);
43604361
}
43614362
}
43624363
if (ht == &EG(symbol_table).ht) {
43634364
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
43644365
} else {
43654366
zend_hash_del(ht, Z_STR_P(offset));
43664367
}
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-
}
43764368
break;
43774369
case IS_NULL:
43784370
zend_hash_del(ht, STR_EMPTY_ALLOC());

0 commit comments

Comments
 (0)