summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-07-22 07:25:44 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-07-22 07:25:44 -0700
commit31741b4cf50f75993faf20555343ca0a59d0ff9f (patch)
tree2f468023a89e5823d11a59a262121395cdfa4b31
parent4c1341f2d2be88f36e5799aac9275c88233e1abe (diff)
downloadtxr-31741b4cf50f75993faf20555343ca0a59d0ff9f.tar.gz
txr-31741b4cf50f75993faf20555343ca0a59d0ff9f.tar.bz2
txr-31741b4cf50f75993faf20555343ca0a59d0ff9f.zip
txr: regression: lack of file name in error messages.
This was broken on April 21, 2019 in commit 2e36e0feae8d1dd75c8410b365d7dc33b30ce66b (April 21, 2019) which changed parse_once in such a way that the name being passed down was no longer stored in the parser. The ensure_parser function being relied upon doesn't take on the responsibility of propagating the name from the stream to the parser, so the parser ends up with a nil name. Let's just smooth this over by having ensure_parser take a name parameter. If ensure_parser creates a new parser, it puts in the name. If the name is nil, then it is taken from the stream. * eval.c (load): Pass name to ensure_parser. * match.c (v_load): Likewise. * parser.c (parser): Take name parameter, and plant into newly constructed parser. (ensure_parser): Take name parameter. When creating a parser, give it that name, or if name is specified as nil, then give it the name taken from the stream. (parser_set_lineno): Pass nil name to ensure_parser. (lisp_parse_impl, read_file_common): Pass name to ensure_parser. * parser.h (parser, ensure_parser): Declarations updated. * parser.y (parse_once): Pass name to ensure_parser. * txr.c (txr_main): Pass spec_file_str to ensure_parser.
-rw-r--r--eval.c2
-rw-r--r--match.c2
-rw-r--r--parser.c15
-rw-r--r--parser.h4
-rw-r--r--parser.y2
-rw-r--r--txr.c2
6 files changed, 15 insertions, 12 deletions
diff --git a/eval.c b/eval.c
index 5dd9c830..c45df3bb 100644
--- a/eval.c
+++ b/eval.c
@@ -4363,7 +4363,7 @@ val load(val target)
}
} else {
int gc = gc_state(0);
- val parser_obj = ensure_parser(stream);
+ val parser_obj = ensure_parser(stream, name);
parser_t *parser = parser_get_impl(self, parser_obj);
parse_once(self, stream, name);
gc_state(gc);
diff --git a/match.c b/match.c
index 1e0e00e7..a543634f 100644
--- a/match.c
+++ b/match.c
@@ -4331,7 +4331,7 @@ static val v_load(match_files_ctx *c)
if (!txr_lisp_p) {
int gc = gc_state(0);
- val parser_obj = ensure_parser(stream);
+ val parser_obj = ensure_parser(stream, name);
parser_t *parser = parser_get_impl(self, parser_obj);
parse_once(self, stream, name);
diff --git a/parser.c b/parser.c
index bfb7c353..88b9b6c2 100644
--- a/parser.c
+++ b/parser.c
@@ -160,7 +160,7 @@ void parser_reset(parser_t *p)
yyset_extra(p, p->scanner);
}
-val parser(val stream, val lineno)
+val parser(val stream, val name, val lineno)
{
parser_t *p = coerce(parser_t *, chk_malloc(sizeof *p));
val parser;
@@ -168,6 +168,7 @@ val parser(val stream, val lineno)
parser = cobj(coerce(mem_t *, p), parser_s, &parser_ops);
p->parser = parser;
p->lineno = c_num(default_arg(lineno, one));
+ p->name = name;
p->stream = stream;
return parser;
@@ -178,13 +179,15 @@ parser_t *parser_get_impl(val self, val parser)
return coerce(parser_t *, cobj_handle(self, parser, parser_s));
}
-val ensure_parser(val stream)
+val ensure_parser(val stream, val name)
{
+ uses_or2;
loc pcdr = gethash_l(lit("internal error"), stream_parser_hash, stream, nulloc);
val pars = deref(pcdr);
if (pars)
return pars;
- return set(pcdr, parser(stream, one));
+ return set(pcdr,
+ parser(stream, or2(name, stream_get_prop(stream, name_k)), one));
}
static void pushback_token(parser_t *p, struct yy_token *tok)
@@ -195,7 +198,7 @@ static void pushback_token(parser_t *p, struct yy_token *tok)
val parser_set_lineno(val self, val stream, val lineno)
{
- val parser = ensure_parser(stream);
+ val parser = ensure_parser(stream, nil);
parser_t *pi = parser_get_impl(self, parser);
pi->lineno = c_num(lineno);
return stream;
@@ -563,7 +566,7 @@ static val lisp_parse_impl(val self, val interactive, val rlcp_p, val source_in,
if3(stringp(source),
lit("string"),
stream_get_prop(input_stream, name_k)));
- val parser = ensure_parser(input_stream);
+ val parser = ensure_parser(input_stream, name);
val saved_dyn = dyn_env;
parser_t *pi = parser_get_impl(self, parser);
volatile val parsed = nil;
@@ -649,7 +652,7 @@ static val read_file_common(val self, val stream, val error_stream, val compiled
val name = stream_get_prop(stream, name_k);
val first = t;
val big_endian = nil;
- val parser = ensure_parser(stream);
+ val parser = ensure_parser(stream, name);
if (compiled) {
parser_t *pi = parser_get_impl(self, parser);
diff --git a/parser.h b/parser.h
index ccb23d35..ff2738f3 100644
--- a/parser.h
+++ b/parser.h
@@ -128,10 +128,10 @@ val repl(val bindings, val in_stream, val out_stream, val env);
#endif
void parser_common_init(parser_t *);
void parser_cleanup(parser_t *);
-val parser(val stream, val lineno);
+val parser(val stream, val name, val lineno);
parser_t *parser_get_impl(val self, val parser);
val get_parser(val stream);
-val ensure_parser(val stream);
+val ensure_parser(val stream, val name);
val parser_set_lineno(val self, val stream, val lineno);
val parser_errors(val parser);
val parser_eof(val parser);
diff --git a/parser.y b/parser.y
index 43f4f587..c2d809c9 100644
--- a/parser.y
+++ b/parser.y
@@ -1848,7 +1848,7 @@ int parse_once(val self, val stream, val name)
#if CONFIG_DEBUG_SUPPORT
unsigned dbg_state = debug_clear(opt_dbg_expansion ? 0 : DBG_ENABLE);
#endif
- val parser_obj = ensure_parser(stream);
+ val parser_obj = ensure_parser(stream, name);
parser_t *parser = parser_get_impl(self, parser_obj);
parser->rec_source_loc = 1;
diff --git a/txr.c b/txr.c
index fccbb89a..be9ebc5c 100644
--- a/txr.c
+++ b/txr.c
@@ -1058,7 +1058,7 @@ int txr_main(int argc, char **argv)
if (!txr_lisp_p)
{
int gc = gc_state(0);
- val parser_obj = ensure_parser(parse_stream);
+ val parser_obj = ensure_parser(parse_stream, spec_file_str);
parser_t *parser = parser_get_impl(prog_string, parser_obj);
parse_once_noerr(parse_stream, spec_file_str);
gc_state(gc);