Skip to content

Commit 31a2198

Browse files
committed
FE_RESER/FE_FETCH optimisation
1 parent c18ba68 commit 31a2198

File tree

2 files changed

+115
-507
lines changed

2 files changed

+115
-507
lines changed

Zend/zend_vm_def.h

Lines changed: 53 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -5565,7 +5565,6 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
55655565
USE_OPLINE
55665566
zend_free_op free_op1;
55675567
zval *array_ptr, *result;
5568-
HashTable *fe_ht;
55695568

55705569
SAVE_OPLINE();
55715570

@@ -5582,9 +5581,6 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
55825581
ZEND_VM_NEXT_OPCODE();
55835582
} else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
55845583
if (!Z_OBJCE_P(array_ptr)->get_iterator) {
5585-
HashPosition pos = 0;
5586-
Bucket *p;
5587-
55885584
result = EX_VAR(opline->result.var);
55895585
ZVAL_COPY_VALUE(result, array_ptr);
55905586
if (OP1_TYPE != IS_TMP_VAR) {
@@ -5597,26 +5593,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
55975593
}
55985594
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
55995595
}
5600-
fe_ht = Z_OBJPROP_P(array_ptr);
5601-
pos = 0;
5602-
p = fe_ht->arData;
5603-
while (1) {
5604-
if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
5605-
FREE_OP1_IF_VAR();
5606-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
5607-
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
5608-
}
5609-
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
5610-
(EXPECTED(Z_TYPE(p->val) != IS_INDIRECT) ||
5611-
(EXPECTED(Z_TYPE_P(Z_INDIRECT(p->val)) != IS_UNDEF) &&
5612-
EXPECTED(zend_check_property_access(Z_OBJ_P(array_ptr), p->key) == SUCCESS)))
5613-
) {
5614-
break;
5615-
}
5616-
pos++;
5617-
p++;
5618-
}
5619-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
5596+
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_OBJPROP_P(array_ptr), 0);
56205597

56215598
FREE_OP1_IF_VAR();
56225599
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5685,9 +5662,6 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
56855662
USE_OPLINE
56865663
zend_free_op free_op1;
56875664
zval *array_ptr, *array_ref;
5688-
HashTable *fe_ht;
5689-
HashPosition pos = 0;
5690-
Bucket *p;
56915665

56925666
SAVE_OPLINE();
56935667

@@ -5718,23 +5692,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
57185692
} else {
57195693
SEPARATE_ARRAY(array_ptr);
57205694
}
5721-
fe_ht = Z_ARRVAL_P(array_ptr);
5722-
p = fe_ht->arData;
5723-
while (1) {
5724-
if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
5725-
FREE_OP1_VAR_PTR();
5726-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
5727-
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
5728-
}
5729-
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
5730-
(EXPECTED(Z_TYPE(p->val) != IS_INDIRECT) ||
5731-
EXPECTED(Z_TYPE_P(Z_INDIRECT(p->val)) != IS_UNDEF))) {
5732-
break;
5733-
}
5734-
pos++;
5735-
p++;
5736-
}
5737-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
5695+
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_ARRVAL_P(array_ptr), 0);
57385696

57395697
FREE_OP1_VAR_PTR();
57405698
ZEND_VM_NEXT_OPCODE();
@@ -5758,25 +5716,7 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
57585716
}
57595717
Z_OBJ_P(array_ptr)->properties = zend_array_dup(Z_OBJ_P(array_ptr)->properties);
57605718
}
5761-
fe_ht = Z_OBJPROP_P(array_ptr);
5762-
p = fe_ht->arData;
5763-
while (1) {
5764-
if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
5765-
FREE_OP1_VAR_PTR();
5766-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = (uint32_t)-1;
5767-
ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
5768-
}
5769-
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
5770-
(EXPECTED(Z_TYPE(p->val) != IS_INDIRECT) ||
5771-
(EXPECTED(Z_TYPE_P(Z_INDIRECT(p->val)) != IS_UNDEF) &&
5772-
EXPECTED(zend_check_property_access(Z_OBJ_P(array_ptr), p->key) == SUCCESS)))
5773-
) {
5774-
break;
5775-
}
5776-
pos++;
5777-
p++;
5778-
}
5779-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
5719+
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(Z_OBJPROP_P(array_ptr), 0);
57805720

