Skip to content

Commit 1e56b64

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Combine ADDREF/DELREF
2 parents 0314f40 + c787f42 commit 1e56b64

File tree

3 files changed

+45
-55
lines changed

3 files changed

+45
-55
lines changed

Zend/zend_execute.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,7 +1431,6 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
14311431
zval *z;
14321432
zval rv, res;
14331433

1434-
GC_ADDREF(obj);
14351434
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1);
14361435
if ((z = obj->handlers->read_dimension(obj, property, BP_VAR_R, &rv)) != NULL) {
14371436

@@ -1452,9 +1451,6 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zv
14521451
}
14531452
}
14541453
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
1455-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
1456-
zend_objects_store_del(obj);
1457-
}
14581454
}
14591455

14601456
static zend_never_inline void zend_binary_assign_op_typed_ref(zend_reference *ref, zval *value OPLINE_DC EXECUTE_DATA_DC)

Zend/zend_vm_def.h

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,27 +1145,6 @@ ZEND_VM_HANDLER(29, ZEND_ASSIGN_STATIC_PROP_OP, ANY, ANY, OP)
11451145
ZEND_VM_NEXT_OPCODE_EX(1, 2);
11461146
}
11471147

1148-
ZEND_VM_COLD_HELPER(zend_assign_dim_op_obj_undef_helper, ANY, ANY, zend_object *obj)
1149-
{
1150-
USE_OPLINE
1151-
zval *dim;
1152-
1153-
GC_ADDREF(obj);
1154-
dim = ZVAL_UNDEFINED_OP2();
1155-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
1156-
zend_objects_store_del(obj);
1157-
FREE_OP_DATA();
1158-
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
1159-
ZVAL_NULL(EX_VAR(opline->result.var));
1160-
}
1161-
} else {
1162-
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
1163-
}
1164-
FREE_OP2();
1165-
FREE_OP1();
1166-
ZEND_VM_NEXT_OPCODE_EX(1, 2);
1167-
}
1168-
11691148
ZEND_VM_HANDLER(27, ZEND_ASSIGN_DIM_OP, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, OP)
11701149
{
11711150
USE_OPLINE
@@ -1226,13 +1205,17 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array):
12261205
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
12271206
zend_object *obj = Z_OBJ_P(container);
12281207

1208+
GC_ADDREF(obj);
12291209
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
12301210
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
1231-
ZEND_VM_DISPATCH_TO_HELPER(zend_assign_dim_op_obj_undef_helper, obj, obj);
1211+
dim = ZVAL_UNDEFINED_OP2();
12321212
} else if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
12331213
dim++;
12341214
}
12351215
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
1216+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
1217+
zend_objects_store_del(obj);
1218+
}
12361219
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
12371220
HashTable *ht;
12381221
zend_uchar old_type;

Zend/zend_vm_execute.h

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -799,27 +799,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_OP_SPEC_HAN
799799
ZEND_VM_NEXT_OPCODE_EX(1, 2);
800800
}
801801

802-
static zend_never_inline ZEND_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_assign_dim_op_obj_undef_helper_SPEC(zend_object *obj ZEND_OPCODE_HANDLER_ARGS_DC)
803-
{
804-
USE_OPLINE
805-
zval *dim;
806-
807-
GC_ADDREF(obj);
808-
dim = ZVAL_UNDEFINED_OP2();
809-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
810-
zend_objects_store_del(obj);
811-
FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
812-
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
813-
ZVAL_NULL(EX_VAR(opline->result.var));
814-
}
815-
} else {
816-
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
817-
}
818-
FREE_OP(opline->op2_type, opline->op2.var);
819-
FREE_OP(opline->op1_type, opline->op1.var);
820-
ZEND_VM_NEXT_OPCODE_EX(1, 2);
821-
}
822-
823802
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
824803
{
825804
USE_OPLINE
@@ -22468,13 +22447,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST_H
2246822447
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
2246922448
zend_object *obj = Z_OBJ_P(container);
2247022449

22450+
GC_ADDREF(obj);
2247122451
dim = RT_CONSTANT(opline, opline->op2);
2247222452
if (IS_CONST == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
22473-
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
22453+
dim = ZVAL_UNDEFINED_OP2();
2247422454
} else if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2247522455
dim++;
2247622456
}
2247722457
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
22458+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
22459+
zend_objects_store_del(obj);
22460+
}
2247822461
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2247922462
HashTable *ht;
2248022463
zend_uchar old_type;
@@ -25119,13 +25102,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_
2511925102
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
2512025103
zend_object *obj = Z_OBJ_P(container);
2512125104

