Skip to content

Commit 90e5eed

Browse files
committed
Merge branch 'PHP-8.1'
* PHP-8.1: Separate "cold" code
2 parents 09e991f + 08f1d47 commit 90e5eed

File tree

3 files changed

+81
-75
lines changed

3 files changed

+81
-75
lines changed

Zend/zend_execute.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,17 +1411,17 @@ static zend_always_inline int zend_binary_op(zval *ret, zval *op1, zval *op2 OPL
14111411
return zend_binary_ops[opcode - ZEND_ADD](ret, op1, op2);
14121412
}
14131413

1414-
static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC)
1414+
static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zval *property OPLINE_DC EXECUTE_DATA_DC)
14151415
{
14161416
zval *value;
14171417
zval *z;
14181418
zval rv, res;
14191419

14201420
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1);
1421-
if ((z = Z_OBJ_HT_P(object)->read_dimension(Z_OBJ_P(object), property, BP_VAR_R, &rv)) != NULL) {
1421+
if ((z = obj->handlers->read_dimension(obj, property, BP_VAR_R, &rv)) != NULL) {
14221422

14231423
if (zend_binary_op(&res, z, value OPLINE_CC) == SUCCESS) {
1424-
Z_OBJ_HT_P(object)->write_dimension(Z_OBJ_P(object), property, &res);
1424+
obj->handlers->write_dimension(obj, property, &res);
14251425
}
14261426
if (z == &rv) {
14271427
zval_ptr_dtor(&rv);

Zend/zend_vm_def.h

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,27 @@ 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+
11481169
ZEND_VM_HANDLER(27, ZEND_ASSIGN_DIM_OP, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, OP)
11491170
{
11501171
USE_OPLINE
@@ -1203,19 +1224,15 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array):
12031224
}
12041225

12051226
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
1227+
zend_object *obj = Z_OBJ_P(container);
1228+
12061229
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
12071230
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
1208-
zend_object *obj = Z_OBJ_P(container);
1209-
GC_ADDREF(obj);
1210-
dim = ZVAL_UNDEFINED_OP2();
1211-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
1212-
zend_objects_store_del(obj);
1213-
ZEND_VM_C_GOTO(assign_dim_op_ret_null);
1214-
}
1231+
ZEND_VM_DISPATCH_TO_HELPER(zend_assign_dim_op_obj_undef_helper, obj, obj);
12151232
} else if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
12161233
dim++;
12171234
}
1218-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
1235+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
12191236
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
12201237
HashTable *ht;
12211238
zend_uchar old_type;

Zend/zend_vm_execute.h

Lines changed: 53 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,27 @@ 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+
802823
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
803824
{
804825
USE_OPLINE
@@ -22514,19 +22535,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST_H
2251422535
}
2251522536

2251622537
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
22538+
zend_object *obj = Z_OBJ_P(container);
22539+
2251722540
dim = RT_CONSTANT(opline, opline->op2);
2251822541
if (IS_CONST == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
22519-
zend_object *obj = Z_OBJ_P(container);
22520-
GC_ADDREF(obj);
22521-
dim = ZVAL_UNDEFINED_OP2();
22522-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
22523-
zend_objects_store_del(obj);
22524-
goto assign_dim_op_ret_null;
22525-
}
22542+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
2252622543
} else if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2252722544
dim++;
2252822545
}
22529-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
22546+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
2253022547
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2253122548
HashTable *ht;
2253222549
zend_uchar old_type;
@@ -25193,19 +25210,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_
2519325210
}
2519425211

2519525212
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
25213+
zend_object *obj = Z_OBJ_P(container);
25214+
2519625215
dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
2519725216
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
25198-
zend_object *obj = Z_OBJ_P(container);
25199-
GC_ADDREF(obj);
25200-
dim = ZVAL_UNDEFINED_OP2();
25201-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
25202-
zend_objects_store_del(obj);
25203-
goto assign_dim_op_ret_null;
25204-
}
25217+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
2520525218
} else if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2520625219
dim++;
2520725220
}
25208-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
25221+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
2520925222
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2521025223
HashTable *ht;
2521125224
zend_uchar old_type;
@@ -27510,19 +27523,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED_
2751027523
}
2751127524

