diff options
Diffstat (limited to 'Zend/zend_opcode.c')
-rw-r--r-- | Zend/zend_opcode.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 563c84301d..2fd8f529ef 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -70,6 +70,9 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz op_array->T = 0; + op_array->nested_calls = 0; + op_array->used_stack = 0; + op_array->function_name = NULL; op_array->filename = zend_get_compiled_filename(TSRMLS_C); op_array->doc_comment = NULL; @@ -541,6 +544,15 @@ static void zend_resolve_finally_call(zend_op_array *op_array, zend_uint op_num, /* generate a FAST_CALL to finaly block */ start_op = get_next_op_number(op_array); + + if (op_array->opcodes[op_num].opcode == ZEND_YIELD) { + /* Disable yield in finally block */ + opline = get_next_op(op_array TSRMLS_CC); + opline->opcode = ZEND_GENERATOR_FLAG; + opline->extended_value = 1; + SET_UNUSED(opline->op1); + SET_UNUSED(opline->op2); + } opline = get_next_op(op_array TSRMLS_CC); opline->opcode = ZEND_FAST_CALL; SET_UNUSED(opline->op1); @@ -567,6 +579,14 @@ static void zend_resolve_finally_call(zend_op_array *op_array, zend_uint op_num, opline->op1.opline_num = op_array->try_catch_array[i].finally_op; } } + if (op_array->opcodes[op_num].opcode == ZEND_YIELD) { + /* Re-enable yield */ + opline = get_next_op(op_array TSRMLS_CC); + opline->opcode = ZEND_GENERATOR_FLAG; + opline->extended_value = 0; + SET_UNUSED(opline->op1); + SET_UNUSED(opline->op2); + } /* Finish the sequence with original opcode */ opline = get_next_op(op_array TSRMLS_CC); @@ -622,6 +642,7 @@ static void zend_resolve_finally_calls(zend_op_array *op_array TSRMLS_DC) switch (opline->opcode) { case ZEND_RETURN: case ZEND_RETURN_BY_REF: + case ZEND_YIELD: zend_resolve_finally_call(op_array, i, (zend_uint)-1 TSRMLS_CC); break; case ZEND_BRK: |