Remove boxing of symbol types.

- The Equals operators were boxing the symbol types like crazy, added an abstract `SymbolTypeEquals` to avoid this.

#635
This commit is contained in:
N. Taylor Mullen 2016-01-14 16:07:13 -08:00
parent b760156e66
commit 7a0a9c6caa
4 changed files with 21 additions and 15 deletions

View File

@ -62,6 +62,8 @@ namespace Microsoft.AspNet.Razor.Parser
get { return CSharpLanguageCharacteristics.Instance; } get { return CSharpLanguageCharacteristics.Instance; }
} }
protected override bool SymbolTypeEquals(CSharpSymbolType x, CSharpSymbolType y) => x == y;
protected void MapDirectives(Action handler, params string[] directives) protected void MapDirectives(Action handler, params string[] directives)
{ {
foreach (string directive in directives) foreach (string directive in directives)

View File

@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Razor.Parser
// Whitespace here is invalid (according to the spec) // Whitespace here is invalid (according to the spec)
OptionalBangEscape(); OptionalBangEscape();
Optional(HtmlSymbolType.Text); Optional(HtmlSymbolType.Text);
AcceptAll(HtmlSymbolType.WhiteSpace); Optional(HtmlSymbolType.WhiteSpace);
Optional(HtmlSymbolType.CloseAngle); Optional(HtmlSymbolType.CloseAngle);
} }

View File

