static byte[] GenerateSampleIL(ControlFlowBuilder cfb) { var code = new BlobBuilder(); var il = new InstructionEncoder(code, cfb); var l1 = il.DefineLabel(); var l2 = il.DefineLabel(); var l3 = il.DefineLabel(); var l4 = il.DefineLabel(); il.MarkLabel(l1); il.OpCode(ILOpCode.Nop); il.Branch(ILOpCode.Br_s, l1); il.MarkLabel(l2); il.OpCode(ILOpCode.Nop); il.MarkLabel(l3); il.OpCode(ILOpCode.Nop); il.MarkLabel(l4); cfb.AddCatchRegion(l1, l2, l3, l4, MetadataTokens.TypeDefinitionHandle(1)); var builder = new BlobBuilder(); new MethodBodyStreamEncoder(builder).AddMethodBody(il); return(builder.ToArray()); }
public void AddRegion_Errors1() { var code = new BlobBuilder(); var flow = new ControlFlowBuilder(); var il = new InstructionEncoder(code, flow); var ilx = new InstructionEncoder(code, new ControlFlowBuilder()); var l1 = il.DefineLabel(); var l2 = il.DefineLabel(); var l3 = il.DefineLabel(); var l4 = il.DefineLabel(); var l5 = il.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); var lx = ilx.DefineLabel(); il.MarkLabel(l1); il.OpCode(ILOpCode.Nop); il.MarkLabel(l2); il.OpCode(ILOpCode.Nop); il.MarkLabel(l3); il.OpCode(ILOpCode.Nop); il.MarkLabel(l4); il.OpCode(ILOpCode.Nop); il.MarkLabel(l5); Assert.Throws <ArgumentException>(() => flow.AddCatchRegion(l1, l2, l3, l4, default(TypeDefinitionHandle))); Assert.Throws <ArgumentException>(() => flow.AddCatchRegion(l1, l2, l3, l4, MetadataTokens.MethodDefinitionHandle(1))); Assert.Throws <ArgumentNullException>(() => flow.AddCatchRegion(default(LabelHandle), l2, l3, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws <ArgumentNullException>(() => flow.AddCatchRegion(l1, default(LabelHandle), l3, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws <ArgumentNullException>(() => flow.AddCatchRegion(l1, l2, default(LabelHandle), l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws <ArgumentNullException>(() => flow.AddCatchRegion(l1, l2, l3, default(LabelHandle), MetadataTokens.TypeReferenceHandle(1))); Assert.Throws <ArgumentException>(() => flow.AddCatchRegion(lx, l2, l3, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws <ArgumentException>(() => flow.AddCatchRegion(l1, lx, l3, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws <ArgumentException>(() => flow.AddCatchRegion(l1, l2, lx, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws <ArgumentException>(() => flow.AddCatchRegion(l1, l2, l3, lx, MetadataTokens.TypeReferenceHandle(1))); }
public void AddCatchRegions() { var code = new BlobBuilder(); var flow = new ControlFlowBuilder(); var il = new InstructionEncoder(code, flow); var l1 = il.DefineLabel(); var l2 = il.DefineLabel(); var l3 = il.DefineLabel(); var l4 = il.DefineLabel(); var l5 = il.DefineLabel(); il.MarkLabel(l1); Assert.Equal(0, il.Offset); il.OpCode(ILOpCode.Nop); il.MarkLabel(l2); Assert.Equal(1, il.Offset); il.OpCode(ILOpCode.Nop); il.OpCode(ILOpCode.Nop); il.MarkLabel(l3); Assert.Equal(3, il.Offset); il.OpCode(ILOpCode.Nop); il.OpCode(ILOpCode.Nop); il.OpCode(ILOpCode.Nop); il.MarkLabel(l4); Assert.Equal(6, il.Offset); il.OpCode(ILOpCode.Nop); il.OpCode(ILOpCode.Nop); il.OpCode(ILOpCode.Nop); il.OpCode(ILOpCode.Nop); il.MarkLabel(l5); Assert.Equal(10, il.Offset); flow.AddCatchRegion(l1, l2, l3, l4, MetadataTokens.TypeDefinitionHandle(1)); flow.AddCatchRegion(l1, l2, l3, l4, MetadataTokens.TypeSpecificationHandle(2)); flow.AddCatchRegion(l1, l2, l3, l4, MetadataTokens.TypeReferenceHandle(3)); var builder = new BlobBuilder(); flow.SerializeExceptionTable(builder); AssertEx.Equal(new byte[] { 0x01, // flag (byte)builder.Count, // size 0x00, 0x00, // reserved 0x00, 0x00, // kind 0x00, 0x00, // try offset 0x01, // try length 0x03, 0x00, // handler offset 0x03, // handler length 0x01, 0x00, 0x00, 0x02, // catch type or filter offset 0x00, 0x00, // kind 0x00, 0x00, // try offset 0x01, // try length 0x03, 0x00, // handler offset 0x03, // handler length 0x02, 0x00, 0x00, 0x1B, // catch type or filter offset 0x00, 0x00, // kind 0x00, 0x00, // try offset 0x01, // try length 0x03, 0x00, // handler offset 0x03, // handler length 0x03, 0x00, 0x00, 0x01, // catch type or filter offset }, builder.ToArray()); }
public void AddRegion_Errors1() { var code = new BlobBuilder(); var flow = new ControlFlowBuilder(); var il = new InstructionEncoder(code, flow); var ilx = new InstructionEncoder(code, new ControlFlowBuilder()); var l1 = il.DefineLabel(); var l2 = il.DefineLabel(); var l3 = il.DefineLabel(); var l4 = il.DefineLabel(); var l5 = il.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); ilx.DefineLabel(); var lx = ilx.DefineLabel(); il.MarkLabel(l1); il.OpCode(ILOpCode.Nop); il.MarkLabel(l2); il.OpCode(ILOpCode.Nop); il.MarkLabel(l3); il.OpCode(ILOpCode.Nop); il.MarkLabel(l4); il.OpCode(ILOpCode.Nop); il.MarkLabel(l5); Assert.Throws<ArgumentException>(() => flow.AddCatchRegion(l1, l2, l3, l4, default(TypeDefinitionHandle))); Assert.Throws<ArgumentException>(() => flow.AddCatchRegion(l1, l2, l3, l4, MetadataTokens.MethodDefinitionHandle(1))); Assert.Throws<ArgumentNullException>(() => flow.AddCatchRegion(default(LabelHandle), l2, l3, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws<ArgumentNullException>(() => flow.AddCatchRegion(l1, default(LabelHandle), l3, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws<ArgumentNullException>(() => flow.AddCatchRegion(l1, l2, default(LabelHandle), l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws<ArgumentNullException>(() => flow.AddCatchRegion(l1, l2, l3, default(LabelHandle), MetadataTokens.TypeReferenceHandle(1))); Assert.Throws<ArgumentException>(() => flow.AddCatchRegion(lx, l2, l3, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws<ArgumentException>(() => flow.AddCatchRegion(l1, lx, l3, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws<ArgumentException>(() => flow.AddCatchRegion(l1, l2, lx, l4, MetadataTokens.TypeReferenceHandle(1))); Assert.Throws<ArgumentException>(() => flow.AddCatchRegion(l1, l2, l3, lx, MetadataTokens.TypeReferenceHandle(1))); }