diff options
Diffstat (limited to 'Zend/zend_compile.c')
| -rw-r--r-- | Zend/zend_compile.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 67fed1297f..634ebb8c3f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -832,10 +832,29 @@ void do_pass_param(znode *param, int op, int offset CLS_DC) } -void do_return(znode *expr CLS_DC) +static void generate_free_switch_expr(zend_switch_entry *switch_entry CLS_DC) { zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); + return; + opline->opcode = ZEND_SWITCH_FREE; + opline->op1 = switch_entry->cond; + SET_UNUSED(opline->op2); +} + + +void do_return(znode *expr CLS_DC) +{ + zend_op *opline; + +#ifdef ZTS + zend_stack_apply_with_argument(&CG(switch_cond_stack), (void (*)(void *element, void *)) generate_free_switch_expr, ZEND_STACK_APPLY_TOPDOWN CLS_CC); +#else + zend_stack_apply(&CG(switch_cond_stack), (void (*)(void *element)) generate_free_switch_expr, ZEND_STACK_APPLY_TOPDOWN); +#endif + + opline = get_next_op(CG(active_op_array) CLS_CC); + opline->opcode = ZEND_RETURN; if (expr) { opline->op1 = *expr; |
