diff --git a/src/cmp/cmpenv.lsp b/src/cmp/cmpenv.lsp index de5a4f1ed..3869f1901 100644 --- a/src/cmp/cmpenv.lsp +++ b/src/cmp/cmpenv.lsp @@ -117,7 +117,7 @@ (defun add-function-declaration (fname arg-types return-types) (if (si::valid-function-name-p fname) - (let ((fun (cmp-env-search-function fname *cmp-env* t))) + (let ((fun (cmp-env-search-function fname))) (if (functionp fun) (warn "Found function declaration for local macro ~A" fname) (push (list fun @@ -446,7 +446,11 @@ (push (list name 'si::macro function) (cmp-env-functions env))) -(defun cmp-env-search-function (name &optional (env *cmp-env*) macro-allowed) +(defun cmp-env-register-block (blk &optional (env *cmp-env*)) + (push (list :block (blk-name blk) blk) + (cmp-env-variables env))) + +(defun cmp-env-search-function (name &optional (env *cmp-env*)) (let ((ccb nil) (clb nil) (unw nil) @@ -462,14 +466,53 @@ (baboon)) ((eq (first record) name) (setf found (first (last record))) - (when (and (functionp found) (not macro-allowed)) - ;; Macro definition appears in #'.... This should not happen. - (cmperr "The name of a macro ~A was found in special form FUNCTION." name)) (return)))) (values found ccb clb unw))) +(defun cmp-env-search-variables (type name env) + (let ((ccb nil) + (clb nil) + (unw nil) + (found nil)) + (dolist (record (cmp-env-variables env)) + (cond ((eq record 'CB) + (setf ccb t)) + ((eq record 'LB) + (setf clb t)) + ((eq record 'UNWIND-PROTECT) + (setf unw t)) + ((atom record) + (baboon)) + ((not (eq (first record) type))) + ((and (eq type :block) (eq name (second record))) + (setf found record) + (return)) + ((and (eq type :tag) (member name (second record))) + (setf found record) + (return)) + ((eq (second record) 'si::symbol-macro) + (when (eq name 'si::symbol-macro) + (setf found record)) + (return)) + (t + (setf found record) + (return)))) + (values (first (last found)) ccb clb unw))) + +(defun cmp-env-search-block (name &optional (env *cmp-env*)) + (cmp-env-search-variables :block name env)) + +(defun cmp-env-search-tag (name &optional (env *cmp-env*)) + (cmp-env-search-variables :tag name env)) + +(defun cmp-env-search-symbol-macro (name &optional (env *cmp-env*)) + (cmp-env-search-variables name 'si::symbol-macro env)) + +(defun cmp-env-search-var (name &optional (env *cmp-env*)) + (cmp-env-search-variables name t env)) + (defun cmp-env-search-macro (name &optional (env *cmp-env*)) - (let ((f (cmp-env-search-function name env t))) + (let ((f (cmp-env-search-function name env))) (if (functionp f) f nil))) (defun cmp-env-mark (mark &optional (env *cmp-env*)) diff --git a/src/cmp/cmpflet.lsp b/src/cmp/cmpflet.lsp index c2987b850..20de03e79 100644 --- a/src/cmp/cmpflet.lsp +++ b/src/cmp/cmpflet.lsp @@ -216,8 +216,13 @@ (defun local-function-ref (fname &optional build-object) (multiple-value-bind (fun ccb clb unw) - (cmp-env-search-function fname *cmp-env* (not build-object)) + (cmp-env-search-function fname) (when fun + (when (functionp fun) + (when build-object + ;; Macro definition appears in #'.... This should not happen. + (cmperr "The name of a macro ~A was found in special form FUNCTION." name)) + (return-from local-function-ref nil)) (incf (fun-ref fun)) (cond (build-object (setf (fun-ref-ccb fun) t)) diff --git a/src/cmp/cmputil.lsp b/src/cmp/cmputil.lsp index bd42377fc..bcee1cfa2 100644 --- a/src/cmp/cmputil.lsp +++ b/src/cmp/cmputil.lsp @@ -116,13 +116,16 @@ ) (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)) + `(let* #+nil + ((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)) + ((*break-enable* *compiler-break-enable*) + (throw-flag t)) (unwind-protect (multiple-value-prog1 ,main-form (setf throw-flag nil))