diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-05-27 08:18:46 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-05-27 08:18:46 -0700 |
commit | d021ddb220345dd93b251dc6ba50caf116c590c5 (patch) | |
tree | 8748e724b902cab23a2fc74aebb168e84ad74c52 /parser.c | |
parent | 6ad1aa9978b219f34799ae9db41e20452d06145f (diff) | |
download | txr-d021ddb220345dd93b251dc6ba50caf116c590c5.tar.gz txr-d021ddb220345dd93b251dc6ba50caf116c590c5.tar.bz2 txr-d021ddb220345dd93b251dc6ba50caf116c590c5.zip |
bugfix: fatal exception on missing .txr_history.
The new abstraction layer used by linenoise throws exceptions,
but linenoise excpects a null pointer when a file open fails.
* parser.c (lino_open, lino_open8): Catch error exceptions
and convert to null return, using new macros to reduce
repetitive coding.
* unwind.h (ignerr_begin, ignerr_end): New macros.
Diffstat (limited to 'parser.c')
-rw-r--r-- | parser.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -1497,14 +1497,22 @@ static mem_t *lino_open(const wchar_t *name_in, lino_file_mode_t mode_in) { val name = string(name_in); val mode = static_str(lino_mode_str[mode_in]); - return coerce(mem_t *, open_file(name, mode)); + mem_t *ret = 0; + ignerr_begin; + ret = coerce(mem_t *, open_file(name, mode)); + ignerr_end; + return ret; } static mem_t *lino_open8(const char *name_in, lino_file_mode_t mode_in) { val name = string_utf8(name_in); val mode = static_str(lino_mode_str[mode_in]); - return coerce(mem_t *, open_file(name, mode)); + mem_t *ret = 0; + ignerr_begin; + ret = coerce(mem_t *, open_file(name, mode)); + ignerr_end; + return ret; } static mem_t *lino_fdopen(int fd, lino_file_mode_t mode_in) |