@@ -4299,6 +4299,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
42994299#ifdef HAVE_FFI
43004300 zend_jit_ffi_info * ffi_info = NULL ;
43014301 zend_ffi_type * frame_ffi_func_type = NULL ;
4302+ uint32_t frame_ffi_info = 0 ;
4303+ ir_ref frame_ffi_obj_ref = IR_UNUSED ;
43024304 ir_ref frame_ffi_func_ref = IR_UNUSED ;
43034305#endif
43044306
@@ -4647,6 +4649,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
46474649 frame_flags = 0 ;
46484650#ifdef HAVE_FFI
46494651 frame_ffi_func_type = NULL ;
4652+ frame_ffi_info = 0 ;
4653+ frame_ffi_obj_ref = IR_UNUSED ;
46504654 frame_ffi_func_ref = IR_UNUSED ;
46514655#endif
46524656
@@ -7011,12 +7015,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
70117015 goto jit_failure ;
70127016 }
70137017 // 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 ;
70157020 frame_ffi_func_type = type ;
7021+ frame_ffi_func_ref = IR_UNUSED ;
7022+ frame_ffi_obj_ref = jit_Z_PTR (jit , op1_addr );
70167023 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 ;
70207025 }
70217026 goto done ;
70227027 }
@@ -7031,12 +7036,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
70317036 goto jit_failure ;
70327037 }
70337038 // 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 ;
70357041 frame_ffi_func_type = type ;
7042+ frame_ffi_func_ref = IR_UNUSED ;
7043+ frame_ffi_obj_ref = jit_Z_PTR (jit , op1_addr );
70367044 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 ;
70407046 }
70417047 goto done ;
70427048 }
@@ -7062,12 +7068,13 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
70627068 ssa_op -> op1_use , -1 , op1_info , op1_addr , op1_ffi_symbols , ffi_info )) {
70637069 goto jit_failure ;
70647070 }
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 ;
70667073 frame_ffi_func_type = dcl -> type ;
7074+ frame_ffi_func_ref = IR_UNUSED ;
7075+ frame_ffi_obj_ref = jit_Z_PTR (jit , op1_addr );
70677076 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 ;
70717078 }
70727079 goto done ;
70737080 }
@@ -7093,6 +7100,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
70937100 frame_flags = TRACE_FRAME_MASK_FFI ;
70947101 frame_ffi_func_type = ZEND_FFI_TYPE (sym -> type );
70957102 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+ }
70967107 goto done ;
70977108 }
70987109 }
@@ -7130,70 +7141,80 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
71307141 if (Z_TYPE_P (zv ) == IS_STRING
71317142 && zend_string_equals_literal_ci (Z_STR_P (zv ), "addr" )
71327143 && 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 ;
71347146 frame_ffi_func_type = NULL ;
71357147 frame_ffi_func_ref = IR_UNUSED ;
71367148 goto done ;
71377149 } else if (Z_TYPE_P (zv ) == IS_STRING
71387150 && zend_string_equals_literal_ci (Z_STR_P (zv ), "string" )
71397151 && (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 ;
71417154 frame_ffi_func_type = NULL ;
71427155 frame_ffi_func_ref = IR_UNUSED ;
71437156 goto done ;
71447157 } else if (Z_TYPE_P (zv ) == IS_STRING
71457158 && zend_string_equals_literal_ci (Z_STR_P (zv ), "alignof" )
71467159 && 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 ;
71487162 frame_ffi_func_type = NULL ;
71497163 frame_ffi_func_ref = IR_UNUSED ;
71507164 goto done ;
71517165 } else if (Z_TYPE_P (zv ) == IS_STRING
71527166 && zend_string_equals_literal_ci (Z_STR_P (zv ), "sizeof" )
71537167 && 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 ;
71557170 frame_ffi_func_type = NULL ;
71567171 frame_ffi_func_ref = IR_UNUSED ;
71577172 goto done ;
71587173 } else if (Z_TYPE_P (zv ) == IS_STRING
71597174 && zend_string_equals_literal_ci (Z_STR_P (zv ), "typeof" )
71607175 && 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 ;
71627178 frame_ffi_func_type = NULL ;
71637179 frame_ffi_func_ref = IR_UNUSED ;
71647180 goto done ;
71657181 } else if (Z_TYPE_P (zv ) == IS_STRING
71667182 && zend_string_equals_literal_ci (Z_STR_P (zv ), "isnull" )
71677183 && 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 ;
71697186 frame_ffi_func_type = NULL ;
71707187 frame_ffi_func_ref = IR_UNUSED ;
71717188 goto done ;
71727189 } else if (Z_TYPE_P (zv ) == IS_STRING
71737190 && zend_string_equals_literal_ci (Z_STR_P (zv ), "memcpy" )
71747191 && 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 ;
71767194 frame_ffi_func_type = NULL ;
71777195 frame_ffi_func_ref = IR_UNUSED ;
71787196 goto done ;
71797197 } else if (Z_TYPE_P (zv ) == IS_STRING
71807198 && zend_string_equals_literal_ci (Z_STR_P (zv ), "memcmp" )
71817199 && 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 ;
71837202 frame_ffi_func_type = NULL ;
71847203 frame_ffi_func_ref = IR_UNUSED ;
71857204 goto done ;
71867205 } else if (Z_TYPE_P (zv ) == IS_STRING
71877206 && zend_string_equals_literal_ci (Z_STR_P (zv ), "memset" )
71887207 && 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 ;
71907210 frame_ffi_func_type = NULL ;
71917211 frame_ffi_func_ref = IR_UNUSED ;
71927212 goto done ;
71937213 } else if (Z_TYPE_P (zv ) == IS_STRING
71947214 && zend_string_equals_literal_ci (Z_STR_P (zv ), "free" )
71957215 && 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 ;
71977218 frame_ffi_func_type = NULL ;
71987219 frame_ffi_func_ref = IR_UNUSED ;
71997220 goto done ;
@@ -7854,7 +7875,9 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
78547875#ifdef HAVE_FFI
78557876 if (TRACE_FRAME_FFI (call )) {
78567877 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 ;
78587881 }
78597882#endif
78607883 call -> prev = frame -> call ;
0 commit comments