@@ -421,16 +421,34 @@ bool execute_span_end_callback(ddtrace_span_data *span) {
421
421
zval rv ;
422
422
zval span_zv ;
423
423
ZVAL_OBJ (& span_zv , & span -> std );
424
-
425
- success = zai_symbol_call (
426
- ZAI_SYMBOL_SCOPE_GLOBAL ,
427
- NULL ,
428
- ZAI_SYMBOL_FUNCTION_CLOSURE ,
429
- end_closure_zv ,
430
- & rv ,
431
- 1 ,
432
- & span_zv
433
- );
424
+ // Get the closure's scope
425
+ zend_class_entry * closure_called_scope ;
426
+ zend_function * closure_func ;
427
+ zend_object * closure_this ;
428
+ #if PHP_VERSION_ID < 80000
429
+ Z_OBJ_HANDLER_P (end_closure_zv , get_closure )(end_closure_zv , & closure_called_scope , & closure_func , & closure_this );
430
+ #else
431
+ Z_OBJ_HANDLER_P (end_closure_zv , get_closure )(Z_OBJ_P (end_closure_zv ), & closure_called_scope , & closure_func , & closure_this , true);
432
+ #endif
433
+ if (closure_called_scope && closure_func -> common .fn_flags & ZEND_ACC_STATIC ) {
434
+ success = zai_symbol_call_static (
435
+ closure_called_scope ,
436
+ zai_str_from_zstr (closure_func -> common .function_name ),
437
+ & rv ,
438
+ 1 ,
439
+ & span_zv
440
+ );
441
+ } else {
442
+ success = zai_symbol_call (
443
+ closure_called_scope ? ZAI_SYMBOL_SCOPE_CLASS : ZAI_SYMBOL_SCOPE_GLOBAL ,
444
+ closure_called_scope ? closure_called_scope : NULL ,
445
+ ZAI_SYMBOL_FUNCTION_CLOSURE ,
446
+ end_closure_zv ,
447
+ & rv ,
448
+ 1 ,
449
+ & span_zv
450
+ );
451
+ }
434
452
435
453
zval_ptr_dtor (& rv );
436
454
} // TODO: string, etc? TBD, else refactor
0 commit comments