@@ -26,6 +26,11 @@ static ir_ref jit_FFI_CDATA_TYPE(zend_jit_ctx *jit, ir_ref obj_ref)
2626 return ir_LOAD_A (ir_ADD_OFFSET (obj_ref , offsetof(zend_ffi_cdata , type )));
2727}
2828
29+ static ir_ref jit_FFI_CTYPE_TYPE (zend_jit_ctx * jit , ir_ref obj_ref )
30+ {
31+ return ir_LOAD_A (ir_ADD_OFFSET (obj_ref , offsetof(zend_ffi_ctype , type )));
32+ }
33+
2934static int zend_jit_ffi_symbols_guard (zend_jit_ctx * jit ,
3035 const zend_op * opline ,
3136 zend_ssa * ssa ,
@@ -119,6 +124,7 @@ static int zend_jit_ffi_send_val(zend_jit_ctx *jit,
119124 uint32_t op1_info ,
120125 zend_jit_addr op1_addr ,
121126 zend_jit_addr op1_def_addr ,
127+ zend_class_entry * op1_ce ,
122128 zend_ffi_type * op1_ffi_type )
123129{
124130 zend_jit_trace_stack_frame * call = JIT_G (current_frame )-> call ;
@@ -130,8 +136,6 @@ static int zend_jit_ffi_send_val(zend_jit_ctx *jit,
130136
131137 if (TRACE_FRAME_FFI_FUNC (call )) {
132138 if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_ADDR
133- || TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_ALIGNOF
134- || TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_SIZEOF
135139 || TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_TYPEOF
136140 || TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_IS_NULL ) {
137141 ZEND_ASSERT (opline -> op2 .num == 1 );
@@ -151,6 +155,23 @@ static int zend_jit_ffi_send_val(zend_jit_ctx *jit,
151155 ref = jit_Z_PTR (jit , op1_addr );
152156 SET_STACK_TYPE (stack , 0 , IS_OBJECT , 0 );
153157 SET_STACK_REF_EX (stack , 0 , ref , arg_flags );
158+ } else if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_ALIGNOF
159+ || TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_SIZEOF ) {
160+ ZEND_ASSERT (opline -> op2 .num == 1 );
161+
162+ if (opline -> op1_type & (IS_VAR |IS_TMP_VAR )) {
163+ arg_flags |= ZREG_FFI_ZVAL_DTOR ;
164+ }
165+ if (op1_info & MAY_BE_REF ) {
166+ arg_flags |= ZREG_FFI_ZVAL_DEREF ;
167+ }
168+ ZEND_ASSERT (op1_ffi_type || op1_ce == zend_ffi_api -> ctype_ce );
169+ if (!op1_ffi_type && op1_ce == zend_ffi_api -> ctype_ce ) {
170+ arg_flags |= ZREG_FFI_CTYPE ;
171+ }
172+ ref = jit_Z_PTR (jit , op1_addr );
173+ SET_STACK_TYPE (stack , 0 , IS_OBJECT , 0 );
174+ SET_STACK_REF_EX (stack , 0 , ref , arg_flags );
154175 } else if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_STRING ) {
155176 if (opline -> op2 .num == 1 ) {
156177 ZEND_ASSERT (op1_ffi_type );
@@ -564,7 +585,11 @@ static int zend_jit_ffi_do_call(zend_jit_ctx *jit,
564585 // TODO: try to remove this dereference ???
565586 ref = zend_jit_gc_deref (jit , ref );
566587 }
567- ref = jit_FFI_CDATA_TYPE (jit , ref );
588+ if (STACK_FLAGS (stack , 0 ) & ZREG_FFI_CTYPE ) {
589+ ref = jit_FFI_CTYPE_TYPE (jit , ref );
590+ } else {
591+ ref = jit_FFI_CDATA_TYPE (jit , ref );
592+ }
568593 // TODO: type flags ???
569594 ref = ir_LOAD_U32 (ir_ADD_OFFSET (ref , offsetof(zend_ffi_type , align )));
570595 if (sizeof (void * ) == 8 ) {
@@ -578,7 +603,11 @@ static int zend_jit_ffi_do_call(zend_jit_ctx *jit,
578603 // TODO: try to remove this dereference ???
579604 ref = zend_jit_gc_deref (jit , ref );
580605 }
581- ref = jit_FFI_CDATA_TYPE (jit , ref );
606+ if (STACK_FLAGS (stack , 0 ) & ZREG_FFI_CTYPE ) {
607+ ref = jit_FFI_CTYPE_TYPE (jit , ref );
608+ } else {
609+ ref = jit_FFI_CDATA_TYPE (jit , ref );
610+ }
582611 // TODO: type flags ???
583612 ref = ir_LOAD_U32 (ir_ADD_OFFSET (ref , offsetof(zend_ffi_type , size )));
584613 if (sizeof (void * ) == 8 ) {
0 commit comments