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