@@ -778,6 +778,15 @@ static int ZEND_FASTCALL zai_interceptor_handle_created_generator_call(void) {
778778 return 0 /* ZEND_VM_CONTINUE */ ;
779779}
780780
781+ #if PHP_VERSION_ID >= 80500
782+ static const zend_op * ZEND_FASTCALL zai_interceptor_handle_created_generator_tailcall (struct _zend_execute_data * execute_data , const struct _zend_op * opline ) {
783+ (void )execute_data ;
784+ (void )opline ;
785+ zai_interceptor_handle_created_generator_func ();
786+ return & zai_interceptor_generator_post_op [2 ] /* ZEND_VM_CONTINUE */ ;
787+ }
788+ #endif
789+
781790static zend_object * (* generator_create_prev )(zend_class_entry * class_type );
782791static zend_object * zai_interceptor_generator_create (zend_class_entry * class_type ) {
783792 zend_generator * generator = (zend_generator * )generator_create_prev (class_type );
@@ -1012,12 +1021,20 @@ void zai_interceptor_startup(void) {
10121021
10131022 zai_interceptor_generator_post_op [0 ] = zai_interceptor_generator_post_op_template ;
10141023 zai_interceptor_generator_post_op [1 ] = zai_interceptor_generator_post_op_template ;
1015- #ifdef __GNUC__
10161024 int kind = zend_vm_kind ();
1017- zai_interceptor_generator_post_op [1 ].handler = kind == ZEND_VM_KIND_HYBRID || kind == ZEND_VM_KIND_GOTO ? zai_interceptor_handle_created_generator_goto () : (void * )zai_interceptor_handle_created_generator_call ;
1018- #else
1019- zai_interceptor_generator_post_op [1 ].handler = (void * )zai_interceptor_handle_created_generator_call ;
1025+ #ifdef __GNUC__
1026+ if (kind == ZEND_VM_KIND_HYBRID || kind == ZEND_VM_KIND_GOTO ) {
1027+ zai_interceptor_generator_post_op [1 ].handler = zai_interceptor_handle_created_generator_goto ();
1028+ } else
10201029#endif
1030+ #if PHP_VERSION_ID >= 80500
1031+ if (kind == ZEND_VM_KIND_CALL ) {
1032+ zai_interceptor_generator_post_op [1 ].handler = zai_interceptor_handle_created_generator_tailcall ;
1033+ } else
1034+ #endif
1035+ {
1036+ zai_interceptor_generator_post_op [1 ].handler = (void * )zai_interceptor_handle_created_generator_call ;
1037+ }
10211038 // Note: return handler without SPEC(OBSERVER) (will be the case as before post_startup zend_observer_fcall_op_array_extension won't be set yet)
10221039 zai_interceptor_generator_post_op [2 ] = zai_interceptor_generator_post_op_template ;
10231040 zend_vm_set_opcode_handler (& zai_interceptor_generator_post_op [2 ]);
0 commit comments