summaryrefslogtreecommitdiff
path: root/Zend/zend_opcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_opcode.c')
-rw-r--r--Zend/zend_opcode.c21
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: