diff --git a/src/CHANGELOG b/src/CHANGELOG index 109eb66de..313bb9813 100644 --- a/src/CHANGELOG +++ b/src/CHANGELOG @@ -109,11 +109,11 @@ ECL 0.9i effect as SI::SET-BUFFERING-MODE's argument. - ECL can be built against locally installed copies of the Boehm-Weiser - garbage collector, as far as they are recent. This has been checked with - OpenBSD & Ubuntu. You may need to supply appropiate LDFLAGS & CFLAGS for the + garbage collector, if they are recent. This has been checked with OpenBSD & + Ubuntu. You may need to supply appropiate LDFLAGS & CFLAGS for the configuration to detect the headers. - - ECL now can compile files with constants that do not print readably, such as + - ECL can now compile files with constants that do not print readably, such as CLOS objects. In those cases, MAKE-LOAD-FORM is used to recreate these constants. The only case where this fail is when the "unreadable" constant is part of a circular structure (contributed by Brian Spilsbury). @@ -130,6 +130,8 @@ ECL 0.9i console program, and :WINDOWS, to build a Windows program. The second case makes only sense when the program contains some GUI (M. Goffioul). + - The compiler is slightly faster by avoiding use of EVAL. + * MOP compatibility: - SLOT-VALUE, SLOT-BOUNDP, etc, together with MOP SLOT*-USING-CLASS generic diff --git a/src/cmp/cmputil.lsp b/src/cmp/cmputil.lsp index 925fc3719..2a17b5129 100644 --- a/src/cmp/cmputil.lsp +++ b/src/cmp/cmputil.lsp @@ -115,62 +115,42 @@ ; (throw *cmperr-tag* '*cmperr-tag*) DEBUG ) -(defun cmp-eval (form &aux (throw-flag t)) - (unwind-protect - (prog1 - (cmp-toplevel-eval form) - (setq throw-flag nil)) - (when throw-flag - (let ((*print-case* :upcase)) - (print-current-form) - (format t "~&;;; The form ~s was not evaluated successfully.~ - ~%;;; You are recommended to compile again.~%" - form))))) +(defmacro with-cmp-protection (main-form error-form) + `(let* ((sys::*ihs-base* sys::*ihs-top*) + (sys::*ihs-top* (sys::ihs-top 'cmp-toplevel-eval)) + (*break-enable* *compiler-break-enable*) + (sys::*break-hidden-packages* + (cons (find-package 'compiler) + sys::*break-hidden-packages*)) + (throw-flag t)) + (unwind-protect + (multiple-value-prog1 ,main-form + (setf throw-flag nil)) + (when throw-flag ,error-form)))) +(defun cmp-eval (form) + (with-cmp-protection (eval form) + (let ((*print-case* :upcase)) + (print-current-form) + (format t "~&;;; The form ~s was not evaluated successfully.~ + ~%;;; You are recommended to compile again.~%" + form)))) -(defun cmp-macroexpand (form) - ;; Obtain the local macro/function environment for expansion. - (let ((env (and *funs* (cons nil *funs*))) - (throw-flag t)) - (unwind-protect - (prog1 - (cmp-toplevel-eval `(macroexpand ',form ',env)) - (setq throw-flag nil)) - (when throw-flag - (let ((*print-case* :upcase)) - (print-current-form) - (format t - "~&;;; The macro form ~s was not expanded successfully.~ - ~%;;; You are recommended to compile again.~%" - form)))))) +(defun cmp-macroexpand (form &optional (env (and *funs* (cons nil *funs*)))) + (with-cmp-protection (macroexpand form env) + (let ((*print-case* :upcase)) + (print-current-form) + (format t "~&;;; The macro form ~S was not expanded successfully.~ + ~%;;; You are recommended to compile again.~%" form)))) (defun cmp-expand-macro (fd form &optional (env (and *funs* (cons nil *funs*)))) - (let ((throw-flag t)) - (unwind-protect - (let ((new-form (cmp-toplevel-eval - `(funcall *macroexpand-hook* ',fd ',form ',env)))) - (setq throw-flag nil) - (values new-form (not (eql new-form form)))) - (if throw-flag - (let ((*print-case* :upcase)) - (print-current-form) - (format t - "~&;;; The macro form (~s ...) was not expanded successfully.~ - ~%;;; You are recommended to compile again.~%" - fname)))))) - -(defun cmp-toplevel-eval (form) - (let* - #-:CCL - ((sys::*ihs-base* sys::*ihs-top*) - (sys::*ihs-top* (sys::ihs-top 'cmp-toplevel-eval)) - (*break-enable* *compiler-break-enable*) - (sys::*break-hidden-packages* - (cons (find-package 'compiler) - sys::*break-hidden-packages*))) - #+:CCL - ((*break-on-errors* *compiler-break-enable*)) - (eval form))) + (with-cmp-protection + (let ((new-form (funcall *macroexpand-hook* fd form env))) + (values new-form (not (eql new-form form)))) + (let ((*print-case* :upcase)) + (print-current-form) + (format t "~&;;; The macro form ~S was not expanded successfully.~ + ~%;;; You are recommended to compile again.~%" form)))) (defun si::compiler-clear-compiler-properties (symbol) #-:CCL