Skip to content

Commit 08f1d47

Browse files
committed
Separate "cold" code
1 parent cf377ee commit 08f1d47

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
@@ -1425,17 +1425,17 @@ static zend_always_inline int zend_binary_op(zval *ret, zval *op1, zval *op2 OPL
14251425
return zend_binary_ops[opcode - ZEND_ADD](ret, op1, op2);
14261426
}
14271427

1428-
static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC)
1428+
static zend_never_inline void zend_binary_assign_op_obj_dim(zend_object *obj, zval *property OPLINE_DC EXECUTE_DATA_DC)
14291429
{
14301430
zval *value;
14311431
zval *z;
14321432
zval rv, res;
14331433

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

14371437
if (zend_binary_op(&res, z, value OPLINE_CC) == SUCCESS) {
1438-
Z_OBJ_HT_P(object)->write_dimension(Z_OBJ_P(object), property, &res);
1438+
obj->handlers->write_dimension(obj, property, &res);
14391439
}
14401440
if (z == &rv) {
14411441
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
@@ -22445,19 +22466,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CONST_H
2244522466
}
2244622467

2244722468
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
22469+
zend_object *obj = Z_OBJ_P(container);
22470+
2244822471
dim = RT_CONSTANT(opline, opline->op2);
2244922472
if (IS_CONST == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
22450-
zend_object *obj = Z_OBJ_P(container);
22451-
GC_ADDREF(obj);
22452-
dim = ZVAL_UNDEFINED_OP2();
22453-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
22454-
zend_objects_store_del(obj);
22455-
goto assign_dim_op_ret_null;
22456-
}
22473+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
2245722474
} else if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2245822475
dim++;
2245922476
}
22460-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
22477+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
2246122478
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2246222479
HashTable *ht;
2246322480
zend_uchar old_type;
@@ -25124,19 +25141,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_TMPVAR_
2512425141
}
2512525142

2512625143
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
25144+
zend_object *obj = Z_OBJ_P(container);
25145+
2512725146
dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
2512825147
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
25129-
zend_object *obj = Z_OBJ_P(container);
25130-
GC_ADDREF(obj);
25131-
dim = ZVAL_UNDEFINED_OP2();
25132-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
25133-
zend_objects_store_del(obj);
25134-
goto assign_dim_op_ret_null;
25135-
}
25148+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
2513625149
} else if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2513725150
dim++;
2513825151
}
25139-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
25152+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
2514025153
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2514125154
HashTable *ht;
2514225155
zend_uchar old_type;
@@ -27441,19 +27454,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_UNUSED_
2744127454
}
2744227455

2744327456
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
27457+
zend_object *obj = Z_OBJ_P(container);
27458+
2744427459
dim = NULL;
2744527460
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
27446-
zend_object *obj = Z_OBJ_P(container);
27447-
GC_ADDREF(obj);
27448-
dim = ZVAL_UNDEFINED_OP2();
27449-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
27450-
zend_objects_store_del(obj);
27451-
goto assign_dim_op_ret_null;
27452-
}
27461+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
2745327462
} else if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2745427463
dim++;
2745527464
}
27456-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
27465+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
2745727466
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2745827467
HashTable *ht;
2745927468
zend_uchar old_type;
@@ -29306,19 +29315,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_VAR_CV_HAND
2930629315
}
2930729316

2930829317
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
29318+
zend_object *obj = Z_OBJ_P(container);
29319+
2930929320
dim = EX_VAR(opline->op2.var);
2931029321
if (IS_CV == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
29311-
zend_object *obj = Z_OBJ_P(container);
29312-
GC_ADDREF(obj);
29313-
dim = ZVAL_UNDEFINED_OP2();
29314-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
29315-
zend_objects_store_del(obj);
29316-
goto assign_dim_op_ret_null;
29317-
}
29322+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
2931829323
} else if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2931929324
dim++;
2932029325
}
29321-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
29326+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
2932229327
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
2932329328
HashTable *ht;
2932429329
zend_uchar old_type;
@@ -40038,19 +40043,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CONST_HA
4003840043
}
4003940044

4004040045
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
40046+
zend_object *obj = Z_OBJ_P(container);
40047+
4004140048
dim = RT_CONSTANT(opline, opline->op2);
4004240049
if (IS_CONST == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
40043-
zend_object *obj = Z_OBJ_P(container);
40044-
GC_ADDREF(obj);
40045-
dim = ZVAL_UNDEFINED_OP2();
40046-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
40047-
zend_objects_store_del(obj);
40048-
goto assign_dim_op_ret_null;
40049-
}
40050+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
4005040051
} else if (IS_CONST == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4005140052
dim++;
4005240053
}
40053-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
40054+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
4005440055
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4005540056
HashTable *ht;
4005640057
zend_uchar old_type;
@@ -43796,19 +43797,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_TMPVAR_H
4379643797
}
4379743798

4379843799
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
43800+
zend_object *obj = Z_OBJ_P(container);
43801+
4379943802
dim = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
4380043803
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
43801-
zend_object *obj = Z_OBJ_P(container);
43802-
GC_ADDREF(obj);
43803-
dim = ZVAL_UNDEFINED_OP2();
43804-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
43805-
zend_objects_store_del(obj);
43806-
goto assign_dim_op_ret_null;
43807-
}
43804+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
4380843805
} else if ((IS_TMP_VAR|IS_VAR) == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4380943806
dim++;
4381043807
}
43811-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
43808+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
4381243809
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4381343810
HashTable *ht;
4381443811
zend_uchar old_type;
@@ -46689,19 +46686,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_UNUSED_H
4668946686
}
4669046687

4669146688
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
46689+
zend_object *obj = Z_OBJ_P(container);
46690+
4669246691
dim = NULL;
4669346692
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
46694-
zend_object *obj = Z_OBJ_P(container);
46695-
GC_ADDREF(obj);
46696-
dim = ZVAL_UNDEFINED_OP2();
46697-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
46698-
zend_objects_store_del(obj);
46699-
goto assign_dim_op_ret_null;
46700-
}
46693+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
4670146694
} else if (IS_UNUSED == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4670246695
dim++;
4670346696
}
46704-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
46697+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
4670546698
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4670646699
HashTable *ht;
4670746700
zend_uchar old_type;
@@ -49085,19 +49078,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_OP_SPEC_CV_CV_HANDL
4908549078
}
4908649079

4908749080
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
49081+
zend_object *obj = Z_OBJ_P(container);
49082+
4908849083
dim = EX_VAR(opline->op2.var);
4908949084
if (IS_CV == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
49090-
zend_object *obj = Z_OBJ_P(container);
49091-
GC_ADDREF(obj);
49092-
dim = ZVAL_UNDEFINED_OP2();
49093-
if (UNEXPECTED(GC_DELREF(obj) == 0)) {
49094-
zend_objects_store_del(obj);
49095-
goto assign_dim_op_ret_null;
49096-
}
49085+
ZEND_VM_TAIL_CALL(zend_assign_dim_op_obj_undef_helper_SPEC(obj ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
4909749086
} else if (IS_CV == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
4909849087
dim++;
4909949088
}
49100-
zend_binary_assign_op_obj_dim(container, dim OPLINE_CC EXECUTE_DATA_CC);
49089+
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
4910149090
} else if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) {
4910249091
HashTable *ht;
4910349092
zend_uchar old_type;

0 commit comments

Comments
 (0)