57815721
FREE_OP1_VAR_PTR();
57825722
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5880,20 +5820,19 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
58805820
}
58815821
value = &p->val;
58825822
value_type = Z_TYPE_INFO_P(value);
5883-
if (value_type == IS_UNDEF) {
5884-
pos++;
5885-
p++;
5886-
continue;
5887-
} else if (UNEXPECTED(value_type == IS_INDIRECT)) {
5888-
value = Z_INDIRECT_P(value);
5889-
value_type = Z_TYPE_INFO_P(value);
5890-
if (UNEXPECTED(value_type == IS_UNDEF)) {
5891-
pos++;
5892-
p++;
5893-
continue;
5823+
if (EXPECTED(value_type != IS_UNDEF)) {
5824+
if (UNEXPECTED(value_type == IS_INDIRECT)) {
5825+
value = Z_INDIRECT_P(value);
5826+
value_type = Z_TYPE_INFO_P(value);
5827+
if (EXPECTED(value_type != IS_UNDEF)) {
5828+
break;
5829+
}
5830+
} else {
5831+
break;
58945832
}
58955833
}
5896-
break;
5834+
pos++;
5835+
p++;
58975836
}
58985837
Z_FE_POS_P(array) = pos + 1;
58995838
if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
@@ -5920,25 +5859,20 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
59205859

59215860
value = &p->val;
59225861
value_type = Z_TYPE_INFO_P(value);
5923-
if (UNEXPECTED(value_type == IS_UNDEF)) {
5924-
pos++;
5925-
p++;
5926-
continue;
5927-
} else if (UNEXPECTED(value_type == IS_INDIRECT)) {
5928-
value = Z_INDIRECT_P(value);
5929-
value_type = Z_TYPE_INFO_P(value);
5930-
if (UNEXPECTED(value_type == IS_UNDEF)) {
5931-
pos++;
5932-
p++;
5933-
continue;
5934-
}
5935-
if (UNEXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == FAILURE)) {
5936-
pos++;
5937-
p++;
5938-
continue;
5862+
if (EXPECTED(value_type != IS_UNDEF)) {
5863+
if (UNEXPECTED(value_type == IS_INDIRECT)) {
5864+
value = Z_INDIRECT_P(value);
5865+
value_type = Z_TYPE_INFO_P(value);
5866+
if (EXPECTED(value_type != IS_UNDEF)
5867+
&& EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) {
5868+
break;
5869+
}
5870+
} else {
5871+
break;
59395872
}
59405873
}
5941-
break;
5874+
pos++;
5875+
p++;
59425876
}
59435877
if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
59445878
if (UNEXPECTED(!p->key)) {
@@ -5953,20 +5887,8 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY, JMP_ADDR)
59535887
ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
59545888
}
59555889
}
5956-
while (1) {
5957-
pos++;
5958-
if (pos >= fe_ht->nNumUsed) {
5959-
pos = HT_INVALID_IDX;
5960-
break;
5961-
}
5962-
p++;
5963-
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
5964-
(EXPECTED(Z_TYPE(p->val) != IS_INDIRECT) ||
5965-
(EXPECTED(Z_TYPE_P(Z_INDIRECT(p->val)) != IS_UNDEF) &&
5966-
EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)))
5967-
) {
5968-
break;
5969-
}
5890+
if (++pos >= fe_ht->nNumUsed) {
5891+
pos = HT_INVALID_IDX;
59705892
}
59715893
EG(ht_iterators)[Z_FE_ITER_P(array)].pos = pos;
59725894
} else {
@@ -6060,20 +5982,19 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
60605982
}
60615983
value = &p->val;
60625984
value_type = Z_TYPE_INFO_P(value);
6063-
if (UNEXPECTED(value_type == IS_UNDEF)) {
6064-
pos++;
6065-
p++;
6066-
continue;
6067-
} else if (UNEXPECTED(value_type == IS_INDIRECT)) {
6068-
value = Z_INDIRECT_P(value);
6069-
value_type = Z_TYPE_INFO_P(value);
6070-
if (UNEXPECTED(value_type == IS_UNDEF)) {
6071-
pos++;
6072-
p++;
6073-
continue;
5985+
if (EXPECTED(value_type != IS_UNDEF)) {
5986+
if (UNEXPECTED(value_type == IS_INDIRECT)) {
5987+
value = Z_INDIRECT_P(value);
5988+
value_type = Z_TYPE_INFO_P(value);
5989+
if (EXPECTED(value_type != IS_UNDEF)) {
5990+
break;
5991+
}
5992+
} else {
5993+
break;
60745994
}
60755995
}
6076-
break;
5996+
pos++;
5997+
p++;
60775998
}
60785999
if (opline->result_type & (IS_TMP_VAR|IS_CV)) {
60796000
if (!p->key) {
@@ -6082,18 +6003,8 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
60826003
ZVAL_STR_COPY(EX_VAR(opline->result.var), p->key);
60836004
}
60846005
}
6085-
while (1) {
6086-
pos++;
6087-
if (pos >= fe_ht->nNumUsed) {
6088-
pos = HT_INVALID_IDX;
6089-
break;
6090-
}
6091-
p++;
6092-
if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
6093-
(EXPECTED(Z_TYPE(p->val) != IS_INDIRECT) ||
6094-
EXPECTED(Z_TYPE_P(Z_INDIRECT(p->val)) != IS_UNDEF))) {
6095-
break;
6096-
}
6006+
if (++pos >= fe_ht->nNumUsed) {
6007+
pos = HT_INVALID_IDX;
60976008
}
60986009
EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
60996010
} else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
@@ -6113,23 +6024,18 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
61136024

