示例#1
0
    def test_reg_report(self):
        self.add_opcode()
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUX))

        vm, size = self.create()
        vm.step(Report(IMUX=42.5))

        self.assertEqual(vm.TH, 42)
        self.assertEqual(vm.offset, size)
示例#2
0
    def test_reg_report(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))

        vm, size = self.create(stack=b'\x00\x00')
        vm.step(Report(L2Value=42))

        self.assertEqual(vm.SP, 44)
        self.assertEqual(vm.offset, size)
示例#3
0
    def test_report_int_report_float(self):
        self.add_opcode()
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUX))

        vm, size = self.create()
        report = Report(IMUX=42.5)
        vm.step(report)

        self.assertEqual(report.L2Value, 42)
        self.assertEqual(vm.offset, size)
示例#4
0
    def test_report_report(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_R2VALUE))

        vm, size = self.create()
        report = Report(L2Value=9, R2Value=42)
        vm.step(report)

        self.assertEqual(report.L2Value, 9 + 42)
        self.assertEqual(vm.offset, size)
示例#5
0
    def test_reg_reg(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))

        vm, size = self.create(stack=b'\x00\x00')
        vm.TH = 42
        vm.step(Report())

        self.assertEqual(vm.SP, 2 + 42)
        self.assertEqual(vm.offset, size)
示例#6
0
    def test_regoff_report_int(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_INT))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))

        vm, size = self.create(stack=struct.pack('<iii', 1, 2, 3))
        vm.step(Report(L2Value=42))

        self.assertEqual(vm.get_stack(), struct.pack('<iii', 1, 2 + 42, 3))
        self.assertEqual(vm.offset, size)
示例#7
0
    def test_reg_regoff(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP))
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_INT))

        vm, size = self.create(stack=struct.pack('<iii', 1, 42, 3))
        vm.step(Report())

        self.assertEqual(vm.SP, 12 + 42)
        self.assertEqual(vm.offset, size)
示例#8
0
    def test_regoff_report_float(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_FLOAT))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUY))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 2.5, 3))
        vm.step(Report(IMUY=42.5))

        self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 2.5 + 42.5, 3))
        self.assertEqual(vm.offset, size)
示例#9
0
    def test_reg_int_regoff_float(self):
        self.add_opcode()
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_FLOAT))

        vm, size = self.create(stack=struct.pack('<if', 1, 42.5))
        vm.step(Report())

        self.assertEqual(vm.TH, 42)
        self.assertEqual(vm.offset, size)
示例#10
0
    def test_constaddr_reg(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_INT))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))

        vm, size = self.create(stack=struct.pack('<ii', 1, 2))
        vm.TH = 42
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ii', 1, 2 + 42))
        self.assertEqual(vm.offset, size)
示例#11
0
    def test_report_constaddr(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 9,
                                     Opcodes.ADDR_VALTYPE_INT))

        vm, size = self.create(stack=struct.pack('<iibii', 1, 2, 3, 42, 13))
        report = Report(L2Value=9)
        vm.step(report)

        self.assertEqual(report.L2Value, 9 + 42)
        self.assertEqual(vm.offset, size)
示例#12
0
    def test_constaddr_report_float(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_FLOAT))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUX))

        vm, size = self.create(stack=struct.pack('<if', 1, 2.0))
        report = Report(IMUX=42.5)
        vm.step(report)

        self.assertEqual(vm.get_stack(), struct.pack('<if', 1, 2.0 + 42.5))
        self.assertEqual(vm.offset, size)
示例#13
0
    def test_regoff_float_regoff_int(self):
        self.add_opcode()
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_FLOAT))
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 8,
                                     Opcodes.ADDR_VALTYPE_INT))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 42.5, 13))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 13.0, 13))
        self.assertEqual(vm.offset, size)
示例#14
0
    def test_regoff_constaddr_float(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_FLOAT))
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_FLOAT))

        vm, size = self.create(stack=struct.pack('<iffi', 1, 2.5, 3.5, 4))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<iffi', 1, 2.5, 6.0, 4))
        self.assertEqual(vm.offset, size)
