Pass catchAll ValueTuple via in (#9807)
This commit is contained in:
parent
8e37f8477d
commit
e22702891d
|
|
@ -68,7 +68,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
|
||||||
int score,
|
int score,
|
||||||
KeyValuePair<string, object>[] slots,
|
KeyValuePair<string, object>[] slots,
|
||||||
(string parameterName, int segmentIndex, int slotIndex)[] captures,
|
(string parameterName, int segmentIndex, int slotIndex)[] captures,
|
||||||
(string parameterName, int segmentIndex, int slotIndex) catchAll,
|
in (string parameterName, int segmentIndex, int slotIndex) catchAll,
|
||||||
(RoutePatternPathSegment pathSegment, int segmentIndex)[] complexSegments,
|
(RoutePatternPathSegment pathSegment, int segmentIndex)[] complexSegments,
|
||||||
KeyValuePair<string, IRouteConstraint>[] constraints)
|
KeyValuePair<string, IRouteConstraint>[] constraints)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
|
||||||
// This is a fast path for single candidate, 0 policies and default selector
|
// This is a fast path for single candidate, 0 policies and default selector
|
||||||
if (candidateCount == 1 && policyCount == 0 && _isDefaultEndpointSelector)
|
if (candidateCount == 1 && policyCount == 0 && _isDefaultEndpointSelector)
|
||||||
{
|
{
|
||||||
ref var candidate = ref candidates[0];
|
ref readonly var candidate = ref candidates[0];
|
||||||
|
|
||||||
// Just strict path matching
|
// Just strict path matching
|
||||||
if (candidate.Flags == Candidate.CandidateFlags.None)
|
if (candidate.Flags == Candidate.CandidateFlags.None)
|
||||||
|
|
@ -110,7 +110,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
|
||||||
// Reminder!
|
// Reminder!
|
||||||
// candidate: readonly data about the endpoint and how to match
|
// candidate: readonly data about the endpoint and how to match
|
||||||
// state: mutable storarge for our processing
|
// state: mutable storarge for our processing
|
||||||
ref var candidate = ref candidates[i];
|
ref readonly var candidate = ref candidates[i];
|
||||||
ref var state = ref candidateState[i];
|
ref var state = ref candidateState[i];
|
||||||
state = new CandidateState(candidate.Endpoint, candidate.Score);
|
state = new CandidateState(candidate.Endpoint, candidate.Score);
|
||||||
|
|
||||||
|
|
@ -249,13 +249,16 @@ namespace Microsoft.AspNetCore.Routing.Matching
|
||||||
|
|
||||||
private void ProcessCatchAll(
|
private void ProcessCatchAll(
|
||||||
KeyValuePair<string, object>[] slots,
|
KeyValuePair<string, object>[] slots,
|
||||||
(string parameterName, int segmentIndex, int slotIndex) catchAll,
|
in (string parameterName, int segmentIndex, int slotIndex) catchAll,
|
||||||
string path,
|
string path,
|
||||||
ReadOnlySpan<PathSegment> segments)
|
ReadOnlySpan<PathSegment> segments)
|
||||||
{
|
{
|
||||||
if (segments.Length > catchAll.segmentIndex)
|
// Read segmentIndex to local both to skip double read from stack value
|
||||||
|
// and to use the same in-bounds validated varaible to access the array.
|
||||||
|
var segmentIndex = catchAll.segmentIndex;
|
||||||
|
if ((uint)segmentIndex < (uint)segments.Length)
|
||||||
{
|
{
|
||||||
var segment = segments[catchAll.segmentIndex];
|
var segment = segments[segmentIndex];
|
||||||
slots[catchAll.slotIndex] = new KeyValuePair<string, object>(
|
slots[catchAll.slotIndex] = new KeyValuePair<string, object>(
|
||||||
catchAll.parameterName,
|
catchAll.parameterName,
|
||||||
path.Substring(segment.Start));
|
path.Substring(segment.Start));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue