|
13 | 13 | # Backport for pre Python 3.2
|
14 | 14 | from distutils.spawn import find_executable as which
|
15 | 15 |
|
| 16 | +# should not need this outside of this class |
| 17 | +_warning_buffer = [] |
| 18 | +_buffer_warnings = True |
| 19 | +def flush_warnings(): |
| 20 | + for warning in _warning_buffer: |
| 21 | + sys.stderr.write('Warning: ') |
| 22 | + sys.stderr.write(warning) |
| 23 | + sys.stderr.write('\n') |
| 24 | + _warning_buffer.clear() |
| 25 | +def set_buffer_warnings(buffer_warnings): |
| 26 | + global _buffer_warnings |
| 27 | + _buffer_warnings = buffer_warnings |
| 28 | + |
| 29 | +def should_buffer_warnings(): |
| 30 | + return _buffer_warnings and not ignore_errors |
16 | 31 |
|
17 | 32 | def warning(msg):
|
18 | 33 | if not os.environ.get('CHPLENV_SUPPRESS_WARNINGS'):
|
19 |
| - sys.stderr.write('Warning: ') |
20 |
| - sys.stderr.write(msg) |
21 |
| - sys.stderr.write('\n') |
| 34 | + if should_buffer_warnings(): |
| 35 | + _warning_buffer.append(msg) |
| 36 | + else: |
| 37 | + sys.stderr.write('Warning: ') |
| 38 | + sys.stderr.write(msg) |
| 39 | + sys.stderr.write('\n') |
22 | 40 |
|
23 | 41 | ignore_errors = False
|
24 | 42 |
|
25 | 43 | def error(msg, exception=Exception):
|
26 | 44 | """Exception raising wrapper that differentiates developer-mode output"""
|
27 | 45 | developer = os.environ.get('CHPL_DEVELOPER')
|
28 | 46 | if developer and developer != "0" and not ignore_errors:
|
| 47 | + # before rasing the exception, flush the warnings |
| 48 | + flush_warnings() |
29 | 49 | raise exception(msg)
|
30 | 50 | else:
|
31 |
| - sys.stderr.write('\nError: ') |
32 |
| - sys.stderr.write(msg) |
33 |
| - sys.stderr.write('\n') |
34 |
| - if not ignore_errors: |
| 51 | + out = '\nError: {}\n'.format(msg) |
| 52 | + if ignore_errors: |
| 53 | + sys.stderr.write(out) |
| 54 | + else: |
| 55 | + # flush warnings, print error, and exit |
| 56 | + # technically, there is no need to flush warnings here, but might as well |
| 57 | + flush_warnings() |
| 58 | + sys.stderr.write(out) |
35 | 59 | sys.exit(1)
|
36 | 60 |
|
37 |
| - |
38 | 61 | def memoize(func):
|
39 | 62 | """Function memoizing decorator"""
|
40 | 63 | cache = func.cache = {}
|
|
0 commit comments