#!/usr/bin/env python3 # Automatically formatted with yapf (https://github.com/google/yapf) # Fake 'opt' program that can be made to crash on request. For testing # the 'reduce_pipeline.py' automatic 'opt' NPM pipeline reducer. import argparse import os import shutil import signal parser = argparse.ArgumentParser() parser.add_argument('-passes', action='store', dest='passes', required=True) parser.add_argument('-print-pipeline-passes', dest='print_pipeline_passes', action='store_true') parser.add_argument('-crash-seq', action='store', dest='crash_seq', required=True) parser.add_argument('-o', action='store', dest='output') parser.add_argument('input') [args, unknown_args] = parser.parse_known_args() # Expand pipeline if '-print-pipeline-passes'. if args.print_pipeline_passes: if args.passes == 'EXPAND_a_to_f': print('a,b,c,d,e,f') else: print(args.passes) exit(0) # Parse '-crash-seq'. crash_seq = [] tok = '' for c in args.crash_seq: if c == ',': if tok != '': crash_seq.append(tok) tok = '' else: tok += c if tok != '': crash_seq.append(tok) print(crash_seq) # Parse '-passes' and see if we need to crash. tok = '' for c in args.passes: if c == ',': if len(crash_seq) > 0 and crash_seq[0] == tok: crash_seq.pop(0) tok = '' elif c == '(': tok = '' elif c == ')': if len(crash_seq) > 0 and crash_seq[0] == tok: crash_seq.pop(0) tok = '' else: tok += c if len(crash_seq) > 0 and crash_seq[0] == tok: crash_seq.pop(0) # Copy input to output. if args.output: shutil.copy(args.input, args.output) # Crash if all 'crash_seq' passes occured in right order. if len(crash_seq) == 0: print('crash') os.kill(os.getpid(), signal.SIGKILL) else: print('no crash') exit(0)