message: Intern file names in msg_location to make them cheaper to copy.
[pspp] / src / language / lexer / lexer.c
index 9fa1823b5fdab6cb1aeab50eea2c490f5441e5c0..df3a77de94fb11ac90d196c560f32de27922848d 100644 (file)
@@ -38,6 +38,7 @@
 #include "libpspp/cast.h"
 #include "libpspp/deque.h"
 #include "libpspp/i18n.h"
+#include "libpspp/intern.h"
 #include "libpspp/ll.h"
 #include "libpspp/message.h"
 #include "libpspp/misc.h"
@@ -1248,7 +1249,7 @@ lex_token_location (const struct lex_source *src,
                     const struct lex_token *t1)
 {
   return (struct msg_location) {
-    .file_name = src->reader->file_name,
+    .file_name = intern_new_if_nonnull (src->reader->file_name),
     .first_line = t0->first_line,
     .last_line = lex_token_get_last_line_number (src, t1),
     .first_column = lex_token_get_first_column (src, t0),
@@ -1364,7 +1365,7 @@ lex_get_lines (const struct lexer *lexer, int n0, int n1)
 {
   struct msg_location *loc = xmalloc (sizeof *loc);
   *loc = (struct msg_location) {
-    .file_name = xstrdup_if_nonnull (lex_get_file_name (lexer)),
+    .file_name = intern_new_if_nonnull (lex_get_file_name (lexer)),
     .first_line = lex_get_first_line_number (lexer, n0),
     .last_line = lex_get_last_line_number (lexer, n1),
   };