11364750dSJames Henderson# DExTer : Debugging Experience Tester
21364750dSJames Henderson# ~~~~~~   ~         ~~         ~   ~~
31364750dSJames Henderson#
41364750dSJames Henderson# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
51364750dSJames Henderson# See https://llvm.org/LICENSE.txt for license information.
61364750dSJames Henderson# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
71364750dSJames Henderson
81364750dSJames Hendersonimport os
91364750dSJames Hendersonfrom itertools import chain
101364750dSJames Henderson
111364750dSJames Hendersondef in_source_file(source_files, step_info):
121364750dSJames Henderson    if not step_info.current_frame:
131364750dSJames Henderson        return False
141364750dSJames Henderson    if not step_info.current_location.path:
151364750dSJames Henderson        return False
161364750dSJames Henderson    if not os.path.exists(step_info.current_location.path):
171364750dSJames Henderson        return False
181364750dSJames Henderson    return any(os.path.samefile(step_info.current_location.path, f) \
191364750dSJames Henderson               for f in source_files)
201364750dSJames Henderson
21*0f92c113SJeremy Morsedef have_hit_line(watch, loc):
22*0f92c113SJeremy Morse  if hasattr(watch, '_on_line'):
23*0f92c113SJeremy Morse    return watch._on_line == loc.lineno
24*0f92c113SJeremy Morse  elif hasattr(watch, '_from_line'):
25*0f92c113SJeremy Morse    return watch._from_line <= loc.lineno and watch._to_line >= loc.lineno
26*0f92c113SJeremy Morse  elif watch.lineno == loc.lineno:
27*0f92c113SJeremy Morse    return True
28*0f92c113SJeremy Morse  return False
29*0f92c113SJeremy Morse
301364750dSJames Hendersondef update_step_watches(step_info, watches, commands):
311364750dSJames Henderson    watch_cmds = ['DexUnreachable', 'DexExpectStepOrder']
321364750dSJames Henderson    towatch = chain.from_iterable(commands[x]
331364750dSJames Henderson                                  for x in watch_cmds
341364750dSJames Henderson                                  if x in commands)
351364750dSJames Henderson    try:
361364750dSJames Henderson        # Iterate over all watches of the types named in watch_cmds
371364750dSJames Henderson        for watch in towatch:
381364750dSJames Henderson            loc = step_info.current_location
391364750dSJames Henderson            if (loc.path != None
401364750dSJames Henderson                    and os.path.exists(loc.path)
411364750dSJames Henderson                    and os.path.samefile(watch.path, loc.path)
42*0f92c113SJeremy Morse                    and have_hit_line(watch, loc)):
431364750dSJames Henderson                result = watch.eval(step_info)
441364750dSJames Henderson                step_info.watches.update(result)
451364750dSJames Henderson                break
461364750dSJames Henderson    except KeyError:
471364750dSJames Henderson        pass
48