public void Method_call_load_two_numbers_then_add() { // Arrange var builder = GetBuilder(); var pointer = 0; // Act _ = builder.GetIlProgram(); // Test reproducable property of CodeBuilder var program = builder.GetBinaryProgram(); // Assert // Entry Point Assert.Equal(0, pointer); Assert.Equal(11, BinaryConvert.GetInt32(ref pointer, program)); // two var method_two = pointer; Assert.Equal(5, ++pointer); Assert.Equal(InstructionCode.Ldc_i4, BinaryConvert.GetInstructionCode(ref pointer, program)); Assert.Equal(2, BinaryConvert.GetInt32(ref pointer, program)); Assert.Equal(InstructionCode.Ret, BinaryConvert.GetInstructionCode(ref pointer, program)); // main Assert.Equal(12, ++pointer); Assert.Equal(InstructionCode.Ldc_i4, BinaryConvert.GetInstructionCode(ref pointer, program)); Assert.Equal(1, BinaryConvert.GetInt32(ref pointer, program)); Assert.Equal(InstructionCode.Call, BinaryConvert.GetInstructionCode(ref pointer, program)); Assert.Equal(method_two, BinaryConvert.GetInt32(ref pointer, program)); Assert.Equal(InstructionCode.Add, BinaryConvert.GetInstructionCode(ref pointer, program)); Assert.Equal(InstructionCode.Ret, BinaryConvert.GetInstructionCode(ref pointer, program));
private InstructionCode GetInstruction(ReadOnlySpan <byte> program) { try { return(BinaryConvert.GetInstructionCode(ref _pointer, program)); } catch (InvalidOperationException ex) { Debug.WriteLine(ex.Message); Throw.NotSupportedInstruction(_pointer, program[_pointer]); throw; // can't happen } }