[C#] Генерируемый байт-код
От: Воронков Василий Россия  
Дата: 07.02.10 22:33
Оценка:
Есть спецы по ИЛу?

Интересно, почему компилятор шарпа для такого вот кода:


var x = 1;
if (x > 0)
{
    Console.WriteLine(x);
}


генерирует вот такую вот хреновину:

L_0000: nop 
L_0001: ldc.i4.1 
L_0002: stloc.0 
L_0003: ldloc.0 
L_0004: ldc.i4.0 
L_0005: cgt 
L_0007: ldc.i4.0 
L_0008: ceq 
L_000a: stloc.1 
L_000b: ldloc.1 
L_000c: brtrue.s L_0017
L_000e: nop 
L_000f: ldloc.0 
L_0010: call void [mscorlib]System.Console::WriteLine(int32)
L_0015: nop 
L_0016: nop 
L_0017: ret


Интересует выделенное. Есть ли какая хитрость в этом?
Переписанный вручную пример прекрасно работает:

ldc.i4.1 
stloc.0 
ldloc.0 
ldc.i4.0 
cgt                
brfalse.s L_0017
ldloc.0 
call void [mscorlib]System.Console::WriteLine(int32)                
L_0017: ret


Интересно, почему вместо brfalse, используется brtrue, ради чего приходится поднимать в стек дополнительное значение (ceq) и сравнивать с результатами первоначального сравнения (cgt).
Есть какая-то причина не использовать brfalse? Есть паттерн, при котором мой код не будет работать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.