2751227525
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
27526+
zend_object *obj = Z_OBJ_P(container);
27527+
2751327528
dim = NULL;
2751427529
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
27515-
zend_object *obj = Z_OBJ_P(container);
27516-
GC_ADDREF(obj);
27517-
dim = ZVAL_UNDEFINED_OP2();
27518-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
27519-
zend_objects_store_del(obj);
27520-
goto assign_dim_op_ret_null;
27521-
}
27530+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
2752227531
} else if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2752327532
dim++;
2752427533
}
27525-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
27534+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
2752627535
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2752727536
HashTable *ht;
2752827537
zend_uchar old_type;
@@ -29375,19 +29384,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV_HAND
2937529384
}
2937629385

2937729386
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
29387+
zend_object *obj = Z_OBJ_P(container);
29388+
2937829389
dim = EX_VAR(opline->op2.var);
2937929390
if (IS_CV == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
29380-
zend_object *obj = Z_OBJ_P(container);
29381-
GC_ADDREF(obj);
29382-
dim = ZVAL_UNDEFINED_OP2();
29383-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
29384-
zend_objects_store_del(obj);
29385-
goto assign_dim_op_ret_null;
29386-
}
29391+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
2938729392
} else if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2938829393
dim++;
2938929394
}
29390-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
29395+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
2939129396
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2939229397
HashTable *ht;
2939329398
zend_uchar old_type;
@@ -40168,19 +40173,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST_HA
4016840173
}
4016940174

4017040175
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
40176+
zend_object *obj = Z_OBJ_P(container);
40177+
4017140178
dim = RT_CONSTANT(opline, opline->op2);
4017240179
if (IS_CONST == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
40173-
zend_object *obj = Z_OBJ_P(container);
40174-
GC_ADDREF(obj);
40175-
dim = ZVAL_UNDEFINED_OP2();
40176-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
40177-
zend_objects_store_del(obj);
40178-
goto assign_dim_op_ret_null;
40179-
}
40180+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
4018040181
} else if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4018140182
dim++;
4018240183
}
40183-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
40184+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
4018440185
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4018540186
HashTable *ht;
4018640187
zend_uchar old_type;
@@ -43935,19 +43936,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_H
4393543936
}
4393643937

4393743938
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
43939+
zend_object *obj = Z_OBJ_P(container);
43940+
4393843941
dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
4393943942
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
43940-
zend_object *obj = Z_OBJ_P(container);
43941-
GC_ADDREF(obj);
43942-
dim = ZVAL_UNDEFINED_OP2();
43943-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
43944-
zend_objects_store_del(obj);
43945-
goto assign_dim_op_ret_null;
43946-
}
43943+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
4394743944
} else if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4394843945
dim++;
4394943946
}
43950-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
43947+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
4395143948
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4395243949
HashTable *ht;
4395343950
zend_uchar old_type;
@@ -46837,19 +46834,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED_H
4683746834
}
4683846835

4683946836
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
46837+
zend_object *obj = Z_OBJ_P(container);
46838+
4684046839
dim = NULL;
4684146840
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
46842-
zend_object *obj = Z_OBJ_P(container);
46843-
GC_ADDREF(obj);
46844-
dim = ZVAL_UNDEFINED_OP2();
46845-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
46846-
zend_objects_store_del(obj);
46847-
goto assign_dim_op_ret_null;
46848-
}
46841+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
4684946842
} else if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4685046843
dim++;
4685146844
}
46852-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
46845+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
4685346846
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4685446847
HashTable *ht;
4685546848
zend_uchar old_type;
@@ -49234,19 +49227,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CV_HANDL
4923449227
}
4923549228

4923649229
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
49230+
zend_object *obj = Z_OBJ_P(container);
49231+
4923749232
dim = EX_VAR(opline->op2.var);
4923849233
if (IS_CV == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
49239-
zend_object *obj = Z_OBJ_P(container);
49240-
GC_ADDREF(obj);
49241-
dim = ZVAL_UNDEFINED_OP2();
49242-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
49243-
zend_objects_store_del(obj);
49244-
goto assign_dim_op_ret_null;
49245-
}
49234+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
4924649235
} else if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4924749236
dim++;
4924849237
}
49249-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
49238+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
4925049239
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4925149240
HashTable *ht;
4925249241
zend_uchar old_type;

0 commit comments

Comments
 (0)