Skip to content

Commit f8cf715

Browse files
committed
Microoptimization of STRLEN and IN_ARRAY opcodes (based on #4981)
1 parent eb8ad30 commit f8cf715

File tree

2 files changed

+235
-47
lines changed

2 files changed

+235
-47
lines changed

Zend/zend_vm_def.h

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8290,7 +8290,9 @@ ZEND_VM_COLD_CONST_HANDLER(121, ZEND_STRLEN, CONST|TMPVAR|CV, ANY)
82908290
value = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
82918291
if (EXPECTED(Z_TYPE_P(value) == IS_STRING)) {
82928292
ZVAL_LONG(EX_VAR(opline->result.var), Z_STRLEN_P(value));
8293-
FREE_OP1();
8293+
if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
8294+
zval_ptr_dtor_str(value);
8295+
}
82948296
ZEND_VM_NEXT_OPCODE();
82958297
} else {
82968298
bool strict;
@@ -8901,33 +8903,69 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(189, ZEND_IN_ARRAY, CONST|TMP|VAR|CV, CONST, NUM
89018903
HashTable *ht = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
89028904
zval *result;
89038905

8904-
SAVE_OPLINE();
8905-
op1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
8906+
op1 = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
89068907
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
89078908
result = zend_hash_find_ex(ht, Z_STR_P(op1), OP1_TYPE == IS_CONST);
8908-
} else if (opline->extended_value) {
8909+
if (OP1_TYPE & (IS_TMP_VAR|IS_VAR)) {
8910+
zval_ptr_dtor_str(op1);
8911+
}
8912+
ZEND_VM_SMART_BRANCH(result, 0);
8913+
}
8914+
8915+
if (opline->extended_value) {
89098916
if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
89108917
result = zend_hash_index_find(ht, Z_LVAL_P(op1));
8911-
} else {
8912-
result = NULL;
8918+
ZEND_VM_SMART_BRANCH(result, 0);
8919+
}
8920+
SAVE_OPLINE();
8921+
if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
8922+
op1 = Z_REFVAL_P(op1);
8923+
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
8924+
result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
8925+
FREE_OP1();
8926+
ZEND_VM_SMART_BRANCH(result, 0);
8927+
} else if (EXPECTED(Z_TYPE_P(op1) == IS_LONG)) {
8928+
result = zend_hash_index_find(ht, Z_LVAL_P(op1));
8929+
FREE_OP1();
8930+
ZEND_VM_SMART_BRANCH(result, 0);
8931+
}
8932+
} else if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
8933+
ZVAL_UNDEFINED_OP1();
89138934
}
89148935
} else if (Z_TYPE_P(op1) <= IS_FALSE) {
8936+
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
8937+
SAVE_OPLINE();
8938+
ZVAL_UNDEFINED_OP1();
8939+
if (UNEXPECTED(EG(exception) != NULL)) {
8940+
HANDLE_EXCEPTION();
8941+
}
8942+
}
89158943
result = zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
8944+
ZEND_VM_SMART_BRANCH(result, 0);
89168945
} else {
89178946
zend_string *key;
89188947
zval key_tmp, *val;
89198948

8920-
result = NULL;
8949+
if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_TYPE_P(op1) == IS_REFERENCE) {
8950+
op1 = Z_REFVAL_P(op1);
8951+
if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) {
8952+
result = zend_hash_find_ex(ht, Z_STR_P(op1), 0);
8953+
FREE_OP1();
8954+
ZEND_VM_SMART_BRANCH(result, 0);
8955+
}
8956+
}
8957+
8958+
SAVE_OPLINE();
89218959
ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, val) {
89228960
ZVAL_STR(&key_tmp, key);
89238961
if (zend_compare(op1, &key_tmp) == 0) {
8924-
result = val;
8925-
break;
8962+
FREE_OP1();
8963+
ZEND_VM_SMART_BRANCH(1, 1);
89268964
}
89278965
} ZEND_HASH_FOREACH_END();
89288966
}
89298967
FREE_OP1();
8930-
ZEND_VM_SMART_BRANCH(result, 1);
8968+
ZEND_VM_SMART_BRANCH(0, 1);
89318969
}
89328970

89338971
ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMPVAR|CV, UNUSED)

0 commit comments

Comments
 (0)