Skip to content

Commit a5706e2

Browse files
Use zval's extra as a bitfield
1 parent 75b0d56 commit a5706e2

11 files changed

+103
-103
lines changed

Zend/Optimizer/compact_literals.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
253253
LITERAL_INFO(opline->op1.constant, 1);
254254
}
255255
if (opline->op2_type == IS_CONST) {
256-
if (Z_EXTRA(op_array->literals[opline->op2.constant]) == ZEND_EXTRA_VALUE) {
256+
if (Z_EXTRA(op_array->literals[opline->op2.constant]) & ZEND_EXTRA_VALUE) {
257257
LITERAL_INFO(opline->op2.constant, 2);
258258
} else {
259259
LITERAL_INFO(opline->op2.constant, 1);

Zend/Optimizer/zend_optimizer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ bool zend_optimizer_update_op2_const(zend_op_array *op_array,
579579
opline->op2.constant = zend_optimizer_add_literal(op_array, &tmp);
580580
zend_string_hash_val(Z_STR_P(val));
581581
zend_optimizer_add_literal(op_array, val);
582-
Z_EXTRA(op_array->literals[opline->op2.constant]) = ZEND_EXTRA_VALUE;
582+
Z_EXTRA(op_array->literals[opline->op2.constant]) |= ZEND_EXTRA_VALUE;
583583
break;
584584
}
585585
}

Zend/zend_compile.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2553,7 +2553,7 @@ static inline void zend_handle_numeric_dim(zend_op *opline, znode *dim_node) /*
25532553
int c = zend_add_literal(&dim_node->u.constant);
25542554
ZEND_ASSERT(opline->op2.constant + 1 == c);
25552555
ZVAL_LONG(CT_CONSTANT(opline->op2), index);
2556-
Z_EXTRA_P(CT_CONSTANT(opline->op2)) = ZEND_EXTRA_VALUE;
2556+
Z_EXTRA_P(CT_CONSTANT(opline->op2)) |= ZEND_EXTRA_VALUE;
25572557
return;
25582558
}
25592559
}

Zend/zend_execute.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2530,7 +2530,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *
25302530
GC_ADDREF(obj);
25312531
if (ZEND_CONST_COND(dim_type == IS_CV, dim != NULL) && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
25322532
dim = ZVAL_UNDEFINED_OP2();
2533-
} else if (dim_type == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2533+
} else if (dim_type == IS_CONST && (Z_EXTRA_P(dim) & ZEND_EXTRA_VALUE)) {
25342534
dim++;
25352535
}
25362536
retval = obj->handlers->read_dimension(obj, dim, type, result);
@@ -2736,7 +2736,7 @@ static zend_always_inline void zend_fetch_dimension_address_read(zval *result, z
27362736
if (ZEND_CONST_COND(dim_type == IS_CV, 1) && UNEXPECTED(Z_TYPE_P(dim) == IS_UNDEF)) {
27372737
dim = ZVAL_UNDEFINED_OP2();
27382738
}
2739-
if (dim_type == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2739+
if (dim_type == IS_CONST && (Z_EXTRA_P(dim) & ZEND_EXTRA_VALUE)) {
27402740
dim++;
27412741
}
27422742
retval = obj->handlers->read_dimension(obj, dim, type, result);

Zend/zend_object_handlers.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ ZEND_API zval *zend_std_read_property(zend_object *zobj, zend_string *name, int
634634
}
635635
}
636636
}
637-
if (UNEXPECTED(Z_PROP_FLAG_P(retval) == IS_PROP_UNINIT)) {
637+
if (UNEXPECTED(Z_PROP_FLAG_P(retval) & IS_PROP_UNINIT)) {
638638
/* Skip __get() for uninitialized typed properties */
639639
goto uninit_error;
640640
}
@@ -811,7 +811,7 @@ ZEND_API zval *zend_std_write_property(zend_object *zobj, zend_string *name, zva
811811
Z_TRY_ADDREF_P(value);
812812

813813
if (UNEXPECTED(prop_info)) {
814-
if (UNEXPECTED((prop_info->flags & ZEND_ACC_READONLY) && Z_PROP_FLAG_P(variable_ptr) != IS_PROP_UNINIT)) {
814+
if (UNEXPECTED((prop_info->flags & ZEND_ACC_READONLY) && !(Z_PROP_FLAG_P(variable_ptr) & IS_PROP_UNINIT))) {
815815
Z_TRY_DELREF_P(value);
816816
zend_readonly_property_modification_error(prop_info);
817817
variable_ptr = &EG(error_zval);
@@ -832,7 +832,7 @@ ZEND_API zval *zend_std_write_property(zend_object *zobj, zend_string *name, zva
832832
variable_ptr, value, IS_TMP_VAR, property_uses_strict_types());
833833
goto exit;
834834
}
835-
if (Z_PROP_FLAG_P(variable_ptr) == IS_PROP_UNINIT) {
835+
if (Z_PROP_FLAG_P(variable_ptr) & IS_PROP_UNINIT) {
836836
/* Writes to uninitialized typed properties bypass __set(). */
837837
goto write_std_property;
838838
}
@@ -895,7 +895,7 @@ ZEND_API zval *zend_std_write_property(zend_object *zobj, zend_string *name, zva
895895
goto exit;
896896
}
897897
value = &tmp;
898-
Z_PROP_FLAG_P(variable_ptr) = 0;
898+
Z_PROP_FLAG_P(variable_ptr) &= ~IS_PROP_UNINIT;
899899
goto found; /* might have been updated via e.g. __toString() */
900900
}
901901

@@ -1050,7 +1050,7 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
10501050
if (UNEXPECTED(Z_TYPE_P(retval) == IS_UNDEF)) {
10511051
if (EXPECTED(!zobj->ce->__get) ||
10521052
UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET) ||
1053-
UNEXPECTED(prop_info && Z_PROP_FLAG_P(retval) == IS_PROP_UNINIT)) {
1053+
UNEXPECTED(prop_info && (Z_PROP_FLAG_P(retval) & IS_PROP_UNINIT))) {
10541054
if (UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) {
10551055
if (UNEXPECTED(prop_info)) {
10561056
zend_throw_error(NULL,
@@ -1126,7 +1126,7 @@ ZEND_API void zend_std_unset_property(zend_object *zobj, zend_string *name, void
11261126
zval *slot = OBJ_PROP(zobj, property_offset);
11271127

11281128
if (Z_TYPE_P(slot) != IS_UNDEF) {
1129-
if (UNEXPECTED(prop_info && (prop_info->flags & ZEND_ACC_READONLY) && Z_PROP_FLAG_P(slot) != IS_PROP_UNINIT)) {
1129+
if (UNEXPECTED(prop_info && (prop_info->flags & ZEND_ACC_READONLY) && !(Z_PROP_FLAG_P(slot) & IS_PROP_UNINIT))) {
11301130
zend_readonly_property_unset_error(prop_info->ce, name);
11311131
return;
11321132
}
@@ -1145,14 +1145,14 @@ ZEND_API void zend_std_unset_property(zend_object *zobj, zend_string *name, void
11451145
}
11461146
return;
11471147
}
1148-
if (UNEXPECTED(Z_PROP_FLAG_P(slot) == IS_PROP_UNINIT)) {
1148+
if (UNEXPECTED(Z_PROP_FLAG_P(slot) & IS_PROP_UNINIT)) {
11491149
if (UNEXPECTED(prop_info && (prop_info->flags & ZEND_ACC_READONLY)
11501150
&& !verify_readonly_initialization_access(prop_info, zobj->ce, name, "unset"))) {
11511151
return;
11521152
}
11531153

11541154
/* Reset the IS_PROP_UNINIT flag, if it exists and bypass __unset(). */
1155-
Z_PROP_FLAG_P(slot) = 0;
1155+
Z_PROP_FLAG_P(slot) &= ~IS_PROP_UNINIT;
11561156
return;
11571157
}
11581158
} else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))
@@ -1760,7 +1760,7 @@ ZEND_API int zend_std_has_property(zend_object *zobj, zend_string *name, int has
17601760
if (Z_TYPE_P(value) != IS_UNDEF) {
17611761
goto found;
17621762
}
1763-
if (UNEXPECTED(Z_PROP_FLAG_P(value) == IS_PROP_UNINIT)) {
1763+
if (UNEXPECTED(Z_PROP_FLAG_P(value) & IS_PROP_UNINIT)) {
17641764
/* Skip __isset() for uninitialized typed properties */
17651765
result = 0;
17661766
goto exit;

Zend/zend_objects.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object,
214214
prop_info = zend_get_property_info_for_slot(new_object, dst);
215215
if (UNEXPECTED(prop_info->flags & ZEND_ACC_READONLY)) {
216216
slot = OBJ_PROP(new_object, prop_info->offset);
217-
Z_PROP_FLAG_P(slot) = IS_PROP_UNINIT;
217+
Z_PROP_FLAG_P(slot) |= IS_PROP_UNINIT;
218218
}
219219
}
220220
src++;
@@ -272,8 +272,8 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object,
272272
prop_info = zend_get_property_info_for_slot(new_object, dst);
273273
if (UNEXPECTED(prop_info->flags & ZEND_ACC_READONLY)) {
274274
slot = OBJ_PROP(new_object, prop_info->offset);
275-
if (Z_TYPE_P(slot) != IS_UNDEF && Z_PROP_FLAG_P(slot) == IS_PROP_UNINIT) {
276-
Z_PROP_FLAG_P(slot) = 0;
275+
if (Z_TYPE_P(slot) != IS_UNDEF && (Z_PROP_FLAG_P(slot) & IS_PROP_UNINIT)) {
276+
Z_PROP_FLAG_P(slot) &= ~IS_PROP_UNINIT;
277277
}
278278
}
279279
dst++;

Zend/zend_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1437,7 +1437,7 @@ static zend_always_inline uint32_t zval_delref_p(zval* pz) {
14371437
* (both use IS_UNDEF type) in the Z_EXTRA space. As such we also need to copy
14381438
* the Z_EXTRA space when copying property default values etc. We define separate
14391439
* macros for this purpose, so this workaround is easier to remove in the future. */
1440-
#define IS_PROP_UNINIT 1
1440+
#define IS_PROP_UNINIT 2
14411441
#define Z_PROP_FLAG_P(z) Z_EXTRA_P(z)
14421442
#define ZVAL_COPY_VALUE_PROP(z, v) \
14431443
do { *(z) = *(v); } while (0)

Zend/zend_vm_def.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,7 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array):
12081208
zend_object *obj = Z_OBJ_P(container);
12091209

12101210
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
1211-
if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
1211+
if (OP2_TYPE == IS_CONST && (Z_EXTRA_P(dim) & ZEND_EXTRA_VALUE)) {
12121212
dim++;
12131213
}
12141214
zend_binary_assign_op_obj_dim(obj, dim OPLINE_CC EXECUTE_DATA_CC);
@@ -1911,7 +1911,7 @@ ZEND_VM_C_LABEL(fetch_dim_r_array):
19111911
}
19121912
} else {
19131913
ZEND_VM_C_LABEL(fetch_dim_r_slow):
1914-
if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
1914+
if (OP2_TYPE == IS_CONST && (Z_EXTRA_P(dim) & ZEND_EXTRA_VALUE)) {
19151915
dim++;
19161916
}
19171917
zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);
@@ -2614,7 +2614,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
26142614
dim = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R);
26152615
if (OP2_TYPE == IS_CV && UNEXPECTED(Z_ISUNDEF_P(dim))) {
26162616
dim = ZVAL_UNDEFINED_OP2();
2617-
} else if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
2617+
} else if (OP2_TYPE == IS_CONST && (Z_EXTRA_P(dim) & ZEND_EXTRA_VALUE)) {
26182618
dim++;
26192619
}
26202620

@@ -6537,7 +6537,7 @@ ZEND_VM_C_LABEL(num_index_dim):
65376537
offset = ZVAL_UNDEFINED_OP2();
65386538
}
65396539
if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
6540-
if (OP2_TYPE == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
6540+
if (OP2_TYPE == IS_CONST && (Z_EXTRA_P(offset) & ZEND_EXTRA_VALUE)) {
65416541
offset++;
65426542
}
65436543
Z_OBJ_HT_P(container)->unset_dimension(Z_OBJ_P(container), offset);
@@ -7312,7 +7312,7 @@ ZEND_VM_C_LABEL(num_index_prop):
73127312
}
73137313
}
73147314

7315-
if (OP2_TYPE == IS_CONST && Z_EXTRA_P(offset) == ZEND_EXTRA_VALUE) {
7315+
if (OP2_TYPE == IS_CONST && (Z_EXTRA_P(offset) & ZEND_EXTRA_VALUE)) {
73167316
offset++;
73177317
}
73187318
if (!(opline->extended_value & ZEND_ISEMPTY)) {
@@ -9775,7 +9775,7 @@ ZEND_VM_C_LABEL(fetch_dim_r_index_array):
97759775
} else {
97769776
ZEND_VM_C_LABEL(fetch_dim_r_index_slow):
97779777
SAVE_OPLINE();
9778-
if (OP2_TYPE == IS_CONST && Z_EXTRA_P(dim) == ZEND_EXTRA_VALUE) {
9778+
if (OP2_TYPE == IS_CONST && (Z_EXTRA_P(dim) & ZEND_EXTRA_VALUE)) {
97799779
dim++;
97809780
}
97819781
zend_fetch_dimension_address_read_R_slow(container, dim OPLINE_CC EXECUTE_DATA_CC);

0 commit comments

Comments
 (0)