@@ -21,6 +21,11 @@ static ir_ref jit_FFI_CDATA_PTR(zend_jit_ctx *jit, ir_ref obj_ref)
2121 return ir_LOAD_A (ir_ADD_OFFSET (obj_ref , offsetof(zend_ffi_cdata , ptr )));
2222}
2323
24+ static ir_ref jit_FFI_CDATA_TYPE (zend_jit_ctx * jit , ir_ref obj_ref )
25+ {
26+ return ir_LOAD_A (ir_ADD_OFFSET (obj_ref , offsetof(zend_ffi_cdata , type )));
27+ }
28+
2429static int zend_jit_ffi_symbols_guard (zend_jit_ctx * jit ,
2530 const zend_op * opline ,
2631 zend_ssa * ssa ,
@@ -116,10 +121,19 @@ static int zend_jit_ffi_send_val(zend_jit_ctx *jit,
116121 uint8_t arg_flags = 0 ;
117122
118123 if (TRACE_FRAME_FFI_FUNC (call )) {
119- if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_ADDR ) {
124+ if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_ADDR
125+ || TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_ALIGNOF
126+ || TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_SIZEOF
127+ || TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_TYPEOF
128+ || TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_IS_NULL ) {
120129 ZEND_ASSERT (opline -> op2 .num == 1 );
121130 ZEND_ASSERT (op1_ffi_type );
122131
132+ if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_IS_NULL ) {
133+ ZEND_ASSERT (op1_ffi_type -> kind == ZEND_FFI_TYPE_POINTER );
134+ arg_flags |= ZREG_FFI_PTR_LOAD ;
135+ }
136+
123137 if (opline -> op1_type & (IS_VAR |IS_TMP_VAR )) {
124138 arg_flags |= ZREG_FFI_ZVAL_DTOR ;
125139 }
@@ -401,6 +415,57 @@ static int zend_jit_ffi_do_call(zend_jit_ctx *jit,
401415 }
402416 jit_set_Z_PTR (jit , res_addr , ref );
403417 jit_set_Z_TYPE_INFO (jit , res_addr , IS_OBJECT_EX );
418+ } else if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_ALIGNOF ) {
419+ ref = STACK_REF (stack , 0 );
420+ if (STACK_FLAGS (stack , 0 ) & ZREG_FFI_ZVAL_DEREF ) {
421+ // TODO: try to remove this dereference ???
422+ ref = zend_jit_gc_deref (jit , ref );
423+ }
424+ ref = jit_FFI_CDATA_TYPE (jit , ref );
425+ // TODO: type flags ???
426+ ref = ir_LOAD_U32 (ir_ADD_OFFSET (ref , offsetof(zend_ffi_type , align )));
427+ if (sizeof (void * ) == 8 ) {
428+ ref = ir_ZEXT_L (ref );
429+ }
430+ jit_set_Z_LVAL (jit , res_addr , ref );
431+ jit_set_Z_TYPE_INFO (jit , res_addr , IS_LONG );
432+ } else if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_SIZEOF ) {
433+ ref = STACK_REF (stack , 0 );
434+ if (STACK_FLAGS (stack , 0 ) & ZREG_FFI_ZVAL_DEREF ) {
435+ // TODO: try to remove this dereference ???
436+ ref = zend_jit_gc_deref (jit , ref );
437+ }
438+ ref = jit_FFI_CDATA_TYPE (jit , ref );
439+ // TODO: type flags ???
440+ ref = ir_LOAD_U32 (ir_ADD_OFFSET (ref , offsetof(zend_ffi_type , size )));
441+ if (sizeof (void * ) == 8 ) {
442+ ref = ir_ZEXT_L (ref );
443+ }
444+ jit_set_Z_LVAL (jit , res_addr , ref );
445+ jit_set_Z_TYPE_INFO (jit , res_addr , IS_LONG );
446+ } else if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_TYPEOF ) {
447+ ref = STACK_REF (stack , 0 );
448+ if (STACK_FLAGS (stack , 0 ) & ZREG_FFI_ZVAL_DEREF ) {
449+ // TODO: try to remove this dereference ???
450+ ref = zend_jit_gc_deref (jit , ref );
451+ }
452+ ref = jit_FFI_CDATA_TYPE (jit , ref );
453+ // TODO: type flags ???
454+ ref = ir_CALL_1 (IR_ADDR , ir_CONST_FUNC (zend_ffi_api -> ctype_create ), ref );
455+ jit_set_Z_PTR (jit , res_addr , ref );
456+ jit_set_Z_TYPE_INFO (jit , res_addr , IS_OBJECT_EX );
457+ } else if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_IS_NULL ) {
458+ ref = STACK_REF (stack , 0 );
459+ if (STACK_FLAGS (stack , 0 ) & ZREG_FFI_ZVAL_DEREF ) {
460+ // TODO: try to remove this dereference ???
461+ ref = zend_jit_gc_deref (jit , ref );
462+ }
463+ ref = jit_FFI_CDATA_TYPE (jit , ref );
464+ if (STACK_FLAGS (stack , 0 ) & ZREG_FFI_PTR_LOAD ) {
465+ ref = ir_LOAD_A (ref );
466+ }
467+ ref = ir_ADD_U32 (ir_ZEXT_U32 (ir_EQ (ref , IR_NULL )), ir_CONST_U32 (IS_FALSE ));
468+ jit_set_Z_TYPE_INFO_ex (jit , res_addr , ref );
404469 } else if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_STRING ) {
405470 ZEND_ASSERT (num_args > 0 && STACK_TYPE (stack , 0 ) == IS_OBJECT );
406471 ref = STACK_REF (stack , 0 );
0 commit comments