25105+
GC_ADDREF(obj);
2512225106
dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
2512325107
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
25124-
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
25108+
dim = ZVAL_UNDEFINED_OP2();
2512525109
} else if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2512625110
dim++;
2512725111
}
2512825112
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
25113+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
25114+
zend_objects_store_del(obj);
25115+
}
2512925116
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2513025117
HashTable *ht;
2513125118
zend_uchar old_type;
@@ -27408,13 +27395,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED_
2740827395
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
2740927396
zend_object *obj = Z_OBJ_P(container);
2741027397

27398+
GC_ADDREF(obj);
2741127399
dim = NULL;
2741227400
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
27413-
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
27401+
dim = ZVAL_UNDEFINED_OP2();
2741427402
} else if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2741527403
dim++;
2741627404
}
2741727405
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
27406+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
27407+
zend_objects_store_del(obj);
27408+
}
2741827409
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2741927410
HashTable *ht;
2742027411
zend_uchar old_type;
@@ -29245,13 +29236,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV_HAND
2924529236
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
2924629237
zend_object *obj = Z_OBJ_P(container);
2924729238

29239+
GC_ADDREF(obj);
2924829240
dim = EX_VAR(opline->op2.var);
2924929241
if (IS_CV == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
29250-
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
29242+
dim = ZVAL_UNDEFINED_OP2();
2925129243
} else if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2925229244
dim++;
2925329245
}
2925429246
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
29247+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
29248+
zend_objects_store_del(obj);
29249+
}
2925529250
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2925629251
HashTable *ht;
2925729252
zend_uchar old_type;
@@ -39949,13 +39944,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST_HA
3994939944
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
3995039945
zend_object *obj = Z_OBJ_P(container);
3995139946

39947+
GC_ADDREF(obj);
3995239948
dim = RT_CONSTANT(opline, opline->op2);
3995339949
if (IS_CONST == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
39954-
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
39950+
dim = ZVAL_UNDEFINED_OP2();
3995539951
} else if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
3995639952
dim++;
3995739953
}
3995839954
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
39955+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
39956+
zend_objects_store_del(obj);
39957+
}
3995939958
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
3996039959
HashTable *ht;
3996139960
zend_uchar old_type;
@@ -43679,13 +43678,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_H
4367943678
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
4368043679
zend_object *obj = Z_OBJ_P(container);
4368143680

43681+
GC_ADDREF(obj);
4368243682
dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
4368343683
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
43684-
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
43684+
dim = ZVAL_UNDEFINED_OP2();
4368543685
} else if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4368643686
dim++;
4368743687
}
4368843688
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
43689+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
43690+
zend_objects_store_del(obj);
43691+
}
4368943692
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4369043693
HashTable *ht;
4369143694
zend_uchar old_type;
@@ -46544,13 +46547,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED_H
4654446547
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
4654546548
zend_object *obj = Z_OBJ_P(container);
4654646549

46550+
GC_ADDREF(obj);
4654746551
dim = NULL;
4654846552
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
46549-
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
46553+
dim = ZVAL_UNDEFINED_OP2();
4655046554
} else if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4655146555
dim++;
4655246556
}
4655346557
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
46558+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
46559+
zend_objects_store_del(obj);
46560+
}
4655446561
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4655546562
HashTable *ht;
4655646563
zend_uchar old_type;
@@ -48912,13 +48919,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CV_HANDL
4891248919
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
4891348920
zend_object *obj = Z_OBJ_P(container);
4891448921

48922+
GC_ADDREF(obj);
4891548923
dim = EX_VAR(opline->op2.var);
4891648924
if (IS_CV == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
48917-
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
48925+
dim = ZVAL_UNDEFINED_OP2();
4891848926
} else if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4891948927
dim++;
4892048928
}
4892148929
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
48930+
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
48931+
zend_objects_store_del(obj);
48932+
}
4892248933
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4892348934
HashTable *ht;
4892448935
zend_uchar old_type;

0 commit comments

Comments
 (0)