Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0cf6c11

Browse files
Allow arbitrary expressions in static variable initializer
1 parent 6a71153 commit 0cf6c11

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1198
-700
lines changed

‎Zend/Optimizer/block_pass.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,7 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array, zend_op
10021002
case ZEND_COALESCE:
10031003
case ZEND_ASSERT_CHECK:
10041004
case ZEND_JMP_NULL:
1005+
case ZEND_JMP_STATIC_DEF:
10051006
ZEND_SET_OP_JMP_ADDR(opline, opline->op2, new_opcodes + blocks[b->successors[0]].start);
10061007
break;
10071008
case ZEND_CATCH:

‎Zend/Optimizer/dce.c‎

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ static inline bool may_have_side_effects(
145145
case ZEND_COALESCE:
146146
case ZEND_ASSERT_CHECK:
147147
case ZEND_JMP_NULL:
148+
case ZEND_JMP_STATIC_DEF:
148149
/* For our purposes a jumps and branches are side effects. */
149150
return 1;
150151
case ZEND_BEGIN_SILENCE:
@@ -245,15 +246,9 @@ static inline bool may_have_side_effects(
245246
if ((opline->extended_value & (ZEND_BIND_IMPLICIT|ZEND_BIND_EXPLICIT))) {
246247
return 1;
247248
}
248-
249-
if ((opline->extended_value & ZEND_BIND_REF) != 0) {
250-
zval *value =
251-
(zval*)((char*)op_array->static_variables->arData +
252-
(opline->extended_value & ~ZEND_BIND_REF));
253-
if (Z_TYPE_P(value) == IS_CONSTANT_AST) {
254-
/* AST may contain undefined constants */
255-
return 1;
256-
}
249+
/* Modifies static variables which are observable through reflection */
250+
if ((opline->extended_value & ZEND_BIND_REF) && opline->op2_type != IS_UNUSED) {
251+
return 1;
257252
}
258253
}
259254
return 0;

‎Zend/Optimizer/dfa_pass.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,7 @@ static void zend_ssa_replace_control_link(zend_op_array *op_array, zend_ssa *ssa
652652
case ZEND_COALESCE:
653653
case ZEND_ASSERT_CHECK:
654654
case ZEND_JMP_NULL:
655+
case ZEND_JMP_STATIC_DEF:
655656
if (ZEND_OP2_JMP_ADDR(opline) == op_array->opcodes + old->start) {
656657
ZEND_SET_OP_JMP_ADDR(opline, opline->op2, op_array->opcodes + dst->start);
657658
}

‎Zend/Optimizer/pass1.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
354354
case ZEND_ASSERT_CHECK:
355355
case ZEND_JMP_NULL:
356356
case ZEND_VERIFY_NEVER_TYPE:
357+
case ZEND_JMP_STATIC_DEF:
357358
collect_constants = 0;
358359
break;
359360
}

‎Zend/Optimizer/sccp.c‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ static bool can_replace_op1(
249249
case ZEND_ROPE_ADD:
250250
case ZEND_ROPE_END:
251251
case ZEND_BIND_STATIC:
252+
case ZEND_JMP_STATIC_DEF:
252253
case ZEND_BIND_GLOBAL:
253254
case ZEND_MAKE_REF:
254255
case ZEND_UNSET_CV:
@@ -1772,6 +1773,7 @@ static void sccp_mark_feasible_successors(
17721773
case ZEND_CATCH:
17731774
case ZEND_FE_FETCH_R:
17741775
case ZEND_FE_FETCH_RW:
1776+
case ZEND_JMP_STATIC_DEF:
17751777
scdf_mark_edge_feasible(scdf, block_num, block->successors[0]);
17761778
scdf_mark_edge_feasible(scdf, block_num, block->successors[1]);
17771779
return;

‎Zend/Optimizer/zend_cfg.c‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array,
369369
case ZEND_COALESCE:
370370
case ZEND_ASSERT_CHECK:
371371
case ZEND_JMP_NULL:
372+
case ZEND_JMP_STATIC_DEF:
372373
BB_START(OP_JMP_ADDR(opline, opline->op2) - op_array->opcodes);
373374
BB_START(i + 1);
374375
break;
@@ -522,6 +523,7 @@ ZEND_API void zend_build_cfg(zend_arena **arena, const zend_op_array *op_array,
522523
case ZEND_COALESCE:
523524
case ZEND_ASSERT_CHECK:
524525
case ZEND_JMP_NULL:
526+
case ZEND_JMP_STATIC_DEF:
525527
block->successors_count = 2;
526528
block->successors[0] = block_map[OP_JMP_ADDR(opline, opline->op2) - op_array->opcodes];
527529
block->successors[1] = j + 1;

‎Zend/Optimizer/zend_dfg.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ static zend_always_inline void _zend_dfg_add_use_def_op(const zend_op_array *op_
150150
case ZEND_POST_DEC:
151151
case ZEND_BIND_GLOBAL:
152152
case ZEND_BIND_STATIC:
153+
case ZEND_JMP_STATIC_DEF:
153154
case ZEND_SEND_VAR_NO_REF:
154155
case ZEND_SEND_VAR_NO_REF_EX:
155156
case ZEND_SEND_VAR_EX:

‎Zend/Optimizer/zend_inference.c‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2944,6 +2944,10 @@ static zend_always_inline zend_result _zend_update_type_info(
29442944
}
29452945
UPDATE_SSA_TYPE(tmp, ssa_op->op1_def);
29462946
break;
2947+
case ZEND_JMP_STATIC_DEF:
2948+
tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_REF;
2949+
UPDATE_SSA_TYPE(tmp, ssa_op->op1_def);
2950+
break;
29472951
case ZEND_SEND_VAR:
29482952
if (ssa_op->op1_def >= 0) {
29492953
tmp = t1;
@@ -4361,6 +4365,7 @@ static void zend_mark_cv_references(const zend_op_array *op_array, const zend_sc
43614365
case ZEND_SEND_REF:
43624366
case ZEND_SEND_VAR_EX:
43634367
case ZEND_SEND_FUNC_ARG:
4368+
case ZEND_JMP_STATIC_DEF:
43644369
break;
43654370
case ZEND_INIT_ARRAY:
43664371
case ZEND_ADD_ARRAY_ELEMENT:
@@ -4516,6 +4521,7 @@ ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op
45164521
case ZEND_ASSIGN_REF:
45174522
case ZEND_BIND_GLOBAL:
45184523
case ZEND_BIND_STATIC:
4524+
case ZEND_JMP_STATIC_DEF:
45194525
case ZEND_FETCH_DIM_IS:
45204526
case ZEND_FETCH_OBJ_IS:
45214527
case ZEND_SEND_REF:
@@ -4753,14 +4759,12 @@ ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op
47534759
case ZEND_UNSET_VAR:
47544760
return (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY));
47554761
case ZEND_BIND_STATIC:
4762+
case ZEND_JMP_STATIC_DEF:
47564763
if (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY)) {
47574764
/* Destructor may throw. */
47584765
return 1;
4759-
} else {
4760-
zval *value = (zval*)((char*)op_array->static_variables->arData + (opline->extended_value & ~(ZEND_BIND_REF|ZEND_BIND_IMPLICIT|ZEND_BIND_EXPLICIT)));
4761-
/* May throw if initializer is CONSTANT_AST. */
4762-
return Z_TYPE_P(value) == IS_CONSTANT_AST;
47634766
}
4767+
return 0;
47644768
case ZEND_ASSIGN_DIM:
47654769
if ((opline+1)->op1_type == IS_CV) {
47664770
if (_ssa_op1_info(op_array, ssa, opline+1, ssa_op+1) & MAY_BE_UNDEF) {

‎Zend/Optimizer/zend_optimizer.c‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,7 @@ void zend_optimizer_migrate_jump(zend_op_array *op_array, zend_op *new_opline, z
720720
case ZEND_COALESCE:
721721
case ZEND_ASSERT_CHECK:
722722
case ZEND_JMP_NULL:
723+
case ZEND_JMP_STATIC_DEF:
723724
ZEND_SET_OP_JMP_ADDR(new_opline, new_opline->op2, ZEND_OP2_JMP_ADDR(opline));
724725
break;
725726
case ZEND_FE_FETCH_R:
@@ -763,6 +764,7 @@ void zend_optimizer_shift_jump(zend_op_array *op_array, zend_op *opline, uint32_
763764
case ZEND_COALESCE:
764765
case ZEND_ASSERT_CHECK:
765766
case ZEND_JMP_NULL:
767+
case ZEND_JMP_STATIC_DEF:
766768
ZEND_SET_OP_JMP_ADDR(opline, opline->op2, ZEND_OP2_JMP_ADDR(opline) - shiftlist[ZEND_OP2_JMP_ADDR(opline) - op_array->opcodes]);
767769
break;
768770
case ZEND_CATCH:
@@ -1157,6 +1159,7 @@ static void zend_redo_pass_two(zend_op_array *op_array)
11571159
case ZEND_FE_RESET_RW:
11581160
case ZEND_ASSERT_CHECK:
11591161
case ZEND_JMP_NULL:
1162+
case ZEND_JMP_STATIC_DEF:
11601163
opline->op2.jmp_addr = &op_array->opcodes[opline->op2.jmp_addr - old_opcodes];
11611164
break;
11621165
case ZEND_CATCH:
@@ -1277,6 +1280,7 @@ static void zend_redo_pass_two_ex(zend_op_array *op_array, zend_ssa *ssa)
12771280
case ZEND_FE_RESET_RW:
12781281
case ZEND_ASSERT_CHECK:
12791282
case ZEND_JMP_NULL:
1283+
case ZEND_JMP_STATIC_DEF:
12801284
opline->op2.jmp_addr = &op_array->opcodes[opline->op2.jmp_addr - old_opcodes];
12811285
break;
12821286
case ZEND_CATCH:

‎Zend/Optimizer/zend_ssa.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,7 @@ static zend_always_inline int _zend_ssa_rename_op(const zend_op_array *op_array,
679679
case ZEND_POST_DEC:
680680
case ZEND_BIND_GLOBAL:
681681
case ZEND_BIND_STATIC:
682+
case ZEND_JMP_STATIC_DEF:
682683
case ZEND_SEND_VAR_NO_REF:
683684
case ZEND_SEND_VAR_NO_REF_EX:
684685
case ZEND_SEND_VAR_EX:

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /