2013-07-03 3 views
0

동적 메서드를 생성하려고합니다. 부울 값 arg이 스택에 있다고 가정합니다. 간단한 규칙 arg ? 1 : 0에 의해 bool 값에서 변환 될 유형 int의 인수를 허용하는 메소드를 호출하려고합니다. IL 코드 생성 몇 가지 예제 코드는 다음과 같습니다 :IL 코드에서 삼항 연산자를내는 방법

//bool value is already pushed into stack 
IL_003d: brtrue.s IL_0042 
IL_003f: ldc.i4.0 
IL_0040: br.s  IL_0043 
IL_0042: ldc.i4.1 
IL_0043: callvirt --methodName-- 

내가 올바르게로 이동 오프셋 식별 할 수있는 방법 OpCodes.Brtrue_SOpCodes.Br_S을 emmiting? 당신이 정말 01falsetrue을 변환 할 경우

답변

3

것은, 당신은 4 바이트보다 작은 유형은 스택에 4 바이트로 확장하고 있다는 사실을 사용할 수 있습니다. 즉, 아무 것도하지 않고 boolint으로 처리해야합니다.

당신이 실제로 삼항 연산자를 원하는 경우에, 당신은 방법 DefineLabel()MarkLabel()의 쌍 사용할 수 있습니다

var trueLabel = il.DefineLabel(); 
var endLabel = il.DefineLabel(); 

il.Emit(OpCodes.Brtrue, trueLabel); 

il.Emit(OpCodes.Ldc_I4_0); 

il.Emit(OpCodes.Br, endLabel); 

il.MarkLabel(trueLabel); 

il.Emit(OpCodes.Ldc_I4_1); 

il.MarkLabel(endLabel);