Skip to content

Commit ffba8ab

Browse files
committed
Adapt generator interceptor to tail call VM
Signed-off-by: Bob Weinand <[email protected]>
1 parent efb2d1e commit ffba8ab

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

zend_abstract_interface/interceptor/php8/interceptor.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
781790
static zend_object *(*generator_create_prev)(zend_class_entry *class_type);
782791
static 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

Comments
 (0)