15 int setBreakInstruction = context.
EmitEmpty();
22 List<int> caseBodyJumps =
new List<int>();
23 List<int> caseEndJumps =
new List<int>();
26 context.Emit(
BadOpCode.Dup, expression.Position);
27 context.Compile(@
case.Key);
28 context.Emit(
BadOpCode.Equals, expression.Position);
29 if (@
case.Value.Length > 0)
31 int endJump = context.EmitEmpty();
35 foreach (
int caseBodyJump
in caseBodyJumps)
37 context.ResolveEmpty(caseBodyJump,
BadOpCode.JumpRelativeIfTrue, expression.Position, context.InstructionCount - caseBodyJump - 1);
39 caseBodyJumps.Clear();
40 context.Compile(@
case.Value,
false);
43 context.ResolveEmpty(endJump,
BadOpCode.JumpRelativeIfFalse, expression.Position, context.InstructionCount - endJump);
44 caseEndJumps.Add(context.EmitEmpty());
50 caseBodyJumps.Add(context.EmitEmpty());
54 foreach (
int caseBodyJump
in caseBodyJumps)
56 context.ResolveEmpty(caseBodyJump,
BadOpCode.JumpRelativeIfTrue, expression.Position, context.InstructionCount - caseBodyJump - 1);
58 caseBodyJumps.Clear();
59 if (expression.DefaultCase !=
null)
61 context.Compile(expression.DefaultCase,
false);
64 foreach (
int caseEndJump
in caseEndJumps)
66 context.ResolveEmpty(caseEndJump,
BadOpCode.JumpRelative, expression.Position, context.InstructionCount - caseEndJump - 1);
68 context.ResolveEmpty(setBreakInstruction,
BadOpCode.SetBreakPointer, expression.Position, context.InstructionCount - switchScopeStart);
69 context.Emit(
BadOpCode.DestroyScope, expression.Position);