@@ -21,6 +21,11 @@ static ir_ref jit_FFI_CDATA_PTR(zend_jit_ctx *jit, ir_ref obj_ref)
21
21
return ir_LOAD_A (ir_ADD_OFFSET (obj_ref , offsetof(zend_ffi_cdata , ptr )));
22
22
}
23
23
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
+
24
29
static int zend_jit_ffi_symbols_guard (zend_jit_ctx * jit ,
25
30
const zend_op * opline ,
26
31
zend_ssa * ssa ,
@@ -116,10 +121,19 @@ static int zend_jit_ffi_send_val(zend_jit_ctx *jit,
116
121
uint8_t arg_flags = 0 ;
117
122
118
123
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 ) {
120
129
ZEND_ASSERT (opline -> op2 .num == 1 );
121
130
ZEND_ASSERT (op1_ffi_type );
122
131
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
+
123
137
if (opline -> op1_type & (IS_VAR |IS_TMP_VAR )) {
124
138
arg_flags |= ZREG_FFI_ZVAL_DTOR ;
125
139
}
@@ -401,6 +415,57 @@ static int zend_jit_ffi_do_call(zend_jit_ctx *jit,
401
415
}
402
416
jit_set_Z_PTR (jit , res_addr , ref );
403
417
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 );
404
469
} else if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_STRING ) {
405
470
ZEND_ASSERT (num_args > 0 && STACK_TYPE (stack , 0 ) == IS_OBJECT );
406
471
ref = STACK_REF (stack , 0 );
0 commit comments