@@ -4299,6 +4299,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4299
4299
#ifdef HAVE_FFI
4300
4300
zend_jit_ffi_info * ffi_info = NULL ;
4301
4301
zend_ffi_type * frame_ffi_func_type = NULL ;
4302
+ uint32_t frame_ffi_info = 0 ;
4303
+ ir_ref frame_ffi_obj_ref = IR_UNUSED ;
4302
4304
ir_ref frame_ffi_func_ref = IR_UNUSED ;
4303
4305
#endif
4304
4306
@@ -4647,6 +4649,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
4647
4649
frame_flags = 0 ;
4648
4650
#ifdef HAVE_FFI
4649
4651
frame_ffi_func_type = NULL ;
4652
+ frame_ffi_info = 0 ;
4653
+ frame_ffi_obj_ref = IR_UNUSED ;
4650
4654
frame_ffi_func_ref = IR_UNUSED ;
4651
4655
#endif
4652
4656
@@ -7011,12 +7015,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
7011
7015
goto jit_failure ;
7012
7016
}
7013
7017
// TODO: Guard for FFI::CType argument ???
7014
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_NEW ;
7018
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7019
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_NEW ;
7015
7020
frame_ffi_func_type = type ;
7021
+ frame_ffi_func_ref = IR_UNUSED ;
7022
+ frame_ffi_obj_ref = jit_Z_PTR (jit , op1_addr );
7016
7023
if (opline -> op1_type & (IS_VAR |IS_TMP_VAR )) {
7017
- frame_ffi_func_ref = jit_Z_PTR (jit , op1_addr );
7018
- } else {
7019
- frame_ffi_func_ref = IR_UNUSED ;
7024
+ frame_ffi_info |= TRACE_FRAME_MASK_FFI_OBJ_DTOR ;
7020
7025
}
7021
7026
goto done ;
7022
7027
}
@@ -7031,12 +7036,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
7031
7036
goto jit_failure ;
7032
7037
}
7033
7038
// TODO: Guard for FFI::CType argument ???
7034
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_CAST ;
7039
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7040
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_CAST ;
7035
7041
frame_ffi_func_type = type ;
7042
+ frame_ffi_func_ref = IR_UNUSED ;
7043
+ frame_ffi_obj_ref = jit_Z_PTR (jit , op1_addr );
7036
7044
if (opline -> op1_type & (IS_VAR |IS_TMP_VAR )) {
7037
- frame_ffi_func_ref = jit_Z_PTR (jit , op1_addr );
7038
- } else {
7039
- frame_ffi_func_ref = IR_UNUSED ;
7045
+ frame_ffi_info |= TRACE_FRAME_MASK_FFI_OBJ_DTOR ;
7040
7046
}
7041
7047
goto done ;
7042
7048
}
@@ -7062,12 +7068,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
7062
7068
ssa_op -> op1_use , -1 , op1_info , op1_addr , op1_ffi_symbols , ffi_info )) {
7063
7069
goto jit_failure ;
7064
7070
}
7065
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_TYPE ;
7071
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7072
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_TYPE ;
7066
7073
frame_ffi_func_type = dcl -> type ;
7074
+ frame_ffi_func_ref = IR_UNUSED ;
7075
+ frame_ffi_obj_ref = jit_Z_PTR (jit , op1_addr );
7067
7076
if (opline -> op1_type & (IS_VAR |IS_TMP_VAR )) {
7068
- frame_ffi_func_ref = jit_Z_PTR (jit , op1_addr );
7069
- } else {
7070
- frame_ffi_func_ref = IR_UNUSED ;
7077
+ frame_ffi_info |= TRACE_FRAME_MASK_FFI_OBJ_DTOR ;
7071
7078
}
7072
7079
goto done ;
7073
7080
}
@@ -7093,6 +7100,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
7093
7100
frame_flags = TRACE_FRAME_MASK_FFI ;
7094
7101
frame_ffi_func_type = ZEND_FFI_TYPE (sym -> type );
7095
7102
frame_ffi_func_ref = ffi_func_ref ;
7103
+ frame_ffi_obj_ref = jit_Z_PTR (jit , op1_addr );
7104
+ if (opline -> op1_type & (IS_VAR |IS_TMP_VAR )) {
7105
+ frame_ffi_info |= TRACE_FRAME_MASK_FFI_OBJ_DTOR ;
7106
+ }
7096
7107
goto done ;
7097
7108
}
7098
7109
}
@@ -7130,70 +7141,80 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
7130
7141
if (Z_TYPE_P (zv ) == IS_STRING
7131
7142
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "addr" )
7132
7143
&& opline -> extended_value == 1 ) {
7133
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_ADDR ;
7144
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7145
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_ADDR ;
7134
7146
frame_ffi_func_type = NULL ;
7135
7147
frame_ffi_func_ref = IR_UNUSED ;
7136
7148
goto done ;
7137
7149
} else if (Z_TYPE_P (zv ) == IS_STRING
7138
7150
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "string" )
7139
7151
&& (opline -> extended_value == 1 || opline -> extended_value == 2 )) {
7140
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_STRING ;
7152
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7153
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_STRING ;
7141
7154
frame_ffi_func_type = NULL ;
7142
7155
frame_ffi_func_ref = IR_UNUSED ;
7143
7156
goto done ;
7144
7157
} else if (Z_TYPE_P (zv ) == IS_STRING
7145
7158
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "alignof" )
7146
7159
&& opline -> extended_value == 1 ) {
7147
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_ALIGNOF ;
7160
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7161
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_ALIGNOF ;
7148
7162
frame_ffi_func_type = NULL ;
7149
7163
frame_ffi_func_ref = IR_UNUSED ;
7150
7164
goto done ;
7151
7165
} else if (Z_TYPE_P (zv ) == IS_STRING
7152
7166
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "sizeof" )
7153
7167
&& opline -> extended_value == 1 ) {
7154
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_SIZEOF ;
7168
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7169
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_SIZEOF ;
7155
7170
frame_ffi_func_type = NULL ;
7156
7171
frame_ffi_func_ref = IR_UNUSED ;
7157
7172
goto done ;
7158
7173
} else if (Z_TYPE_P (zv ) == IS_STRING
7159
7174
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "typeof" )
7160
7175
&& opline -> extended_value == 1 ) {
7161
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_TYPEOF ;
7176
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7177
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_TYPEOF ;
7162
7178
frame_ffi_func_type = NULL ;
7163
7179
frame_ffi_func_ref = IR_UNUSED ;
7164
7180
goto done ;
7165
7181
} else if (Z_TYPE_P (zv ) == IS_STRING
7166
7182
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "isnull" )
7167
7183
&& opline -> extended_value == 1 ) {
7168
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_IS_NULL ;
7184
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7185
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_IS_NULL ;
7169
7186
frame_ffi_func_type = NULL ;
7170
7187
frame_ffi_func_ref = IR_UNUSED ;
7171
7188
goto done ;
7172
7189
} else if (Z_TYPE_P (zv ) == IS_STRING
7173
7190
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "memcpy" )
7174
7191
&& opline -> extended_value == 3 ) {
7175
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_MEMCPY ;
7192
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7193
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_MEMCPY ;
7176
7194
frame_ffi_func_type = NULL ;
7177
7195
frame_ffi_func_ref = IR_UNUSED ;
7178
7196
goto done ;
7179
7197
} else if (Z_TYPE_P (zv ) == IS_STRING
7180
7198
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "memcmp" )
7181
7199
&& opline -> extended_value == 3 ) {
7182
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_MEMCMP ;
7200
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7201
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_MEMCMP ;
7183
7202
frame_ffi_func_type = NULL ;
7184
7203
frame_ffi_func_ref = IR_UNUSED ;
7185
7204
goto done ;
7186
7205
} else if (Z_TYPE_P (zv ) == IS_STRING
7187
7206
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "memset" )
7188
7207
&& opline -> extended_value == 3 ) {
7189
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_MEMSET ;
7208
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7209
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_MEMSET ;
7190
7210
frame_ffi_func_type = NULL ;
7191
7211
frame_ffi_func_ref = IR_UNUSED ;
7192
7212
goto done ;
7193
7213
} else if (Z_TYPE_P (zv ) == IS_STRING
7194
7214
&& zend_string_equals_literal_ci (Z_STR_P (zv ), "free" )
7195
7215
&& opline -> extended_value == 1 ) {
7196
- frame_flags = TRACE_FRAME_MASK_FFI | TRACE_FRAME_FFI_FUNC_FREE ;
7216
+ frame_flags = TRACE_FRAME_MASK_FFI ;
7217
+ frame_ffi_info = TRACE_FRAME_FFI_FUNC_FREE ;
7197
7218
frame_ffi_func_type = NULL ;
7198
7219
frame_ffi_func_ref = IR_UNUSED ;
7199
7220
goto done ;
@@ -7854,7 +7875,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
7854
7875
#ifdef HAVE_FFI
7855
7876
if (TRACE_FRAME_FFI (call )) {
7856
7877
call -> call_opline = (const zend_op * )(void * )frame_ffi_func_type ;
7857
- call -> ce = (zend_class_entry * )(intptr_t )frame_ffi_func_ref ;
7878
+ call -> ffi_info = frame_ffi_info ;
7879
+ call -> ffi_obj_ref = frame_ffi_obj_ref ;
7880
+ call -> ffi_func_ref = frame_ffi_func_ref ;
7858
7881
}
7859
7882
#endif
7860
7883
call -> prev = frame -> call ;
0 commit comments