diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2018-02-16 21:25:49 +0100 |
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2018-02-16 21:30:48 +0100 |
| commit | b0af9ac7331e3efa0dcee4f43b2ba8b1e4e52f2f (patch) | |
| tree | 5b40edba9eee94ab22fe494ce0c919b3ffdfebe4 /Zend/zend_compile.c | |
| parent | 07ad75ca9603b8b0195ddcd90229ae9dbe650900 (diff) | |
| download | php-git-b0af9ac7331e3efa0dcee4f43b2ba8b1e4e52f2f.tar.gz | |
Avoid live range references in opcodes
Don't store the live range of the freed variable for FREE_ON_RETURN
frees, instead look it up at runtime. As this is an extremely
unlikely codepath (in particular, it requires a loop variable with
a throwing destructor), saving the runtime lookup of the live range
is not worth the extra complexity this adds everywhere else.
Diffstat (limited to 'Zend/zend_compile.c')
| -rw-r--r-- | Zend/zend_compile.c | 19 |
1 files changed, 0 insertions, 19 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 9c8fe3f4d7..1190cef1b4 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -629,7 +629,6 @@ static uint32_t zend_start_live_range_ex(zend_op_array *op_array, uint32_t start if (!zend_stack_is_empty(&CG(loop_var_stack))) { zend_loop_var *loop_var = zend_stack_top(&CG(loop_var_stack)); zend_loop_var *base = zend_stack_base(&CG(loop_var_stack)); - int check_opcodes = 0; for (; loop_var >= base; loop_var--) { if (loop_var->opcode == ZEND_RETURN) { @@ -639,28 +638,11 @@ static uint32_t zend_start_live_range_ex(zend_op_array *op_array, uint32_t start loop_var->opcode == ZEND_FE_FREE) { if (loop_var->u.live_range_offset >= n) { loop_var->u.live_range_offset++; - check_opcodes = 1; } else { break; } } } - - /* update previously generated FREE/FE_FREE opcodes */ - if (check_opcodes) { - zend_op *opline = op_array->opcodes + op_array->live_range[n+1].start; - zend_op *end = op_array->opcodes + op_array->last; - - while (opline < end) { - if ((opline->opcode == ZEND_FREE || - opline->opcode == ZEND_FE_FREE) && - (opline->extended_value & ZEND_FREE_ON_RETURN) && - opline->op2.num >= n) { - opline->op2.num++; - } - opline++; - } - } } return n; } @@ -4463,7 +4445,6 @@ static int zend_handle_loops_and_finally_ex(zend_long depth, znode *return_value opline->op1_type = loop_var->var_type; opline->op1.var = loop_var->var_num; SET_UNUSED(opline->op2); - opline->op2.num = loop_var->u.live_range_offset; opline->extended_value = ZEND_FREE_ON_RETURN; depth--; } |
