Skip to content

Commit aa023be

Browse files
authored
Modify AvTrace call chain to use params ReadOnlySpan<object> instead of an array (#9468)
* modify call chain from params object[] to params Span<object> * replace arraylist with lit<object> * use defaultinterpolatedstringhandler instead of string concs * fix up conditions to be more readable * make the event's collection immutable * replace the rest of the existing overloads with single params Span<object> * modify the t4 template for AvTraceMessages * remove additional overloads as Roslyn will Span<object>.Empty by default * fix unintentional bug in formatIndex addition * fix whitespaces in Trace function * modify call-chain from Span<object> to ROS<object>, slice in AvTraceEventHandler * swap List<object> for array, delay array alloc, remove re-alloc * Post-merge * fix t4 * fix whitespace
1 parent 08af53e commit aa023be

File tree

7 files changed

+111
-570
lines changed

7 files changed

+111
-570
lines changed

eng/WpfArcadeSdk/tools/CodeGen/AvTrace/AvTraceMessages.tt

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -70,51 +70,15 @@ namespace MS.Internal
7070
<# } #>
7171

7272
/// <summary> Send a single trace output </summary>
73-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, params object[] parameters )
73+
public static void Trace(TraceEventType type, AvTraceDetails traceDetails, params ReadOnlySpan<object> parameters)
7474
{
75-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters );
76-
}
77-
78-
/// <summary> These help delay allocation of object array </summary>
79-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails )
80-
{
81-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, Array.Empty<object>() );
82-
}
83-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, object p1 )
84-
{
85-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1 } );
86-
}
87-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, object p1, object p2 )
88-
{
89-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2 } );
90-
}
91-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, object p1, object p2, object p3 )
92-
{
93-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2, p3 } );
75+
_avTrace.Trace(type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters);
9476
}
9577

9678
/// <summary> Send a singleton "activity" trace (really, this sends the same trace as both a Start and a Stop) </summary>
97-
public static void TraceActivityItem( AvTraceDetails traceDetails, params Object[] parameters )
98-
{
99-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters );
100-
}
101-
102-
/// <summary> These help delay allocation of object array </summary>
103-
public static void TraceActivityItem( AvTraceDetails traceDetails )
104-
{
105-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, Array.Empty<object>() );
106-
}
107-
public static void TraceActivityItem( AvTraceDetails traceDetails, object p1 )
108-
{
109-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1 } );
110-
}
111-
public static void TraceActivityItem( AvTraceDetails traceDetails, object p1, object p2 )
112-
{
113-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2 } );
114-
}
115-
public static void TraceActivityItem( AvTraceDetails traceDetails, object p1, object p2, object p3 )
79+
public static void TraceActivityItem(AvTraceDetails traceDetails, params ReadOnlySpan<object> parameters)
11680
{
117-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2, p3 } );
81+
_avTrace.TraceStartStop(traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters);
11882
}
11983

12084
public static bool IsEnabled

src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/Generated/AvTraceMessages.cs

Lines changed: 8 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -69,51 +69,15 @@ public static AvTraceDetails InvokeHandlers
6969
}
7070

7171
/// <summary> Send a single trace output </summary>
72-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, params object[] parameters )
72+
public static void Trace(TraceEventType type, AvTraceDetails traceDetails, params ReadOnlySpan<object> parameters)
7373
{
74-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters );
75-
}
76-
77-
/// <summary> These help delay allocation of object array </summary>
78-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails )
79-
{
80-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, Array.Empty<object>() );
81-
}
82-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, object p1 )
83-
{
84-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1 } );
85-
}
86-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, object p1, object p2 )
87-
{
88-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2 } );
89-
}
90-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, object p1, object p2, object p3 )
91-
{
92-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2, p3 } );
74+
_avTrace.Trace(type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters);
9375
}
9476

9577
/// <summary> Send a singleton "activity" trace (really, this sends the same trace as both a Start and a Stop) </summary>
96-
public static void TraceActivityItem( AvTraceDetails traceDetails, params Object[] parameters )
97-
{
98-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters );
99-
}
100-
101-
/// <summary> These help delay allocation of object array </summary>
102-
public static void TraceActivityItem( AvTraceDetails traceDetails )
103-
{
104-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, Array.Empty<object>() );
105-
}
106-
public static void TraceActivityItem( AvTraceDetails traceDetails, object p1 )
107-
{
108-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1 } );
109-
}
110-
public static void TraceActivityItem( AvTraceDetails traceDetails, object p1, object p2 )
111-
{
112-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2 } );
113-
}
114-
public static void TraceActivityItem( AvTraceDetails traceDetails, object p1, object p2, object p3 )
78+
public static void TraceActivityItem(AvTraceDetails traceDetails, params ReadOnlySpan<object> parameters)
11579
{
116-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2, p3 } );
80+
_avTrace.TraceStartStop(traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters);
11781
}
11882

11983
public static bool IsEnabled
@@ -252,51 +216,15 @@ public static AvTraceDetails AnimateStorageValidationNoLongerFailing
252216
}
253217

