From 4d19b4f55f271841c6c7b0586d4dee6fce37a535 Mon Sep 17 00:00:00 2001 From: Alexandre Choura Date: Sat, 9 Dec 2023 01:03:10 +0100 Subject: [PATCH] (PoC) Fixes failing static & object calls --- ext/span.c | 38 ++++++++++++++++++++++-------- tests/ext/span_callback_basic.phpt | 7 ++---- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/ext/span.c b/ext/span.c index ae92cbca3eb..fc2d64d08ff 100644 --- a/ext/span.c +++ b/ext/span.c @@ -421,16 +421,34 @@ bool execute_span_end_callback(ddtrace_span_data *span) { zval rv; zval span_zv; ZVAL_OBJ(&span_zv, &span->std); - - success = zai_symbol_call( - ZAI_SYMBOL_SCOPE_GLOBAL, - NULL, - ZAI_SYMBOL_FUNCTION_CLOSURE, - end_closure_zv, - &rv, - 1, - &span_zv - ); + // Get the closure's scope + zend_class_entry *closure_called_scope; + zend_function *closure_func; + zend_object *closure_this; +#if PHP_VERSION_ID < 80000 + Z_OBJ_HANDLER_P(end_closure_zv, get_closure)(end_closure_zv, &closure_called_scope, &closure_func, &closure_this); +#else + Z_OBJ_HANDLER_P(end_closure_zv, get_closure)(Z_OBJ_P(end_closure_zv), &closure_called_scope, &closure_func, &closure_this, true); +#endif + if (closure_called_scope && closure_func->common.fn_flags & ZEND_ACC_STATIC) { + success = zai_symbol_call_static( + closure_called_scope, + zai_str_from_zstr(closure_func->common.function_name), + &rv, + 1, + &span_zv + ); + } else { + success = zai_symbol_call( + closure_called_scope ? ZAI_SYMBOL_SCOPE_CLASS : ZAI_SYMBOL_SCOPE_GLOBAL, + closure_called_scope ? closure_called_scope : NULL, + ZAI_SYMBOL_FUNCTION_CLOSURE, + end_closure_zv, + &rv, + 1, + &span_zv + ); + } zval_ptr_dtor(&rv); } // TODO: string, etc? TBD, else refactor diff --git a/tests/ext/span_callback_basic.phpt b/tests/ext/span_callback_basic.phpt index 2d5c6138ca3..497a0a6b50b 100644 --- a/tests/ext/span_callback_basic.phpt +++ b/tests/ext/span_callback_basic.phpt @@ -12,7 +12,7 @@ $callback = function (\DDTrace\SpanData $span) use (&$myGlobalClosedSpansCounter $activeSpan = \DDTrace\active_span(); echo "$activeSpan->name\n"; echo "Passed span: $span->name\n"; - $span->meta['counter.value'] = $myGlobalClosedSpansCounter; + //$span->meta['counter.value'] = $myGlobalClosedSpansCounter; }; $span = \DDTrace\start_span(); @@ -20,13 +20,10 @@ $span->name = "mySpan"; //\DDTrace\set_end_callback($span, $callback); $span->endCallback = $callback; -var_dump(\DDTrace\current_context()); -var_dump(\DDTrace\logs_correlation_trace_id()); - \DDTrace\close_span(); var_dump($myGlobalClosedSpansCounter); -var_dump(dd_trace_serialize_closed_spans()); +//var_dump(dd_trace_serialize_closed_spans()); class mySpanWrapper { private $mySpan;