Skip to content

Commit 2279388

Browse files
committed
Remove some INDIRECT handling in VM
1 parent 3c68f38 commit 2279388

File tree

5 files changed

+34
-110
lines changed

5 files changed

+34
-110
lines changed

Zend/zend_builtin_functions.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ static bool validate_constant_array_argument(HashTable *ht, int argument_number)
426426
zval *val;
427427

428428
GC_PROTECT_RECURSION(ht);
429-
ZEND_HASH_FOREACH_VAL_IND(ht, val) {
429+
ZEND_HASH_FOREACH_VAL(ht, val) {
430430
ZVAL_DEREF(val);
431431
if (Z_REFCOUNTED_P(val)) {
432432
if (Z_TYPE_P(val) == IS_ARRAY) {
@@ -459,7 +459,7 @@ static void copy_constant_array(zval *dst, zval *src) /* {{{ */
459459
zval *new_val, *val;
460460

461461
array_init_size(dst, zend_hash_num_elements(Z_ARRVAL_P(src)));
462-
ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(src), idx, key, val) {
462+
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(src), idx, key, val) {
463463
/* constant arrays can't contain references */
464464
ZVAL_DEREF(val);
465465
if (key) {

Zend/zend_execute.c

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,31 +2089,7 @@ static zend_always_inline zval *zend_fetch_dimension_address_inner(HashTable *ht
20892089
}
20902090
str_index:
20912091
retval = zend_hash_find_ex(ht, offset_key, ZEND_CONST_COND(dim_type == IS_CONST, 0));
2092-
if (retval) {
2093-
/* support for $GLOBALS[...] */
2094-
if (UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) {
2095-
retval = Z_INDIRECT_P(retval);
2096-
if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
2097-
switch (type) {
2098-
case BP_VAR_R:
2099-
zend_undefined_index(offset_key);
2100-
/* break missing intentionally */
2101-
case BP_VAR_UNSET:
2102-
case BP_VAR_IS:
2103-
retval = &EG(uninitialized_zval);
2104-
break;
2105-
case BP_VAR_RW:
2106-
if (UNEXPECTED(zend_undefined_index_write(ht, offset_key))) {
2107-
return NULL;
2108-
}
2109-
/* break missing intentionally */
2110-
case BP_VAR_W:
2111-
ZVAL_NULL(retval);
2112-
break;
2113-
}
2114-
}
2115-
}
2116-
} else {
2092+
if (!retval) {
21172093
switch (type) {
21182094
case BP_VAR_R:
21192095
zend_undefined_index(offset_key);
@@ -2467,7 +2443,7 @@ static zend_never_inline zval* ZEND_FASTCALL zend_find_array_dim_slow(HashTable
24672443
return zend_hash_index_find(ht, hval);
24682444
} else if (Z_TYPE_P(offset) == IS_NULL) {
24692445
str_idx:
2470-
return zend_hash_find_ex_ind(ht, ZSTR_EMPTY_ALLOC(), 1);
2446+
return zend_hash_find_ex(ht, ZSTR_EMPTY_ALLOC(), 1);
24712447
} else if (Z_TYPE_P(offset) == IS_FALSE) {
24722448
hval = 0;
24732449
goto num_idx;
@@ -2577,11 +2553,11 @@ static zend_never_inline zend_bool ZEND_FASTCALL zend_array_key_exists_fast(Hash
25772553
goto num_key;
25782554
}
25792555
str_key:
2580-
return zend_hash_find_ind(ht, str) != NULL;
2556+
return zend_hash_exists(ht, str);
25812557
} else if (EXPECTED(Z_TYPE_P(key) == IS_LONG)) {
25822558
hval = Z_LVAL_P(key);
25832559
num_key:
2584-
return zend_hash_index_find(ht, hval) != NULL;
2560+
return zend_hash_index_exists(ht, hval);
25852561
} else if (EXPECTED(Z_ISREF_P(key))) {
25862562
key = Z_REFVAL_P(key);
25872563
goto try_again;

Zend/zend_generators.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -614,9 +614,6 @@ static zend_result zend_generator_get_next_delegated_value(zend_generator *gener
614614

615615
p = &ht->arData[pos];
616616
value = &p->val;
617-
if (Z_TYPE_P(value) == IS_INDIRECT) {
618-
value = Z_INDIRECT_P(value);
619-
}
620617
pos++;
621618
} while (Z_ISUNDEF_P(value));
622619

Zend/zend_vm_def.h

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6677,16 +6677,9 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit):
66776677
pos++;
66786678
value = &p->val;
66796679
value_type = Z_TYPE_INFO_P(value);
6680+
ZEND_ASSERT(value_type != IS_INDIRECT);
66806681
if (EXPECTED(value_type != IS_UNDEF)) {
6681-
if (UNEXPECTED(value_type == IS_INDIRECT)) {
6682-
value = Z_INDIRECT_P(value);
6683-
value_type = Z_TYPE_INFO_P(value);
6684-
if (EXPECTED(value_type != IS_UNDEF)) {
6685-
break;
6686-
}
6687-
} else {
6688-
break;
6689-
}
6682+
break;
66906683
}
66916684
p++;
66926685
}
@@ -6829,16 +6822,9 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR)
68296822
pos++;
68306823
value = &p->val;
68316824
value_type = Z_TYPE_INFO_P(value);
6825+
ZEND_ASSERT(value_type != IS_INDIRECT);
68326826
if (EXPECTED(value_type != IS_UNDEF)) {
6833-
if (UNEXPECTED(value_type == IS_INDIRECT)) {
6834-
value = Z_INDIRECT_P(value);
6835-
value_type = Z_TYPE_INFO_P(value);
6836-
if (EXPECTED(value_type != IS_UNDEF)) {
6837-
break;
6838-
}
6839-
} else {
6840-
break;
6841-
}
6827+
break;
68426828
}
68436829
p++;
68446830
}
@@ -7097,7 +7083,7 @@ ZEND_VM_C_LABEL(isset_again):
70977083
ZEND_VM_C_GOTO(num_index_prop);
70987084
}
70997085
}
7100-
value = zend_hash_find_ex_ind(ht, str, OP2_TYPE == IS_CONST);
7086+
value = zend_hash_find_ex(ht, str, OP2_TYPE == IS_CONST);
71017087
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
71027088
hval = Z_LVAL_P(offset);
71037089
ZEND_VM_C_LABEL(num_index_prop):
@@ -8931,7 +8917,7 @@ ZEND_VM_COLD_CONST_HANDLER(190, ZEND_COUNT, CONST|TMPVAR|CV, UNUSED)
89318917

89328918
while (1) {
89338919
if (Z_TYPE_P(op1) == IS_ARRAY) {
8934-
count = zend_array_count(Z_ARRVAL_P(op1));
8920+
count = zend_hash_num_elements(Z_ARRVAL_P(op1));
89358921
break;
89368922
} else if (Z_TYPE_P(op1) == IS_OBJECT) {
89378923
zend_object *zobj = Z_OBJ_P(op1);
@@ -9651,16 +9637,9 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf
96519637
pos++;
96529638
value = &p->val;
96539639
value_type = Z_TYPE_INFO_P(value);
9640+
ZEND_ASSERT(value_type != IS_INDIRECT);
96549641
if (EXPECTED(value_type != IS_UNDEF)) {
9655-
if (UNEXPECTED(value_type == IS_INDIRECT)) {
9656-
value = Z_INDIRECT_P(value);
9657-
value_type = Z_TYPE_INFO_P(value);
9658-
if (EXPECTED(value_type != IS_UNDEF)) {
9659-
break;
9660-
}
9661-
} else {
9662-
break;
9663-
}
9642+
break;
96649643
}
96659644
p++;
96669645
}

Zend/zend_vm_execute.h

Lines changed: 20 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7013,7 +7013,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM
70137013
goto num_index_prop;
70147014
}
70157015
}
7016-
value = zend_hash_find_ex_ind(ht, str, IS_CONST == IS_CONST);
7016+
value = zend_hash_find_ex(ht, str, IS_CONST == IS_CONST);
70177017
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
70187018
hval = Z_LVAL_P(offset);
70197019
num_index_prop:
@@ -9169,7 +9169,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON
91699169
goto num_index_prop;
91709170
}
91719171
}
9172-
value = zend_hash_find_ex_ind(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
9172+
value = zend_hash_find_ex(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
91739173
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
91749174
hval = Z_LVAL_P(offset);
91759175
num_index_prop:
@@ -10325,7 +10325,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CONST_
1032510325

1032610326
while (1) {
1032710327
if (Z_TYPE_P(op1) == IS_ARRAY) {
10328-
count = zend_array_count(Z_ARRVAL_P(op1));
10328+
count = zend_hash_num_elements(Z_ARRVAL_P(op1));
1032910329
break;
1033010330
} else if (Z_TYPE_P(op1) == IS_OBJECT) {
1033110331
zend_object *zobj = Z_OBJ_P(op1);
@@ -11553,7 +11553,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON
1155311553
goto num_index_prop;
1155411554
}
1155511555
}
11556-
value = zend_hash_find_ex_ind(ht, str, IS_CV == IS_CONST);
11556+
value = zend_hash_find_ex(ht, str, IS_CV == IS_CONST);
1155711557
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
1155811558
hval = Z_LVAL_P(offset);
1155911559
num_index_prop:
@@ -15699,7 +15699,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP
1569915699
goto num_index_prop;
1570015700
}
1570115701
}
15702-
value = zend_hash_find_ex_ind(ht, str, IS_CONST == IS_CONST);
15702+
value = zend_hash_find_ex(ht, str, IS_CONST == IS_CONST);
1570315703
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
1570415704
hval = Z_LVAL_P(offset);
1570515705
num_index_prop:
@@ -17091,7 +17091,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP
1709117091
goto num_index_prop;
1709217092
}
1709317093
}
17094-
value = zend_hash_find_ex_ind(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
17094+
value = zend_hash_find_ex(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
1709517095
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
1709617096
hval = Z_LVAL_P(offset);
1709717097
num_index_prop:
@@ -17566,7 +17566,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_TMPVAR_UNUSED_HANDL
1756617566

1756717567
while (1) {
1756817568
if (Z_TYPE_P(op1) == IS_ARRAY) {
17569-
count = zend_array_count(Z_ARRVAL_P(op1));
17569+
count = zend_hash_num_elements(Z_ARRVAL_P(op1));
1757017570
break;
1757117571
} else if (Z_TYPE_P(op1) == IS_OBJECT) {
1757217572
zend_object *zobj = Z_OBJ_P(op1);
@@ -18403,7 +18403,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP
1840318403
goto num_index_prop;
1840418404
}
1840518405
}
18406-
value = zend_hash_find_ex_ind(ht, str, IS_CV == IS_CONST);
18406+
value = zend_hash_find_ex(ht, str, IS_CV == IS_CONST);
1840718407
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
1840818408
hval = Z_LVAL_P(offset);
1840918409
num_index_prop:
@@ -21597,16 +21597,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE
2159721597
pos++;
2159821598
value = &p->val;
2159921599
value_type = Z_TYPE_INFO_P(value);
21600+
ZEND_ASSERT(value_type != IS_INDIRECT);
2160021601
if (EXPECTED(value_type != IS_UNDEF)) {
21601-
if (UNEXPECTED(value_type == IS_INDIRECT)) {
21602-
value = Z_INDIRECT_P(value);
21603-
value_type = Z_TYPE_INFO_P(value);
21604-
if (EXPECTED(value_type != IS_UNDEF)) {
21605-
break;
21606-
}
21607-
} else {
21608-
break;
21609-
}
21602+
break;
2161021603
}
2161121604
p++;
2161221605
}
@@ -21749,16 +21742,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z
2174921742
pos++;
2175021743
value = &p->val;
2175121744
value_type = Z_TYPE_INFO_P(value);
21745+
ZEND_ASSERT(value_type != IS_INDIRECT);
2175221746
if (EXPECTED(value_type != IS_UNDEF)) {
21753-
if (UNEXPECTED(value_type == IS_INDIRECT)) {
21754-
value = Z_INDIRECT_P(value);
21755-
value_type = Z_TYPE_INFO_P(value);
21756-
if (EXPECTED(value_type != IS_UNDEF)) {
21757-
break;
21758-
}
21759-
} else {
21760-
break;
21761-
}
21747+
break;
2176221748
}
2176321749
p++;
2176421750
}
@@ -30794,16 +30780,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
3079430780
pos++;
3079530781
value = &p->val;
3079630782
value_type = Z_TYPE_INFO_P(value);
30783+
ZEND_ASSERT(value_type != IS_INDIRECT);
3079730784
if (EXPECTED(value_type != IS_UNDEF)) {
30798-
if (UNEXPECTED(value_type == IS_INDIRECT)) {
30799-
value = Z_INDIRECT_P(value);
30800-
value_type = Z_TYPE_INFO_P(value);
30801-
if (EXPECTED(value_type != IS_UNDEF)) {
30802-
break;
30803-
}
30804-
} else {
30805-
break;
30806-
}
30785+
break;
3080730786
}
3080830787
p++;
3080930788
}
@@ -30846,16 +30825,9 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
3084630825
pos++;
3084730826
value = &p->val;
3084830827
value_type = Z_TYPE_INFO_P(value);
30828+
ZEND_ASSERT(value_type != IS_INDIRECT);
3084930829
if (EXPECTED(value_type != IS_UNDEF)) {
30850-
if (UNEXPECTED(value_type == IS_INDIRECT)) {
30851-
value = Z_INDIRECT_P(value);
30852-
value_type = Z_TYPE_INFO_P(value);
30853-
if (EXPECTED(value_type != IS_UNDEF)) {
30854-
break;
30855-
}
30856-
} else {
30857-
break;
30858-
}
30830+
break;
3085930831
}
3086030832
p++;
3086130833
}
@@ -41954,7 +41926,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_
4195441926
goto num_index_prop;
4195541927
}
4195641928
}
41957-
value = zend_hash_find_ex_ind(ht, str, IS_CONST == IS_CONST);
41929+
value = zend_hash_find_ex(ht, str, IS_CONST == IS_CONST);
4195841930
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
4195941931
hval = Z_LVAL_P(offset);
4196041932
num_index_prop:
@@ -45402,7 +45374,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_
4540245374
goto num_index_prop;
4540345375
}
4540445376
}
45405-
value = zend_hash_find_ex_ind(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
45377+
value = zend_hash_find_ex(ht, str, (IS_TMP_VAR|IS_VAR) == IS_CONST);
4540645378
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
4540745379
hval = Z_LVAL_P(offset);
4540845380
num_index_prop:
@@ -47410,7 +47382,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_COUNT_SPEC_CV_UNUSED_HANDLER(Z
4741047382

4741147383
while (1) {
4741247384
if (Z_TYPE_P(op1) == IS_ARRAY) {
47413-
count = zend_array_count(Z_ARRVAL_P(op1));
47385+
count = zend_hash_num_elements(Z_ARRVAL_P(op1));
4741447386
break;
4741547387
} else if (Z_TYPE_P(op1) == IS_OBJECT) {
4741647388
zend_object *zobj = Z_OBJ_P(op1);
@@ -50525,7 +50497,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_
5052550497
goto num_index_prop;
5052650498
}
5052750499
}
50528-
value = zend_hash_find_ex_ind(ht, str, IS_CV == IS_CONST);
50500+
value = zend_hash_find_ex(ht, str, IS_CV == IS_CONST);
5052950501
} else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
5053050502
hval = Z_LVAL_P(offset);
5053150503
num_index_prop:

0 commit comments

Comments
 (0)