public override void VisitCase(CaseStatement caseStmt)
{
LocalVariable test = localVariableStack.GetLocal(caseStmt.TestName);
test.Declare(ilGenerator);
test.EmitStorePrefix(ilGenerator);
caseStmt.Test.Accept(this);
BoxIfNecessary(caseStmt.Test.RawType, test.RawType);
test.EmitStore(ilGenerator);
Label endLabel = ilGenerator.DefineLabel();
foreach (CaseWhen when in caseStmt.WhenPartList) {
Label thenLabel = ilGenerator.DefineLabel();
Label nextLabel = ilGenerator.DefineLabel();
foreach (CallExpression call in when.TestCallList) {
call.Accept(this);
ilGenerator.Emit(OpCodes.Brtrue, thenLabel);
}
ilGenerator.Emit(OpCodes.Br, nextLabel);
ilGenerator.MarkLabel(thenLabel);
when.ThenPart.Accept(this);
ilGenerator.Emit(OpCodes.Br, endLabel);
ilGenerator.MarkLabel(nextLabel);
}
if (caseStmt.ElsePart != null)
caseStmt.ElsePart.Accept(this);
ilGenerator.MarkLabel(endLabel);
}