diff options
Diffstat (limited to 'Zend/zend_compile.c')
| -rw-r--r-- | Zend/zend_compile.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 36055258f6..f1b5c54948 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5524,16 +5524,8 @@ void zend_compile_exit(znode *result, zend_ast *ast) /* {{{ */ } /* }}} */ -void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */ +static void zend_mark_function_as_generator() /* {{{ */ { - zend_ast *value_ast = ast->child[0]; - zend_ast *key_ast = ast->child[1]; - - znode value_node, key_node; - znode *value_node_ptr = NULL, *key_node_ptr = NULL; - zend_op *opline; - zend_bool returns_by_ref = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0; - if (!CG(active_op_array)->function_name) { zend_error_noreturn(E_COMPILE_ERROR, "The \"yield\" expression can only be used inside a function"); @@ -5555,6 +5547,20 @@ void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */ } CG(active_op_array)->fn_flags |= ZEND_ACC_GENERATOR; +} +/* }}} */ + +void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */ +{ + zend_ast *value_ast = ast->child[0]; + zend_ast *key_ast = ast->child[1]; + + znode value_node, key_node; + znode *value_node_ptr = NULL, *key_node_ptr = NULL; + zend_op *opline; + zend_bool returns_by_ref = (CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0; + + zend_mark_function_as_generator(); if (key_ast) { zend_compile_expr(&key_node, key_ast); @@ -5578,6 +5584,18 @@ void zend_compile_yield(znode *result, zend_ast *ast) /* {{{ */ } /* }}} */ +void zend_compile_yield_from(znode *result, zend_ast *ast) /* {{{ */ +{ + zend_ast *expr_ast = ast->child[0]; + znode expr_node; + + zend_mark_function_as_generator(); + + zend_compile_expr(&expr_node, expr_ast); + zend_emit_op_tmp(result, ZEND_YIELD_FROM, &expr_node, NULL); +} +/* }}} */ + void zend_compile_instanceof(znode *result, zend_ast *ast) /* {{{ */ { zend_ast *obj_ast = ast->child[0]; @@ -6404,6 +6422,9 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */ case ZEND_AST_YIELD: zend_compile_yield(result, ast); return; + case ZEND_AST_YIELD_FROM: + zend_compile_yield_from(result, ast); + return; case ZEND_AST_INSTANCEOF: zend_compile_instanceof(result, ast); return; |
