diff options
author | Alan Mackenzie <acm@muc.de> | 2015-01-13 15:39:36 +0000 |
---|---|---|
committer | Alan Mackenzie <acm@muc.de> | 2015-01-13 15:47:26 +0000 |
commit | 30c5f5cdef8db72c007efecfc8436479631b45d0 (patch) | |
tree | 781d6e630b7efca6e0fef929a416bb79851949f5 /lisp/progmodes/cc-defs.el | |
parent | c3024739131467b607fa745daf52ca25a3fd3c4d (diff) | |
download | emacs-30c5f5cdef8db72c007efecfc8436479631b45d0.tar.gz emacs-30c5f5cdef8db72c007efecfc8436479631b45d0.tar.bz2 emacs-30c5f5cdef8db72c007efecfc8436479631b45d0.zip |
Allow compilation during loading of Modes derived from a CC Mode mode.
Fixes debbugs#19206.
cc-bytecomp.el (cc-bytecomp-compiling-or-loading): new function which
walks the stack to discover whether we're compiling or loading.
(cc-bytecomp-is-compiling): Reformulate, and move towards beginning.
(cc-bytecomp-is-loading): New defsubst.
(cc-bytecomp-setup-environment, cc-bytecomp-restore-environment): Use
the
above defsubsts.
(cc-require-when-compile, cc-bytecomp-defvar)
(cc-bytecomp-defun): Simplify conditionals.
cc-defs.el (cc-bytecomp-compiling-or-loading): "Borrow" this function
from cc-bytecomp.el.
(c-get-current-file): Reformulate using the above.
(c-lang-defconst): Prevent duplicate entries of file names in a symbol's
'source property.
(c-lang-const): Use cc-bytecomp-is-compiling.
cc-langs.el (c-make-init-lang-vars-fun): Use cc-bytecomp-is-compiling.
Diffstat (limited to 'lisp/progmodes/cc-defs.el')
-rw-r--r-- | lisp/progmodes/cc-defs.el | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/lisp/progmodes/cc-defs.el b/lisp/progmodes/cc-defs.el index 2ea566a7a25..d0beab1d485 100644 --- a/lisp/progmodes/cc-defs.el +++ b/lisp/progmodes/cc-defs.el @@ -1983,19 +1983,22 @@ system." (defvar c-lang-const-expansion nil) +;; Ugly hack to pull in the definition of `cc-bytecomp-compiling-or-loading` +;; from cc-bytecomp to make it available at loadtime. This is the same +;; mechanism used in cc-mode.el for `c-populate-syntax-table'. +(defalias 'cc-bytecomp-compiling-or-loading + (cc-eval-when-compile + (let ((f (symbol-function 'cc-bytecomp-compiling-or-loading))) + (if (byte-code-function-p f) f (byte-compile f))))) + (defsubst c-get-current-file () ;; Return the base name of the current file. - (let ((file (cond - (load-in-progress - ;; Being loaded. - load-file-name) - ((and (boundp 'byte-compile-dest-file) - (stringp byte-compile-dest-file)) - ;; Being compiled. - byte-compile-dest-file) - (t - ;; Being evaluated interactively. - (buffer-file-name))))) + (let* ((c-or-l (cc-bytecomp-compiling-or-loading)) + (file + (cond + ((eq c-or-l 'loading) load-file-name) + ((eq c-or-l 'compiling) byte-compile-dest-file) + ((null c-or-l) (buffer-file-name))))) (and file (file-name-sans-extension (file-name-nondirectory file))))) @@ -2062,6 +2065,9 @@ constant. A file is identified by its base name." ;; language constant source definitions.) (c-lang-const-expansion 'call) (c-langs-are-parametric t) + (file (intern + (or (c-get-current-file) + (error "`c-lang-defconst' can only be used in a file")))) bindings pre-files) @@ -2121,9 +2127,14 @@ constant. A file is identified by its base name." ;; definitions for this symbol, to make sure the order in the ;; `source' property is correct even when files are loaded out of ;; order. - (setq pre-files (nreverse - ;; Reverse to get the right load order. - (mapcar 'car (get sym 'source)))) + (setq pre-files (mapcar 'car (get sym 'source))) + (if (memq file pre-files) + ;; This can happen when the source file (e.g. cc-langs.el) is first + ;; loaded as source, setting a 'source property entry, and then itself + ;; being compiled. + (setq pre-files (cdr (memq file pre-files)))) + ;; Reverse to get the right load order. + (setq pre-files (nreverse pre-files)) `(eval-and-compile (c-define-lang-constant ',name ,bindings @@ -2233,9 +2244,7 @@ quoted." (if (or (eq c-lang-const-expansion 'call) (and (not c-lang-const-expansion) (not mode)) - load-in-progress - (not (boundp 'byte-compile-dest-file)) - (not (stringp byte-compile-dest-file))) + (not (cc-bytecomp-is-compiling))) ;; Either a straight call is requested in the context, or ;; we're in an "uncontrolled" context and got no language, ;; or we're not being byte compiled so the compile time |