@@ -335,6 +335,42 @@ def test_load_classderef(self):
335335 self .assertEqual (
336336 code .co_code , b'\x94 \x01 \x89 \x01 ' if WORDCODE else b'\x94 \x01 \x00 \x89 \x01 \x00 ' )
337337
338+ def test_offset_index (self ):
339+ concrete = ConcreteBytecode ()
340+ concrete [:] = [
341+ ConcreteInstr ('LOAD_FAST' , 0 ),
342+ ConcreteInstr ('LOAD_FAST' , 1 ),
343+ SetLineno (2 ),
344+ ConcreteInstr ('BINARY_ADD' ),
345+ ConcreteInstr ('RETURN_VALUE' )
346+ ]
347+ # simple cases
348+ self .assertEqual (concrete .index_at_code_offset (0 ), 0 )
349+ self .assertEqual (concrete .instr_at_code_offset (0 ), concrete [0 ])
350+ self .assertEqual (concrete .index_at_code_offset (3 ), 1 )
351+ self .assertEqual (concrete .instr_at_code_offset (3 ), concrete [1 ])
352+ self .assertEqual (concrete .index_at_code_offset (7 ), 4 )
353+ self .assertEqual (concrete .instr_at_code_offset (7 ), concrete [4 ])
354+
355+ # these indices are deliberately different
356+ # the index returns the lower bound, the SetLineno
357+ # the instruction returns the actual instruction
358+ self .assertEqual (concrete .index_at_code_offset (6 ), 2 )
359+ self .assertEqual (concrete .instr_at_code_offset (6 ), concrete [3 ])
360+
361+ # asking for the index at the end is OK, but not the instruction
362+ self .assertEqual (concrete .index_at_code_offset (8 ), 5 )
363+ self .assertRaisesRegex (IndexError , 'out of range' , concrete .instr_at_code_offset , 8 )
364+
365+ # other disallowed things
366+ self .assertRaisesRegex (IndexError , 'within' , concrete .instr_at_code_offset , 1 )
367+ self .assertRaisesRegex (IndexError , 'within' , concrete .instr_at_code_offset , 1 )
368+ self .assertRaisesRegex (IndexError , 'within' , concrete .index_at_code_offset , 5 )
369+ self .assertRaisesRegex (IndexError , 'within' , concrete .instr_at_code_offset , 5 )
370+ self .assertRaisesRegex (IndexError , 'out of range' , concrete .index_at_code_offset , - 1 )
371+ self .assertRaisesRegex (IndexError , 'out of range' , concrete .instr_at_code_offset , - 1 )
372+ self .assertRaisesRegex (IndexError , 'out of range' , concrete .index_at_code_offset , 9 )
373+ self .assertRaisesRegex (IndexError , 'out of range' , concrete .instr_at_code_offset , 9 )
338374
339375class ConcreteFromCodeTests (TestCase ):
340376
0 commit comments