17db96d56Sopenharmony_ciimport dis 27db96d56Sopenharmony_cifrom test.support.import_helper import import_module 37db96d56Sopenharmony_ciimport unittest 47db96d56Sopenharmony_ciimport opcode 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci_opcode = import_module("_opcode") 77db96d56Sopenharmony_cifrom _opcode import stack_effect 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ciclass OpcodeTests(unittest.TestCase): 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci def test_stack_effect(self): 137db96d56Sopenharmony_ci self.assertEqual(stack_effect(dis.opmap['POP_TOP']), -1) 147db96d56Sopenharmony_ci self.assertEqual(stack_effect(dis.opmap['BUILD_SLICE'], 0), -1) 157db96d56Sopenharmony_ci self.assertEqual(stack_effect(dis.opmap['BUILD_SLICE'], 1), -1) 167db96d56Sopenharmony_ci self.assertEqual(stack_effect(dis.opmap['BUILD_SLICE'], 3), -2) 177db96d56Sopenharmony_ci self.assertRaises(ValueError, stack_effect, 30000) 187db96d56Sopenharmony_ci self.assertRaises(ValueError, stack_effect, dis.opmap['BUILD_SLICE']) 197db96d56Sopenharmony_ci self.assertRaises(ValueError, stack_effect, dis.opmap['POP_TOP'], 0) 207db96d56Sopenharmony_ci # All defined opcodes 217db96d56Sopenharmony_ci for name, code in filter(lambda item: item[0] not in dis.deoptmap, dis.opmap.items()): 227db96d56Sopenharmony_ci with self.subTest(opname=name): 237db96d56Sopenharmony_ci if code < dis.HAVE_ARGUMENT: 247db96d56Sopenharmony_ci stack_effect(code) 257db96d56Sopenharmony_ci self.assertRaises(ValueError, stack_effect, code, 0) 267db96d56Sopenharmony_ci else: 277db96d56Sopenharmony_ci stack_effect(code, 0) 287db96d56Sopenharmony_ci self.assertRaises(ValueError, stack_effect, code) 297db96d56Sopenharmony_ci # All not defined opcodes 307db96d56Sopenharmony_ci for code in set(range(256)) - set(dis.opmap.values()): 317db96d56Sopenharmony_ci with self.subTest(opcode=code): 327db96d56Sopenharmony_ci self.assertRaises(ValueError, stack_effect, code) 337db96d56Sopenharmony_ci self.assertRaises(ValueError, stack_effect, code, 0) 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci def test_stack_effect_jump(self): 367db96d56Sopenharmony_ci JUMP_IF_TRUE_OR_POP = dis.opmap['JUMP_IF_TRUE_OR_POP'] 377db96d56Sopenharmony_ci self.assertEqual(stack_effect(JUMP_IF_TRUE_OR_POP, 0), 0) 387db96d56Sopenharmony_ci self.assertEqual(stack_effect(JUMP_IF_TRUE_OR_POP, 0, jump=True), 0) 397db96d56Sopenharmony_ci self.assertEqual(stack_effect(JUMP_IF_TRUE_OR_POP, 0, jump=False), -1) 407db96d56Sopenharmony_ci FOR_ITER = dis.opmap['FOR_ITER'] 417db96d56Sopenharmony_ci self.assertEqual(stack_effect(FOR_ITER, 0), 1) 427db96d56Sopenharmony_ci self.assertEqual(stack_effect(FOR_ITER, 0, jump=True), -1) 437db96d56Sopenharmony_ci self.assertEqual(stack_effect(FOR_ITER, 0, jump=False), 1) 447db96d56Sopenharmony_ci JUMP_FORWARD = dis.opmap['JUMP_FORWARD'] 457db96d56Sopenharmony_ci self.assertEqual(stack_effect(JUMP_FORWARD, 0), 0) 467db96d56Sopenharmony_ci self.assertEqual(stack_effect(JUMP_FORWARD, 0, jump=True), 0) 477db96d56Sopenharmony_ci self.assertEqual(stack_effect(JUMP_FORWARD, 0, jump=False), 0) 487db96d56Sopenharmony_ci # All defined opcodes 497db96d56Sopenharmony_ci has_jump = dis.hasjabs + dis.hasjrel 507db96d56Sopenharmony_ci for name, code in filter(lambda item: item[0] not in dis.deoptmap, dis.opmap.items()): 517db96d56Sopenharmony_ci with self.subTest(opname=name): 527db96d56Sopenharmony_ci if code < dis.HAVE_ARGUMENT: 537db96d56Sopenharmony_ci common = stack_effect(code) 547db96d56Sopenharmony_ci jump = stack_effect(code, jump=True) 557db96d56Sopenharmony_ci nojump = stack_effect(code, jump=False) 567db96d56Sopenharmony_ci else: 577db96d56Sopenharmony_ci common = stack_effect(code, 0) 587db96d56Sopenharmony_ci jump = stack_effect(code, 0, jump=True) 597db96d56Sopenharmony_ci nojump = stack_effect(code, 0, jump=False) 607db96d56Sopenharmony_ci if code in has_jump: 617db96d56Sopenharmony_ci self.assertEqual(common, max(jump, nojump)) 627db96d56Sopenharmony_ci else: 637db96d56Sopenharmony_ci self.assertEqual(jump, common) 647db96d56Sopenharmony_ci self.assertEqual(nojump, common) 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ciclass SpecializationStatsTests(unittest.TestCase): 687db96d56Sopenharmony_ci def test_specialization_stats(self): 697db96d56Sopenharmony_ci stat_names = opcode._specialization_stats 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci specialized_opcodes = [ 727db96d56Sopenharmony_ci op[:-len("_ADAPTIVE")].lower() for 737db96d56Sopenharmony_ci op in opcode._specialized_instructions 747db96d56Sopenharmony_ci if op.endswith("_ADAPTIVE")] 757db96d56Sopenharmony_ci self.assertIn('load_attr', specialized_opcodes) 767db96d56Sopenharmony_ci self.assertIn('binary_subscr', specialized_opcodes) 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci stats = _opcode.get_specialization_stats() 797db96d56Sopenharmony_ci if stats is not None: 807db96d56Sopenharmony_ci self.assertIsInstance(stats, dict) 817db96d56Sopenharmony_ci self.assertCountEqual(stats.keys(), specialized_opcodes) 827db96d56Sopenharmony_ci self.assertCountEqual( 837db96d56Sopenharmony_ci stats['load_attr'].keys(), 847db96d56Sopenharmony_ci stat_names + ['failure_kinds']) 857db96d56Sopenharmony_ci for sn in stat_names: 867db96d56Sopenharmony_ci self.assertIsInstance(stats['load_attr'][sn], int) 877db96d56Sopenharmony_ci self.assertIsInstance( 887db96d56Sopenharmony_ci stats['load_attr']['failure_kinds'], 897db96d56Sopenharmony_ci tuple) 907db96d56Sopenharmony_ci for v in stats['load_attr']['failure_kinds']: 917db96d56Sopenharmony_ci self.assertIsInstance(v, int) 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ciif __name__ == "__main__": 957db96d56Sopenharmony_ci unittest.main() 96