dotnet/roslyn

Remove unneccessary instructions from variable-less filter

Open

#4 388 ouverte le 6 août 2015

Voir sur GitHub
 (4 commentaires) (0 réactions) (0 assignés)C# (4 257 forks)batch import
Area-CompilersConcept-Continuous ImprovementFeature Requesthelp wanted

Métriques du dépôt

Stars
 (20 414 stars)
Métriques de merge PR
 (Merge moyen 6j 17h) (256 PRs mergées en 30 j)

Description

When an exception filter doesn’t specify the exception variable, for example:

            try   {   …   }  catch when (F())  {  …   }

we emit

filter
  {
    IL_0006:  isinst     [mscorlib]System.Object
    IL_000b:  dup
    IL_000c:  brtrue.s   IL_0012
    IL_000e:  pop
    IL_000f:  ldc.i4.0
    IL_0010:  br.s       IL_001b
    IL_0012:  pop
    IL_0013:  call       bool ConsoleApplication1.Program::F()
    IL_0018:  ldc.i4.0
    IL_0019:  cgt.un
    IL_001b:  endfilter
  }  // end filter

The Object type check is unnecessary. The following IL sequence is verifiable and works equally well imo:

filter
  {
    IL_0012:  pop
    IL_0013:  call       bool ConsoleApplication1.Program::F()
    IL_0018:  ldc.i4.0
    IL_0019:  cgt.un
    IL_001b:  endfilter
  }  // end filter

Avoiding implicit reference to System.Object would simplify some low-level .NET Native scenarios that are layered below CoreFX and thus can't have a dependency on System.Object.

Guide contributeur