Skip to content

Commit

Permalink
(PoC) Fixes failing static & object calls
Browse files Browse the repository at this point in the history
  • Loading branch information
PROFeNoM committed Dec 9, 2023
1 parent 006ab9c commit 4d19b4f
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 15 deletions.
38 changes: 28 additions & 10 deletions ext/span.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 2 additions & 5 deletions tests/ext/span_callback_basic.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,18 @@ $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();
$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;
Expand Down

0 comments on commit 4d19b4f

Please sign in to comment.