diff options
| author | Philipp Stephani | 2015-06-30 22:38:35 +0200 |
|---|---|---|
| committer | Philipp Stephani | 2017-05-01 20:39:10 +0200 |
| commit | c2bbdc3316487e34eba1470dd059c0c290431e00 (patch) | |
| tree | bed5315e69d89c99c62be4a78e8f26d799643f70 /src/lread.c | |
| parent | b72e36047c9a5d46b02e12252e0fc640b6839903 (diff) | |
| download | emacs-c2bbdc3316487e34eba1470dd059c0c290431e00.tar.gz emacs-c2bbdc3316487e34eba1470dd059c0c290431e00.zip | |
Warn about missing backslashes during load
* src/lread.c (load_warn_unescaped_character_literals, Fload, read1)
(syms_of_lread): Warn if unescaped character literals are
found (Bug#20152).
* lisp/emacs-lisp/bytecomp.el (byte-compile-from-buffer): Check for
unescaped character literals during byte compilation.
* test/src/lread-tests.el (lread-tests--unescaped-char-literals): New
unit test.
(lread-tests--with-temp-file, lread-tests--last-message): Helper
functions for unit test.
* test/lisp/emacs-lisp/bytecomp-tests.el
(bytecomp-tests--unescaped-char-literals): New unit test.
* test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--with-temp-file):
Helper macro for unit test.
Diffstat (limited to 'src/lread.c')
| -rw-r--r-- | src/lread.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/lread.c b/src/lread.c index 3b2e123dd39..6467043b1da 100644 --- a/src/lread.c +++ b/src/lread.c | |||
| @@ -955,6 +955,21 @@ load_warn_old_style_backquotes (Lisp_Object file) | |||
| 955 | } | 955 | } |
| 956 | } | 956 | } |
| 957 | 957 | ||
| 958 | static void | ||
| 959 | load_warn_unescaped_character_literals (Lisp_Object file) | ||
| 960 | { | ||
| 961 | if (NILP (Vlread_unescaped_character_literals)) return; | ||
| 962 | CHECK_CONS (Vlread_unescaped_character_literals); | ||
| 963 | AUTO_STRING (format, | ||
| 964 | "Loading `%s': unescaped character literals %s detected!"); | ||
| 965 | AUTO_STRING (separator, ", "); | ||
| 966 | CALLN (Fmessage, | ||
| 967 | format, file, | ||
| 968 | Fmapconcat (Qstring, | ||
| 969 | Fsort (Vlread_unescaped_character_literals, Qlss), | ||
| 970 | separator)); | ||
| 971 | } | ||
| 972 | |||
| 958 | DEFUN ("get-load-suffixes", Fget_load_suffixes, Sget_load_suffixes, 0, 0, 0, | 973 | DEFUN ("get-load-suffixes", Fget_load_suffixes, Sget_load_suffixes, 0, 0, 0, |
| 959 | doc: /* Return the suffixes that `load' should try if a suffix is \ | 974 | doc: /* Return the suffixes that `load' should try if a suffix is \ |
| 960 | required. | 975 | required. |
| @@ -1202,6 +1217,11 @@ Return t if the file exists and loads successfully. */) | |||
| 1202 | specbind (Qold_style_backquotes, Qnil); | 1217 | specbind (Qold_style_backquotes, Qnil); |
| 1203 | record_unwind_protect (load_warn_old_style_backquotes, file); | 1218 | record_unwind_protect (load_warn_old_style_backquotes, file); |
| 1204 | 1219 | ||
| 1220 | /* Check for the presence of unescaped character literals and warn | ||
| 1221 | about them. */ | ||
| 1222 | specbind (Qlread_unescaped_character_literals, Qnil); | ||
| 1223 | record_unwind_protect (load_warn_unescaped_character_literals, file); | ||
| 1224 | |||
| 1205 | int is_elc; | 1225 | int is_elc; |
| 1206 | if ((is_elc = suffix_p (found, ".elc")) != 0 | 1226 | if ((is_elc = suffix_p (found, ".elc")) != 0 |
| 1207 | /* version = 1 means the file is empty, in which case we can | 1227 | /* version = 1 means the file is empty, in which case we can |
| @@ -3092,6 +3112,16 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list) | |||
| 3092 | if (c == ' ' || c == '\t') | 3112 | if (c == ' ' || c == '\t') |
| 3093 | return make_number (c); | 3113 | return make_number (c); |
| 3094 | 3114 | ||
| 3115 | if (c == '(' || c == ')' || c == '[' || c == ']' | ||
| 3116 | || c == '"' || c == ';') | ||
| 3117 | { | ||
| 3118 | CHECK_LIST (Vlread_unescaped_character_literals); | ||
| 3119 | Lisp_Object char_obj = make_natnum (c); | ||
| 3120 | if (NILP (Fmemq (char_obj, Vlread_unescaped_character_literals))) | ||
| 3121 | Vlread_unescaped_character_literals = | ||
| 3122 | Fcons (char_obj, Vlread_unescaped_character_literals); | ||
| 3123 | } | ||
| 3124 | |||
| 3095 | if (c == '\\') | 3125 | if (c == '\\') |
| 3096 | c = read_escape (readcharfun, 0); | 3126 | c = read_escape (readcharfun, 0); |
| 3097 | modifiers = c & CHAR_MODIFIER_MASK; | 3127 | modifiers = c & CHAR_MODIFIER_MASK; |
| @@ -4815,6 +4845,16 @@ variables, this must be set in the first line of a file. */); | |||
| 4815 | Vold_style_backquotes = Qnil; | 4845 | Vold_style_backquotes = Qnil; |
| 4816 | DEFSYM (Qold_style_backquotes, "old-style-backquotes"); | 4846 | DEFSYM (Qold_style_backquotes, "old-style-backquotes"); |
| 4817 | 4847 | ||
| 4848 | DEFVAR_LISP ("lread--unescaped-character-literals", | ||
| 4849 | Vlread_unescaped_character_literals, | ||
| 4850 | doc: /* List of deprecated unescaped character literals encountered by `read'. | ||
| 4851 | For internal use only. */); | ||
| 4852 | Vlread_unescaped_character_literals = Qnil; | ||
| 4853 | DEFSYM (Qlread_unescaped_character_literals, | ||
| 4854 | "lread--unescaped-character-literals"); | ||
| 4855 | |||
| 4856 | DEFSYM (Qlss, "<"); | ||
| 4857 | |||
| 4818 | DEFVAR_BOOL ("load-prefer-newer", load_prefer_newer, | 4858 | DEFVAR_BOOL ("load-prefer-newer", load_prefer_newer, |
| 4819 | doc: /* Non-nil means `load' prefers the newest version of a file. | 4859 | doc: /* Non-nil means `load' prefers the newest version of a file. |
| 4820 | This applies when a filename suffix is not explicitly specified and | 4860 | This applies when a filename suffix is not explicitly specified and |