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())
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)
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)
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)
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))
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)