示例#1
0
 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)
示例#2
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
示例#3
0
 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)
示例#4
0
 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)
示例#5
0
 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")
示例#6
0
 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))
示例#7
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)
示例#8
0
 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')
示例#9
0
 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')
示例#10
0
 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)
示例#11
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)
示例#12
0
 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)
示例#13
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)
示例#14
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)
示例#15
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)
示例#16
0
 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)
示例#17
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')
示例#18
0
 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')
示例#19
0
 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)
示例#20
0
 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)
示例#21
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)
示例#22
0
 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)
示例#23
0
 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)
示例#24
0
 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)
示例#25
0
 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)
示例#26
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)
示例#27
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)
示例#28
0
 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)
示例#29
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)
示例#30
0
 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)