示例#15
0
 def test_positive_int(self):
     value, = struct.unpack(
         '>H',
         Opcodes.make_addr_regoff(Opcodes.REGINDEX_TH, 42,
                                  Opcodes.ADDR_VALTYPE_INT))
     self.assertEqual(value, (Opcodes.ADDR_TYPE_REGOFF << 14) |
                      (Opcodes.REGINDEX_TH << 12) |
                      (Opcodes.ADDR_VALTYPE_INT << 11) | 42)
示例#16
0
 def test_negative_float(self):
     value, = struct.unpack(
         '>H',
         Opcodes.make_addr_regoff(Opcodes.REGINDEX_TH, -42,
                                  Opcodes.ADDR_VALTYPE_FLOAT))
     self.assertEqual(value, (Opcodes.ADDR_TYPE_REGOFF << 14) |
                      (Opcodes.REGINDEX_TH << 12) |
                      (Opcodes.ADDR_VALTYPE_FLOAT << 11) | (1 << 10) | 42)
示例#17
0
    def test_push_report_int(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))

        vm, size = self.create(stack=struct.pack('<i', 1))
        vm.step(Report(L2Value=13))

        self.assertEqual(vm.get_stack(), struct.pack('<ii', 1, 13))
        self.assertEqual(vm.offset, size)
示例#18
0
    def test_push_report_float(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUY))

        vm, size = self.create(stack=struct.pack('<i', 1))
        vm.step(Report(IMUY=13.5))

        self.assertEqual(vm.get_stack(), struct.pack('<if', 1, 13.5))
        self.assertEqual(vm.offset, size)
示例#19
0
    def test_not_reg_true(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))

        vm, size = self.create()
        vm.TH = 42
        vm.step(Report())

        self.assertEqual(vm.TH, 0)
        self.assertEqual(vm.offset, size)
示例#20
0
    def test_reg_C(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_C)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP))
        self.add(struct.pack('<i', 42))

        vm, size = self.create(stack=b'\x00\x00')
        vm.step(Report())

        self.assertEqual(vm.SP, 44)
        self.assertEqual(vm.offset, size)
示例#21
0
    def test_push_reg(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))

        vm, size = self.create(stack=struct.pack('<i', 1))
        vm.TH = 42
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ii', 1, 42))
        self.assertEqual(vm.offset, size)
示例#22
0
    def test_jz_report_false(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ,
                        variant=Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))
        self.add(struct.pack('<H', 42))

        vm, size = self.create()
        ret = vm.step(Report(L2Value=1))

        self.assertEqual(vm.offset, size)
        self.assertFalse(ret)
示例#23
0
    def test_report_C(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_C)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))
        self.add(struct.pack('<i', 42))

        vm, size = self.create()
        report = Report(L2Value=9)
        vm.step(report)

        self.assertEqual(report.L2Value, 9 + 42)
        self.assertEqual(vm.offset, size)
示例#24
0
    def test_not_constaddr_float_false(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_FLOAT))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 0.0, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 1.0, 3))
        self.assertEqual(vm.offset, size)
示例#25
0
    def test_push_report_constaddr_int(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_INT))

        vm, size = self.create(stack=struct.pack('<iii', 1, 42, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<iiii', 1, 42, 3, 42))
        self.assertEqual(vm.offset, size)
示例#26
0
    def test_not_regoff_int_false(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_INT))

        vm, size = self.create(stack=struct.pack('<iii', 1, 0, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<iii', 1, 1, 3))
        self.assertEqual(vm.offset, size)
示例#27
0
    def test_neg_regoff_float(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NEG)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_FLOAT))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 2.5, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, -2.5, 3))
        self.assertEqual(vm.offset, size)
示例#28
0
    def test_jz_reg_true(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ,
                        variant=Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))
        self.add(struct.pack('<H', 42))

        vm, size = self.create()
        vm.TH = 0
        ret = vm.step(Report())

        self.assertEqual(vm.offset, 42)
        self.assertFalse(ret)
示例#29
0
    def test_push_report_regoff_float(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_FLOAT))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 42.5, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ifif', 1, 42.5, 3,
                                                     42.5))
        self.assertEqual(vm.offset, size)
示例#30
0
    def test_jz_regoff_float_false(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ,
                        variant=Opcodes.OPCODE_VARIANT_A)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_FLOAT))
        self.add(struct.pack('<H', 42))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 1.0, 1))
        ret = vm.step(Report())

        self.assertEqual(vm.offset, size)
        self.assertFalse(ret)