def test_lload_0(self): m = OpCodes() m._lva.append(0) m._lva.append(1) m.interpret(0x1e) self.assertEqual(m._op_stack.pop(), 1) self.assertEqual(m._op_stack.pop(), 0)
def run_opcodes(self): """ Runs the opcodes in this file """ ops = OpCodes() table_index = 0 code_index = 0 while table_index < len(self.attribute_table): while code_index < len(self.attribute_table[table_index].code): value = self.attribute_table[table_index].code[code_index] if value in (54, 21, 0x17): code_index += 1 ops.interpret( value, [self.attribute_table[table_index].code[code_index]]) elif value == 0x12: code_index += 1 ops.interpret(value, [self.attribute_table[table_index].code[code_index]], \ self.c_pool_table) elif value in (0xb6, 0xb2): code_index += 2 ops.interpret(value, [self.attribute_table[table_index].code[code_index-1], \ self.attribute_table[table_index].code[code_index]], self.c_pool_table) else: ops.interpret(value) code_index += 1 table_index += 1 return ops
def test_lneg(self): m = OpCodes() m._op_stack.append(0) m._op_stack.append(1) m.interpret(0x75) self.assertEqual(m._op_stack.pop(), -1) self.assertEqual(m._op_stack.pop(), -1)
def test_getstatic(self): m = OpCodes() const_info = ConstantInfo() const_info.tag = 1 const_info.info = [70, 111, 111] imp_info = m.interpret(0xb2, [0, 0], [const_info]) assert isinstance(imp_info, str)
def test_ldc(self): m = OpCodes() str1 = ConstantInfo() str1.tag = 1 str1.info = [72, 101, 108, 108, 111] m.interpret(0x12, [0], [str1]) self.assertEqual(m._op_stack.pop(), "Hello")
def test_fload_2(self): m = OpCodes() m._lva.append(0.0) m._lva.append(1.0) m._lva.append(2.0) m.interpret(0x24) self.assertEqual(m._op_stack.pop(), np.float32(2.0))
def test_iload_2(self): m = OpCodes() m._lva.append(0) m._lva.append(1) m._lva.append(2) m.interpret(0x1c) self.assertEqual(m._op_stack.pop(), 2)
def test_idiv(self): m = OpCodes() m._op_stack.append(6) m._op_stack.append(3) m.interpret(0x6c) self.assertEqual(m._op_stack.pop(), 2) m._op_stack.append(6) m._op_stack.append(0) self.assertEqual(m.interpret(0x6c), 'Error: Divides by Zero')
def test_irem(self): m = OpCodes() m._op_stack.append(7) m._op_stack.append(3) m.interpret(0x70) self.assertEqual(m._op_stack.pop(), 1) m._op_stack.append(7) m._op_stack.append(0) self.assertEqual(m.interpret(0x70), 'Error: Divides by Zero')
def test_lrem(self): m = OpCodes() m._op_stack.append(0) m._op_stack.append(7) m._op_stack.append(0) m._op_stack.append(3) m.interpret(0x71) self.assertEqual(m._op_stack.pop(), 1) self.assertEqual(m._op_stack.pop(), 0)
def test_iload(self): m = OpCodes() m._lva.append(0) m._lva.append(1) m._lva.append(2) m._lva.append(3) m._lva.append(4) m.interpret(0x15, [4]) self.assertEqual(m._op_stack.pop(), 4)
def test_land(self): m = OpCodes() m._op_stack.append(0) m._op_stack.append(1) m._op_stack.append(0) m._op_stack.append(1) m.interpret(0x7f) self.assertEqual(m._op_stack.pop(), 1) self.assertEqual(m._op_stack.pop(), 0)
def test_lxor(self): m = OpCodes() m._op_stack.append(0) m._op_stack.append(1) m._op_stack.append(0) m._op_stack.append(2) m.interpret(0x83) self.assertEqual(m._op_stack.pop(), 3) self.assertEqual(m._op_stack.pop(), 0)
def test_ldiv(self): m = OpCodes() m._op_stack.append(0) m._op_stack.append(6) m._op_stack.append(0) m._op_stack.append(3) m.interpret(0x6d) self.assertEqual(m._op_stack.pop(), 2) self.assertEqual(m._op_stack.pop(), 0)
def test_fload(self): m = OpCodes() m._lva.append(0.0) m._lva.append(1.0) m._lva.append(2.0) m._lva.append(3.0) m._lva.append(4.0) m.interpret(0x17, [4]) self.assertEqual(m._op_stack.pop(), 4)
def test_lmul(self): m = OpCodes() m._op_stack.append(0) m._op_stack.append(3) m._op_stack.append(0) m._op_stack.append(2) m.interpret(0x69) self.assertEqual(m._op_stack.pop(), 6) self.assertEqual(m._op_stack.pop(), 0)
def test_frem(self): m = OpCodes() m._op_stack.append(np.float32(3.0)) m._op_stack.append(np.float32(2.0)) m.interpret(0x72) self.assertEqual(m._op_stack.pop(), np.float32(1.0)) m._op_stack.append(np.float32(5.0)) m._op_stack.append(np.float32(0.0)) self.assertEqual(m.interpret(0x72), 'Error: Divides by Zero')
def test_get_str_from_cpool(self): methrefobj = ConstantInfo() methrefobj.tag = 10 methrefobj.info = [0, 2, 0, 3] classobj = ConstantInfo() classobj.tag = 7 classobj.info = [0, 4] nameandtypeobj = ConstantInfo() nameandtypeobj.tag = 12 nameandtypeobj.info = [0, 5, 0, 6] str1 = ConstantInfo() str1.tag = 1 str1.info = [0x41] str2 = ConstantInfo() str2.tag = 1 str2.info = [0x42] str3 = ConstantInfo() str3.tag = 1 str3.info = [0x43] c = [methrefobj, classobj, nameandtypeobj, str1, str2, str3] m = OpCodes() self.assertEqual(m._get_str_from_cpool(0, c), 'A.B:C')
def test_istore_0(self): m = OpCodes() m._op_stack.append(0) m.interpret(0x3b) self.assertEqual(m._lva[0], 0) m._op_stack.append(1) m.interpret(0x3b) self.assertEqual(m._lva[0], 1)
def test_fstore_0(self): m = OpCodes() m._op_stack.append(1.0) m.interpret(0x43) self.assertEqual(m._lva[0], 1.0) m._op_stack.append(2.0) m.interpret(0x43) self.assertEqual(m._lva[0], 2.0)
def test_istore_1(self): m = OpCodes() m._lva.append(0) m._op_stack.append(1) m.interpret(0x3c) self.assertEqual(m._lva[1], 1) m._op_stack.append(2) m.interpret(0x3c) self.assertEqual(m._lva[1], 2)
def test_lushr(self): m = OpCodes() m._op_stack.append(23) # Testing for positive logical shift right m._op_stack.append(1) m.interpret(0x7d) self.assertEqual(m._op_stack.pop(), 11) m._op_stack.append(-5) # Testing for negative logical shift right m._op_stack.append(3) m.interpret(0x7d) self.assertEqual(m._op_stack.pop(), 2305843009213693951)
def test_iushr(self): m = OpCodes() m._op_stack.append(23) # Testing for positive logical shift right m._op_stack.append(1) m.interpret(0x7c) self.assertEqual(m._op_stack.pop(), 11) m._op_stack.append(-5) # Testing for negative logical shift right m._op_stack.append(3) m.interpret(0x7c) self.assertEqual(m._op_stack.pop(), 536870911)
def test_istore_2(self): m = OpCodes() m._lva.append(0) m._lva.append(1) m._op_stack.append(2) m.interpret(0x3d) self.assertEqual(m._lva[2], 2) m._op_stack.append(3) m.interpret(0x3d) self.assertEqual(m._lva[2], 3)
def test_fstore_2(self): m = OpCodes() m._lva.append(0.0) m._lva.append(1.0) m._op_stack.append(2.0) m.interpret(0x45) self.assertEqual(m._lva[2], 2.0) m._op_stack.append(3.0) m.interpret(0x45) self.assertEqual(m._lva[2], 3.0)
def test_fstore_3(self): m = OpCodes() m._lva.append(0.0) m._lva.append(1.0) m._lva.append(2.0) m._op_stack.append(3.0) m.interpret(0x46) self.assertEqual(m._lva[3], 3.0) m._op_stack.append(4.0) m.interpret(0x46) self.assertEqual(m._lva[3], 4.0)
def test_istore_3(self): m = OpCodes() m._lva.append(0) m._lva.append(1) m._lva.append(2) m._op_stack.append(3) m.interpret(0x3e) self.assertEqual(m._lva[3], 3) m._op_stack.append(4) m.interpret(0x3e) self.assertEqual(m._lva[3], 4)
def test_fstore(self): m = OpCodes() m._lva.append(0.0) m._lva.append(1.0) m._lva.append(2.0) m._lva.append(3.0) m._op_stack.append(4.0) m.interpret(0x38, [4]) self.assertEqual(m._lva[4], 4.0) m._op_stack.append(5.0) m.interpret(0x38, [4]) self.assertEqual(m._lva[4], 5.0)
def test_istore(self): m = OpCodes() m._lva.append(0) m._lva.append(1) m._lva.append(2) m._lva.append(3) m._op_stack.append(4) m.interpret(0x36, [4]) self.assertEqual(m._lva[4], 4) m._op_stack.append(5) m.interpret(0x36, [4]) self.assertEqual(m._lva[4], 5)
def test_invokevirtual(self, mock_print): methrefobj = ConstantInfo() methrefobj.tag = 10 methrefobj.info = [0, 2, 0, 3] classobj = ConstantInfo() classobj.tag = 7 classobj.info = [0, 4] nameandtypeobj = ConstantInfo() nameandtypeobj.tag = 12 nameandtypeobj.info = [0, 5, 0, 6] str1 = ConstantInfo() str1.tag = 1 str1.info = [106, 97, 118, 97, 47, 105, 111, 47, 80, 114, 105, 110, 116, 83, 116, 114, 101, 97, 109] str2 = ConstantInfo() str2.tag = 1 str2.info = [112, 114, 105, 110, 116, 108, 110] str3 = ConstantInfo() str3.tag = 1 str3.info = [40, 73, 41, 86] c = [methrefobj, classobj, nameandtypeobj, str1, str2, str3] m = OpCodes() m._op_stack.append(5) m.interpret(0xb6, [0, 1], c) str1.info = [106, 97, 118, 97, 47, 105, 111, 47, 80, 114, 105, 110, 116, 83, 116, 114, 101, 97, 109] str2.info = [112, 114, 105, 110, 116, 108, 110] str3.info = [40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86] c = [methrefobj, classobj, nameandtypeobj, str1, str2, str3] m._op_stack.append("Hello World!") m.interpret(0xb6, [0, 1], c) self.assertEqual(mock_print.mock_calls, [ call(5), call('Hello World!') ]) with patch('builtins.input', return_value='5'): str1.info = [110, 101, 120, 116, 73, 110, 116, 58, 40, 41, 73] str2.info = [106, 97, 118, 97, 47, 117, 116, 105, 108, 47, 83, 99, 97, 110, 110, 101, 114] c = [methrefobj, classobj, str1, str2] m.interpret(0xb6, [0, 1], c) m._op_stack.append(5) self.assertEqual(m._op_stack.pop(), 5)