254218
/// <summary> Send a single trace output </summary>
255-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, params object[] parameters )
219+
public static void Trace(TraceEventType type, AvTraceDetails traceDetails, params ReadOnlySpan<object> parameters)
256220
{
257-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters );
258-
}
259-
260-
/// <summary> These help delay allocation of object array </summary>
261-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails )
262-
{
263-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, Array.Empty<object>() );
264-
}
265-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, object p1 )
266-
{
267-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1 } );
268-
}
269-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, object p1, object p2 )
270-
{
271-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2 } );
272-
}
273-
public static void Trace( TraceEventType type, AvTraceDetails traceDetails, object p1, object p2, object p3 )
274-
{
275-
_avTrace.Trace( type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2, p3 } );
221+
_avTrace.Trace(type, traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters);
276222
}
277223

278224
/// <summary> Send a singleton "activity" trace (really, this sends the same trace as both a Start and a Stop) </summary>
279-
public static void TraceActivityItem( AvTraceDetails traceDetails, params Object[] parameters )
280-
{
281-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters );
282-
}
283-
284-
/// <summary> These help delay allocation of object array </summary>
285-
public static void TraceActivityItem( AvTraceDetails traceDetails )
286-
{
287-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, Array.Empty<object>() );
288-
}
289-
public static void TraceActivityItem( AvTraceDetails traceDetails, object p1 )
290-
{
291-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1 } );
292-
}
293-
public static void TraceActivityItem( AvTraceDetails traceDetails, object p1, object p2 )
294-
{
295-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2 } );
296-
}
297-
public static void TraceActivityItem( AvTraceDetails traceDetails, object p1, object p2, object p3 )
225+
public static void TraceActivityItem(AvTraceDetails traceDetails, params ReadOnlySpan<object> parameters)
298226
{
299-
_avTrace.TraceStartStop( traceDetails.Id, traceDetails.Message, traceDetails.Labels, new object[] { p1, p2, p3 } );
227+
_avTrace.TraceStartStop(traceDetails.Id, traceDetails.Message, traceDetails.Labels, parameters);
300228
}
301229

302230
public static bool IsEnabled

src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -168,31 +168,26 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais
168168
args.Source=newSource;
169169
}
170170
}
171-
171+
172172
// Invoke listeners
173173

174-
var traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled;
175-
if ( traceRoutedEventIsEnabled )
174+
bool traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled;
175+
if (traceRoutedEventIsEnabled)
176176
{
177-
_traceArguments ??= new object[3];
178-
_traceArguments[0] = _routeItemList[i].Target;
179-
_traceArguments[1] = args;
180-
_traceArguments[2] = BooleanBoxes.Box(args.Handled);
181177
TraceRoutedEvent.Trace(
182178
TraceEventType.Start,
183179
TraceRoutedEvent.InvokeHandlers,
184-
_traceArguments);
180+
_routeItemList[i].Target, args, BooleanBoxes.Box(args.Handled));
185181
}
186-
182+
187183
_routeItemList[i].InvokeHandler(args);
188184

189-
if( traceRoutedEventIsEnabled )
185+
if (traceRoutedEventIsEnabled)
190186
{
191-
_traceArguments[2] = BooleanBoxes.Box(args.Handled);
192187
TraceRoutedEvent.Trace(
193188
TraceEventType.Stop,
194189
TraceRoutedEvent.InvokeHandlers,
195-
_traceArguments);
190+
_routeItemList[i].Target, args, BooleanBoxes.Box(args.Handled));
196191
}
197192

198193

@@ -243,29 +238,24 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais
243238
}
244239

245240

246-
var traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled;
247-
if ( traceRoutedEventIsEnabled )
241+
bool traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled;
242+
if (traceRoutedEventIsEnabled)
248243
{
249-
_traceArguments ??= new object[3];
250-
_traceArguments[0] = _routeItemList[i].Target;
251-
_traceArguments[1] = args;
252-
_traceArguments[2] = BooleanBoxes.Box(args.Handled);
253244
TraceRoutedEvent.Trace(
254245
TraceEventType.Start,
255246
TraceRoutedEvent.InvokeHandlers,
256-
_traceArguments);
247+
_routeItemList[i].Target, args, BooleanBoxes.Box(args.Handled));
257248
}
258249

259250
// Invoke listeners
260251
_routeItemList[i].InvokeHandler(args);
261252

262253
if (traceRoutedEventIsEnabled)
263254
{
264-
_traceArguments[2] = BooleanBoxes.Box(args.Handled);
265255
TraceRoutedEvent.Trace(
266256
TraceEventType.Stop,
267257
TraceRoutedEvent.InvokeHandlers,
268-
_traceArguments);
258+
_routeItemList[i].Target, args, BooleanBoxes.Box(args.Handled));
269259
}
270260

271261
}
@@ -532,9 +522,6 @@ internal void Clear()
532522
// Stores Source Items for separated trees
533523
private FrugalStructList<SourceItem> _sourceItemList;
534524

535-
// Stores arguments that are passed to TraceRoutedEvent.Trace (to reduce allocations)
536-
private object[] _traceArguments;
537-
538525
#endregion Data
539526
}
540527
}

0 commit comments

Comments
 (0)