Function: comp--native-compile

comp--native-compile is a byte-compiled function defined in comp.el.gz.

Signature

(comp--native-compile FUNCTION-OR-FILE &optional WITH-LATE-LOAD OUTPUT)

Documentation

Compile FUNCTION-OR-FILE into native code.

When WITH-LATE-LOAD is non-nil, mark the compilation unit for late load once it finishes compiling. This serves as internal implementation of native-compile but allowing for WITH-LATE-LOAD to be controlled is in use also for the deferred compilation mechanism.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/comp.el.gz
(defun comp--native-compile (function-or-file &optional with-late-load output)
  "Compile FUNCTION-OR-FILE into native code.
When WITH-LATE-LOAD is non-nil, mark the compilation unit for late
load once it finishes compiling.
This serves as internal implementation of `native-compile' but
allowing for WITH-LATE-LOAD to be controlled is in use also for
the deferred compilation mechanism."
  (comp-ensure-native-compiler)
  (unless (or (functionp function-or-file)
              (stringp function-or-file))
    (signal 'native-compiler-error
            (list "Not a function symbol or file" function-or-file)))
  (catch 'no-native-compile
    (let* ((data function-or-file)
           (comp-native-compiling t)
           (byte-native-qualities nil)
           ;; Have byte compiler signal an error when compilation fails.
           (byte-compile-debug t)
           (comp-ctxt (make-comp-ctxt :output output
                                      :with-late-load with-late-load)))
      (comp-log "\n\n" 1)
      (condition-case err
          (cl-loop
           with report = nil
           for t0 = (current-time)
           for pass in comp-passes
           unless (memq pass comp-disabled-passes)
           do
           (comp-log (format "(%s) Running pass %s:\n"
                             function-or-file pass)
                     2)
           (setf data (funcall pass data))
           (push (cons pass (float-time (time-since t0))) report)
           (cl-loop for f in (alist-get pass comp-post-pass-hooks)
                    do (funcall f data))
           finally
           (when comp-log-time-report
             (comp-log (format "Done compiling %s" data) 0)
             (cl-loop for (pass . time) in (reverse report)
                      do (comp-log (format "Pass %s took: %fs." pass time) 0))))
        (native-compiler-skip)
        (t
         (let ((err-val (cdr err)))
           ;; If we are doing an async native compilation print the
           ;; error in the correct format so is parsable and abort.
           (if (and comp-async-compilation
                    (not (eq (car err) 'native-compiler-error)))
               (progn
                 (message (if err-val
                              "%s: Error: %s %s"
                            "%s: Error %s")
                          function-or-file
                          (get (car err) 'error-message)
                          (car-safe err-val))
                 (kill-emacs -1))
             ;; Otherwise re-signal it adding the compilation input.
	     (signal (car err) (if (consp err-val)
                                   (cons function-or-file err-val)
                                 (list function-or-file err-val)))))))
      (if (stringp function-or-file)
          data
        ;; So we return the compiled function.
        (native-elisp-load data)))))