61146025
value = &p->val;
61156026
value_type = Z_TYPE_INFO_P(value);
6116-
if (UNEXPECTED(value_type == IS_UNDEF)) {
6117-
pos++;
6118-
p++;
6119-
continue;
6120-
} else if (UNEXPECTED(value_type == IS_INDIRECT)) {
6121-
value = Z_INDIRECT_P(value);
6122-
value_type = Z_TYPE_INFO_P(value);
6123-
if (UNEXPECTED(value_type == IS_UNDEF)) {
6124-
pos++;
6125-
p++;
6126-
continue;
6027+
if (EXPECTED(value_type != IS_UNDEF)) {
6028+
if (UNEXPECTED(value_type == IS_INDIRECT)) {
6029+
value = Z_INDIRECT_P(value);
6030+
value_type = Z_TYPE_INFO_P(value);
6031+
if (EXPECTED(value_type != IS_UNDEF)
6032+
&& EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) {
6033+
break;
6034+
}
6035+
} else {
6036+
break;
61276037
}
61286038
}
6129-
if (UNEXPECTED(!p->key) ||
6130-
EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) {
6131-
break;
6132-
}
61336039
pos++;
61346040
p++;
61356041
}
@@ -6146,20 +6052,8 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
61466052
ZVAL_STRINGL(EX_VAR(opline->result.var), prop_name, prop_name_len);
61476053
}
61486054
}
6149-
while (1) {
6150-
pos++;
6151-
if (pos >= fe_ht->nNumUsed) {
6152-
pos = HT_INVALID_IDX;
6153-
break;
6154-
}
6155-
p++;
6156-
if ((EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
6157-
(EXPECTED(Z_TYPE(p->val) != IS_INDIRECT) ||
6158-
EXPECTED(Z_TYPE_P(Z_INDIRECT(p->val)) != IS_UNDEF))) &&
6159-
(UNEXPECTED(!p->key) ||
6160-
EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS))) {
6161-
break;
6162-
}
6055+
if (++pos >= fe_ht->nNumUsed) {
6056+
pos = HT_INVALID_IDX;
61636057
}
61646058
EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
61656059
} else {

0 commit comments

Comments
 (0)