@ -48,6 +48,8 @@ namespace Microsoft.AspNet.Razor.Parser
get { return HtmlLanguageCharacteristics.Instance; } get { return HtmlLanguageCharacteristics.Instance; }
} }
protected override bool SymbolTypeEquals(HtmlSymbolType x, HtmlSymbolType y) => x == y;
public override void BuildSpan(SpanBuilder span, SourceLocation start, string content) public override void BuildSpan(SpanBuilder span, SourceLocation start, string content)
{ {
span.Kind = SpanKind.Markup; span.Kind = SpanKind.Markup;

View File

@ -23,9 +23,11 @@ namespace Microsoft.AspNet.Razor.Parser
[Conditional("DEBUG")] [Conditional("DEBUG")]
internal void Assert(TSymbolType expectedType) internal void Assert(TSymbolType expectedType)
{ {
Debug.Assert(!EndOfFile && Equals(CurrentSymbol.Type, expectedType)); Debug.Assert(!EndOfFile && SymbolTypeEquals(CurrentSymbol.Type, expectedType));
} }
abstract protected bool SymbolTypeEquals(TSymbolType x, TSymbolType y);
protected internal void PutBack(TSymbol symbol) protected internal void PutBack(TSymbol symbol)
{ {
if (symbol != null) if (symbol != null)
@ -147,12 +149,12 @@ namespace Microsoft.AspNet.Razor.Parser
protected internal bool NextIs(TSymbolType type) protected internal bool NextIs(TSymbolType type)
{ {
return NextIs(sym => sym != null && Equals(type, sym.Type)); return NextIs(sym => sym != null && SymbolTypeEquals(type, sym.Type));
} }
protected internal bool NextIs(params TSymbolType[] types) protected internal bool NextIs(params TSymbolType[] types)
{ {
return NextIs(sym => sym != null && types.Any(t => Equals(t, sym.Type))); return NextIs(sym => sym != null && types.Any(t => SymbolTypeEquals(t, sym.Type)));
} }
protected internal bool NextIs(Func<TSymbol, bool> condition) protected internal bool NextIs(Func<TSymbol, bool> condition)
@ -168,12 +170,12 @@ namespace Microsoft.AspNet.Razor.Parser
protected internal bool Was(TSymbolType type) protected internal bool Was(TSymbolType type)
{ {
return PreviousSymbol != null && Equals(PreviousSymbol.Type, type); return PreviousSymbol != null && SymbolTypeEquals(PreviousSymbol.Type, type);
} }
protected internal bool At(TSymbolType type) protected internal bool At(TSymbolType type)
{ {
return !EndOfFile && CurrentSymbol != null && Equals(CurrentSymbol.Type, type); return !EndOfFile && CurrentSymbol != null && SymbolTypeEquals(CurrentSymbol.Type, type);
} }
protected internal bool AcceptAndMoveNext() protected internal bool AcceptAndMoveNext()
@ -219,7 +221,7 @@ namespace Microsoft.AspNet.Razor.Parser
{ {
foreach (TSymbolType type in types) foreach (TSymbolType type in types)
{ {
if (CurrentSymbol == null || !Equals(CurrentSymbol.Type, type)) if (CurrentSymbol == null || !SymbolTypeEquals(CurrentSymbol.Type, type))
{ {
return false; return false;
} }
@ -380,44 +382,44 @@ namespace Microsoft.AspNet.Razor.Parser
protected internal void AcceptWhile(TSymbolType type) protected internal void AcceptWhile(TSymbolType type)
{ {
AcceptWhile(sym => Equals(type, sym.Type)); AcceptWhile(sym => SymbolTypeEquals(type, sym.Type));
} }
// We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format // We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format
protected internal void AcceptWhile(TSymbolType type1, TSymbolType type2) protected internal void AcceptWhile(TSymbolType type1, TSymbolType type2)
{ {
AcceptWhile(sym => Equals(type1, sym.Type) || Equals(type2, sym.Type)); AcceptWhile(sym => SymbolTypeEquals(type1, sym.Type) || SymbolTypeEquals(type2, sym.Type));
} }
protected internal void AcceptWhile(TSymbolType type1, TSymbolType type2, TSymbolType type3) protected internal void AcceptWhile(TSymbolType type1, TSymbolType type2, TSymbolType type3)
{ {
AcceptWhile(sym => Equals(type1, sym.Type) || Equals(type2, sym.Type) || Equals(type3, sym.Type)); AcceptWhile(sym => SymbolTypeEquals(type1, sym.Type) || SymbolTypeEquals(type2, sym.Type) || SymbolTypeEquals(type3, sym.Type));
} }
protected internal void AcceptWhile(params TSymbolType[] types) protected internal void AcceptWhile(params TSymbolType[] types)
{ {
AcceptWhile(sym => types.Any(expected => Equals(expected, sym.Type))); AcceptWhile(sym => types.Any(expected => SymbolTypeEquals(expected, sym.Type)));
} }
protected internal void AcceptUntil(TSymbolType type) protected internal void AcceptUntil(TSymbolType type)
{ {
AcceptWhile(sym => !Equals(type, sym.Type)); AcceptWhile(sym => !SymbolTypeEquals(type, sym.Type));
} }
// We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format // We want to avoid array allocations and enumeration where possible, so we use the same technique as string.Format
protected internal void AcceptUntil(TSymbolType type1, TSymbolType type2) protected internal void AcceptUntil(TSymbolType type1, TSymbolType type2)
{ {
AcceptWhile(sym => !Equals(type1, sym.Type) && !Equals(type2, sym.Type)); AcceptWhile(sym => !SymbolTypeEquals(type1, sym.Type) && !SymbolTypeEquals(type2, sym.Type));
} }
protected internal void AcceptUntil(TSymbolType type1, TSymbolType type2, TSymbolType type3) protected internal void AcceptUntil(TSymbolType type1, TSymbolType type2, TSymbolType type3)
{ {
AcceptWhile(sym => !Equals(type1, sym.Type) && !Equals(type2, sym.Type) && !Equals(type3, sym.Type)); AcceptWhile(sym => !SymbolTypeEquals(type1, sym.Type) && !SymbolTypeEquals(type2, sym.Type) && !SymbolTypeEquals(type3, sym.Type));
} }
protected internal void AcceptUntil(params TSymbolType[] types) protected internal void AcceptUntil(params TSymbolType[] types)
{ {
AcceptWhile(sym => types.All(expected => !Equals(expected, sym.Type))); AcceptWhile(sym => types.All(expected => !SymbolTypeEquals(expected, sym.Type)));
} }
protected internal void AcceptWhile(Func<TSymbol, bool> condition) protected internal void AcceptWhile(Func<TSymbol, bool> condition)