Exemple #1
0
def execute(stacksize, bytecode):
    vm = VM(bytecode=bytecode, stacksize=stacksize)
    while True:
        disasm_one(bytecode, vm.offset)
        print('Stack: %s' % vm.get_stack())
        input('...')
        vm.step(Report())
Exemple #2
0
    def test_yield(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_YIELD)

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

        self.assertEqual(vm.offset, size)
        self.assertTrue(ret)
Exemple #3
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)
Exemple #4
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)
Exemple #5
0
    def test_call(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_CALL)
        self.add(struct.pack('<H', 42))

        vm, size = self.create(stacksize=2)
        vm.step(Report())

        self.assertEqual(vm.offset, 42)
        self.assertEqual(vm.get_stack(), struct.pack('<H', 3))
Exemple #6
0
    def test_ret(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_RET)

        vm, size = self.create(stack=struct.pack('<H', 42))
        ret = vm.step(Report())

        self.assertEqual(vm.offset, 42)
        self.assertEqual(vm.get_stack(), b'')
        self.assertFalse(ret)
Exemple #7
0
    def test_jump(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JUMP)
        self.add(struct.pack('<H', 42))

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

        self.assertEqual(vm.offset, 42)
        self.assertFalse(ret)
Exemple #8
0
    def test_pushf(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSHF)
        self.add(struct.pack('<f', 42.5))

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

        self.assertEqual(vm.get_stack(), struct.pack('<if', 1, 42.5))
        self.assertEqual(vm.offset, size)
Exemple #9
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)
Exemple #10
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)
Exemple #11
0
    def test_jz_C_float_true(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ,
                        variant=Opcodes.OPCODE_VARIANT_CF)
        self.add(struct.pack('<fH', 0.0, 42))

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

        self.assertEqual(vm.offset, 42)
        self.assertFalse(ret)
Exemple #12
0
    def test_jz_C_int_false(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ,
                        variant=Opcodes.OPCODE_VARIANT_CI)
        self.add(struct.pack('<iH', 1, 42))

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

        self.assertEqual(vm.offset, size)
        self.assertFalse(ret)
Exemple #13
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)
Exemple #14
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)
Exemple #15
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)
Exemple #16
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)
Exemple #17
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)
Exemple #18
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)
Exemple #19
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)
Exemple #20
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)
Exemple #21
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)
Exemple #22
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)
Exemple #23
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)
Exemple #24
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)
Exemple #25
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)
Exemple #26
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)
Exemple #27
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)
Exemple #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)
Exemple #29
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)
Exemple #30
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)