com php-src: Forgot to transform some errors to engine exceptions: Zend/zend_vm_def.h Zend/zend_vm_execute.h
| From: | Bob Weinand | Date: | Wed, 15 Apr 2015 19:42:26 +0000 |
| Subject: | com php-src: Forgot to transform some errors to engine exceptions: Zend/zend_vm_def.h Zend/zend_vm_execute.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-86315@lists.php.net to get a copy of this message | ||
Commit: 27033f981816a09fb63c258494af7e91f16a9736
Author: Bob Weinand <bobwei9@hotmail.com> Tue, 14 Apr 2015 19:53:16 +0200
Parents: eed18f0ee872c6ca685c5b84a86f5657c6b9d915
Branches: master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=27033f981816a09fb63c258494af7e91f16a9736
Log:
Forgot to transform some errors to engine exceptions
Changed paths:
M Zend/zend_vm_def.h
M Zend/zend_vm_execute.h
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index af3218a..a2f7ace 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -7362,14 +7362,14 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY) { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; zend_free_op free_op1; SAVE_OPLINE(); val = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (OP1_TYPE != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -7391,10 +7391,9 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY) if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -7410,10 +7409,8 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY) if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -7429,8 +7426,7 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY) ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9ef7f3a..457de3d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4020,14 +4020,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER( { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; SAVE_OPLINE(); val = EX_CONSTANT(opline->op1); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (IS_CONST != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -4047,10 +4047,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER( if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -4065,10 +4064,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER( if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -4084,8 +4081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER( ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); } @@ -11657,14 +11653,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; zend_free_op free_op1; SAVE_OPLINE(); val = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (IS_TMP_VAR != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -11684,10 +11680,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -11703,10 +11698,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -11722,8 +11715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); } @@ -15358,14 +15350,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; zend_free_op free_op1; SAVE_OPLINE(); val = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (IS_VAR != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -15387,10 +15379,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -15406,10 +15397,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -15425,8 +15414,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); } @@ -28954,14 +28942,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; SAVE_OPLINE(); val = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op1.var); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (IS_CV != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -28981,10 +28969,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -28999,10 +28986,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -29018,8 +29003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); }
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index af3218a..a2f7ace 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -7362,14 +7362,14 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY) { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; zend_free_op free_op1; SAVE_OPLINE(); val = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (OP1_TYPE != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -7391,10 +7391,9 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY) if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -7410,10 +7409,8 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY) if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -7429,8 +7426,7 @@ ZEND_VM_HANDLER(142, ZEND_YIELD_FROM, CONST|TMP|VAR|CV, ANY) ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9ef7f3a..457de3d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4020,14 +4020,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER( { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; SAVE_OPLINE(); val = EX_CONSTANT(opline->op1); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (IS_CONST != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -4047,10 +4047,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER( if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -4065,10 +4064,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER( if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -4084,8 +4081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CONST_HANDLER( ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); } @@ -11657,14 +11653,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; zend_free_op free_op1; SAVE_OPLINE(); val = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (IS_TMP_VAR != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -11684,10 +11680,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -11703,10 +11698,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -11722,8 +11715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_TMP_HANDLER(ZE ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); } @@ -15358,14 +15350,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; zend_free_op free_op1; SAVE_OPLINE(); val = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (IS_VAR != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -15387,10 +15379,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -15406,10 +15397,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -15425,8 +15414,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_VAR_HANDLER(ZE ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); } @@ -28954,14 +28942,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN { USE_OPLINE - /* The generator object is stored in EX(return_value) */ - zend_generator *generator = (zend_generator *) EX(return_value); + zend_generator *generator = zend_get_running_generator(execute_data); zval *val; SAVE_OPLINE(); val = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op1.var); + if (Z_TYPE_P(val) == IS_ARRAY) { ZVAL_COPY_VALUE(&generator->values, val); if (IS_CV != IS_TMP_VAR && Z_OPT_REFCOUNTED_P(val)) { @@ -28981,10 +28969,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN if (Z_ISUNDEF(new_gen->retval)) { zend_generator_yield_from(generator, new_gen); } else if (new_gen->execute_data == NULL) { - // TODO: Should be an engine exception - zend_error(E_RECOVERABLE_ERROR, "Generator passed to yield from was aborted without proper return and is unable to continue"); + zend_error(E_ERROR | E_EXCEPTION, "Generator passed to yield from was aborted without proper return and is unable to continue"); - CHECK_EXCEPTION(); + HANDLE_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } else { if (RETURN_VALUE_USED(opline)) { @@ -28999,10 +28986,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { if (!EG(exception)) { - zend_throw_exception_ex(NULL, 0, - "Object of type %s did not create an Iterator", ce->name->val); + zend_error(E_ERROR | E_EXCEPTION, "Object of type %s did not create an Iterator", ce->name->val); } - zend_throw_exception_internal(NULL); HANDLE_EXCEPTION(); } @@ -29018,8 +29003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_FROM_SPEC_CV_HANDLER(ZEN ZVAL_OBJ(&generator->values, &iter->std); } } else { - // TODO: Should be an engine exception - zend_throw_exception(NULL, "Can use \"yield from\" only with arrays and Traversables", 0); + zend_error(E_ERROR | E_EXCEPTION, "Can use \"yield from\" only with arrays and Traversables", 0); HANDLE_EXCEPTION(); }