@@ -26,6 +26,11 @@ static ir_ref jit_FFI_CDATA_TYPE(zend_jit_ctx *jit, ir_ref obj_ref)
26
26
return ir_LOAD_A (ir_ADD_OFFSET (obj_ref , offsetof(zend_ffi_cdata , type )));
27
27
}
28
28
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
+
29
34
static int zend_jit_ffi_symbols_guard (zend_jit_ctx * jit ,
30
35
const zend_op * opline ,
31
36
zend_ssa * ssa ,
@@ -119,6 +124,7 @@ static int zend_jit_ffi_send_val(zend_jit_ctx *jit,
119
124
uint32_t op1_info ,
120
125
zend_jit_addr op1_addr ,
121
126
zend_jit_addr op1_def_addr ,
127
+ zend_class_entry * op1_ce ,
122
128
zend_ffi_type * op1_ffi_type )
123
129
{
124
130
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,
130
136
131
137
if (TRACE_FRAME_FFI_FUNC (call )) {
132
138
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
135
139
|| TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_TYPEOF
136
140
|| TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_IS_NULL ) {
137
141
ZEND_ASSERT (opline -> op2 .num == 1 );
@@ -151,6 +155,23 @@ static int zend_jit_ffi_send_val(zend_jit_ctx *jit,
151
155
ref = jit_Z_PTR (jit , op1_addr );
152
156
SET_STACK_TYPE (stack , 0 , IS_OBJECT , 0 );
153
157
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 );
154
175
} else if (TRACE_FRAME_FFI_FUNC (call ) == TRACE_FRAME_FFI_FUNC_STRING ) {
155
176
if (opline -> op2 .num == 1 ) {
156
177
ZEND_ASSERT (op1_ffi_type );
@@ -564,7 +585,11 @@ static int zend_jit_ffi_do_call(zend_jit_ctx *jit,
564
585
// TODO: try to remove this dereference ???
565
586
ref = zend_jit_gc_deref (jit , ref );
566
587
}
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
+ }
568
593
// TODO: type flags ???
569
594
ref = ir_LOAD_U32 (ir_ADD_OFFSET (ref , offsetof(zend_ffi_type , align )));
570
595
if (sizeof (void * ) == 8 ) {
@@ -578,7 +603,11 @@ static int zend_jit_ffi_do_call(zend_jit_ctx *jit,
578
603
// TODO: try to remove this dereference ???
579
604
ref = zend_jit_gc_deref (jit , ref );
580
605
}
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
+ }
582
611
// TODO: type flags ???
583
612
ref = ir_LOAD_U32 (ir_ADD_OFFSET (ref , offsetof(zend_ffi_type , size )));
584
613
if (sizeof (void * ) == 8 ) {
0 commit comments