diff options
-rw-r--r-- | eval.c | 2 | ||||
-rw-r--r-- | match.c | 2 | ||||
-rw-r--r-- | parser.c | 15 | ||||
-rw-r--r-- | parser.h | 4 | ||||
-rw-r--r-- | parser.y | 2 | ||||
-rw-r--r-- | txr.c | 2 |
6 files changed, 15 insertions, 12 deletions
@@ -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); @@ -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); @@ -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); @@ -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); @@ -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; @@ -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); |