diff --git a/revelation/argument_parser.py b/revelation/argument_parser.py index 507744f..494b91a 100644 --- a/revelation/argument_parser.py +++ b/revelation/argument_parser.py @@ -31,6 +31,11 @@ """ +class DoNotInterpretError(Exception): + def __init__(self): + pass + + def cli_parser(argv, simulator, debug_enabled): filename_index = 0 debug_flags = [] @@ -52,7 +57,7 @@ def cli_parser(argv, simulator, debug_enabled): if token == '--help' or token == '-h': print (USAGE_TEXT % (simulator.arch_name, argv[0], argv[0], argv[0], argv[0], argv[0])) - raise SystemExit + raise DoNotInterpretError elif token == '--time' or token == '-t': simulator.collect_times = True elif token == '--debug' or token == '-d': @@ -65,7 +70,7 @@ def cli_parser(argv, simulator, debug_enabled): prev_token = token elif token[:1] == '-': print 'Unknown argument %s' % token - raise SystemExit + raise SyntaxError else: filename_index = index + 1 break @@ -79,7 +84,7 @@ def cli_parser(argv, simulator, debug_enabled): simulator.user_environment = True else: print ('--env can be OPERATING or USER.') - raise SystemExit + raise ValueError elif prev_token == '--ext-base' or prev_token == '-b': simulator.ext_base =int(token, 16) elif prev_token == '--cols' or prev_token == '-c': @@ -99,5 +104,5 @@ def cli_parser(argv, simulator, debug_enabled): prev_token = '' if filename_index == 0: print 'You must supply a file name' - raise SystemExit + raise SyntaxError return argv[filename_index], jit, debug_flags diff --git a/revelation/sim.py b/revelation/sim.py index ff5cea1..27be264 100644 --- a/revelation/sim.py +++ b/revelation/sim.py @@ -3,7 +3,7 @@ from pydgin.misc import FatalError from pydgin.sim import Sim, init_sim -from revelation.argument_parser import cli_parser +from revelation.argument_parser import cli_parser, DoNotInterpretError from revelation.elf_loader import load_program from revelation.instruction import Instruction from revelation.isa import decode, reg_map @@ -83,7 +83,12 @@ def get_entry_point(self): def entry_point(argv): if self.jit_enabled: set_param(self.jitdriver, 'trace_limit', self.default_trace_limit) - fname, jit, flags = cli_parser(argv, self, Debug.global_enabled) + try: + fname, jit, flags = cli_parser(argv, self, Debug.global_enabled) + except DoNotInterpretError: # CLI option such as --help or -h. + return 0 + except (SyntaxError, ValueError): + return 1 if jit: # pragma: no cover set_user_param(self.jitdriver, jit) self.debug = Debug(flags, 0) @@ -91,7 +96,7 @@ def entry_point(argv): elf_file = open(fname, 'rb') except IOError: print 'Could not open file %s' % fname - raise SystemExit + return 1 self.init_state(elf_file, fname, False) for state in self.states: # FIXME: Interleaved log. self.debug.set_state(state) diff --git a/revelation/test/test_argument_parser.py b/revelation/test/test_argument_parser.py index 3fd9a9d..a960065 100644 --- a/revelation/test/test_argument_parser.py +++ b/revelation/test/test_argument_parser.py @@ -1,4 +1,4 @@ -from revelation.argument_parser import USAGE_TEXT +from revelation.argument_parser import USAGE_TEXT, DoNotInterpretError from revelation.sim import Revelation import os.path @@ -89,8 +89,7 @@ def test_argv_flags_with_no_args(argv, capfd): def test_argv_with_errors(argv, expected, capfd): revelation = Revelation() entry_point = revelation.get_entry_point() - with pytest.raises(SystemExit): - entry_point(argv) + entry_point(argv) out, err = capfd.readouterr() assert err == '' assert out == expected @@ -102,8 +101,7 @@ def test_argv_help(argv, capfd): expected = (USAGE_TEXT % ('revelation', 'sim.py', 'sim.py', 'sim.py', 'sim.py', 'sim.py') + '\n') entry_point = revelation.get_entry_point() - with pytest.raises(SystemExit): - entry_point(argv) + entry_point(argv) out, err = capfd.readouterr() assert err == '' assert out == expected