@@ -9274,19 +9274,11 @@ static int zend_jit_init_fcall_guard(dasm_State **Dst, uint32_t level, const zen
92749274	int32_t exit_point;
92759275	const void *exit_addr;
92769276
9277- 	if (func->type == ZEND_INTERNAL_FUNCTION) {
9278- #ifdef ZEND_WIN32
9279- 		// TODO: ASLR may cause different addresses in different workers ???
9280- 		return 0;
9281- #endif
9282- 	} else if (func->type == ZEND_USER_FUNCTION) {
9277+ 	if (func->type == ZEND_USER_FUNCTION) {
92839278		if (!zend_accel_in_shm(func->op_array.opcodes)) {
92849279			/* op_array and op_array->opcodes are not persistent. We can't link. */
92859280			return 0;
92869281		}
9287- 	} else {
9288- 		ZEND_UNREACHABLE();
9289- 		return 0;
92909282	}
92919283
92929284	exit_point = zend_jit_trace_get_exit_point(to_opline, ZEND_JIT_EXIT_POLYMORPHISM);
@@ -9320,6 +9312,22 @@ static int zend_jit_init_fcall_guard(dasm_State **Dst, uint32_t level, const zen
93209312		|		cmp aword [r1 + offsetof(zend_op_array, opcodes)], opcodes
93219313		|	.endif
93229314		|	jne &exit_addr
9315+ #ifdef _WIN32
9316+ 	} else if (func->type == ZEND_INTERNAL_FUNCTION) {
9317+ 		const zif_handler handler = func->internal_function.handler;
9318+ 
9319+ 		|   .if X64
9320+ 		||		if (!IS_SIGNED_32BIT(handler)) {
9321+ 		|			mov64 r2, ((ptrdiff_t)handler)
9322+ 		|			cmp aword [r1 + offsetof(zend_internal_function, handler)], r2
9323+ 		||		} else {
9324+ 		|			cmp aword [r1 + offsetof(zend_internal_function, handler)], handler
9325+ 		||		}
9326+ 		|	.else
9327+ 		|		cmp aword [r1 + offsetof(zend_internal_function, handler)], handler
9328+ 		|	.endif
9329+ 		|	jne &exit_addr
9330+ #endif
93239331	} else {
93249332		|   .if X64
93259333		||		if (!IS_SIGNED_32BIT(func)) {
@@ -9466,6 +9474,22 @@ static int zend_jit_init_fcall(dasm_State **Dst, const zend_op *opline, uint32_t
94669474					|		cmp aword [r0 + offsetof(zend_op_array, opcodes)], opcodes
94679475					|	.endif
94689476					|	jz >3
9477+ #ifdef _WIN32
9478+ 				} else if (func->type == ZEND_INTERNAL_FUNCTION) {
9479+ 					const zif_handler handler = func->internal_function.handler;
9480+ 
9481+ 					|   .if X64
9482+ 					||		if (!IS_SIGNED_32BIT(handler)) {
9483+ 					|			mov64 r1, ((ptrdiff_t)handler)
9484+ 					|			cmp aword [r0 + offsetof(zend_internal_function, handler)], r1
9485+ 					||		} else {
9486+ 					|			cmp aword [r0 + offsetof(zend_internal_function, handler)], handler
9487+ 					||		}
9488+ 					|	.else
9489+ 					|		cmp aword [r0 + offsetof(zend_internal_function, handler)], handler
9490+ 					|	.endif
9491+ 					|	jz >3
9492+ #endif
94699493				} else {
94709494					|   .if X64
94719495					||		if (!IS_SIGNED_32BIT(func)) {
@@ -9652,11 +9676,7 @@ static int zend_jit_init_method_call(dasm_State          **Dst,
96529676	if ((!func || zend_jit_may_be_modified(func, op_array))
96539677	 && trace
96549678	 && trace->op == ZEND_JIT_TRACE_INIT_CALL
9655- 	 && trace->func
9656- #ifdef _WIN32
9657- 	 && trace->func->type != ZEND_INTERNAL_FUNCTION
9658- #endif
9659- 	) {
9679+ 	 && trace->func) {
96609680		int32_t exit_point;
96619681		const void *exit_addr;
96629682
@@ -9685,6 +9705,22 @@ static int zend_jit_init_method_call(dasm_State          **Dst,
96859705			|		cmp aword [r0 + offsetof(zend_op_array, opcodes)], opcodes
96869706			|	.endif
96879707			|	jne &exit_addr
9708+ #ifdef _WIN32
9709+ 		} else if (func->type == ZEND_INTERNAL_FUNCTION) {
9710+ 			const zif_handler handler = func->internal_function.handler;
9711+ 
9712+ 			|   .if X64
9713+ 			||		if (!IS_SIGNED_32BIT(handler)) {
9714+ 			|			mov64 r1, ((ptrdiff_t)handler)
9715+ 			|			cmp aword [r0 + offsetof(zend_internal_function, handler)], r1
9716+ 			||		} else {
9717+ 			|			cmp aword [r0 + offsetof(zend_internal_function, handler)], handler
9718+ 			||		}
9719+ 			|	.else
9720+ 			|		cmp aword [r0 + offsetof(zend_internal_function, handler)], handler
9721+ 			|	.endif
9722+ 			|	jne &exit_addr
9723+ #endif
96889724		} else {
96899725			|   .if X64
96909726			||		if (!IS_SIGNED_32BIT(func)) {
0 commit comments