Skip to content

Commit 78fe75b

Browse files
committed
(PoC) Fixes failing static & object calls
1 parent e91ed73 commit 78fe75b

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

ext/span.c

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -421,16 +421,34 @@ bool execute_span_end_callback(ddtrace_span_data *span) {
421421
zval rv;
422422
zval span_zv;
423423
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+
}
434452

435453
zval_ptr_dtor(&rv);
436454
} // TODO: string, etc? TBD, else refactor

tests/ext/span_callback_basic.phpt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,18 @@ $callback = function (\DDTrace\SpanData $span) use (&$myGlobalClosedSpansCounter
1212
$activeSpan = \DDTrace\active_span();
1313
echo "$activeSpan->name\n";
1414
echo "Passed span: $span->name\n";
15-
$span->meta['counter.value'] = $myGlobalClosedSpansCounter;
15+
//$span->meta['counter.value'] = $myGlobalClosedSpansCounter;
1616
};
1717

1818
$span = \DDTrace\start_span();
1919
$span->name = "mySpan";
2020
//\DDTrace\set_end_callback($span, $callback);
2121
$span->endCallback = $callback;
2222

23-
var_dump(\DDTrace\current_context());
24-
var_dump(\DDTrace\logs_correlation_trace_id());
25-
2623
\DDTrace\close_span();
2724

2825
var_dump($myGlobalClosedSpansCounter);
29-
var_dump(dd_trace_serialize_closed_spans());
26+
//var_dump(dd_trace_serialize_closed_spans());
3027

3128
class mySpanWrapper {
3229
private $mySpan;

0 commit comments

Comments
 (0)