X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ffull-eval.lisp;h=00e4e33055d062cc5158be0db820aee13db51a88;hb=13fb19c3183a0effb7c35a2d453d6c6c91726e26;hp=83c1122db93a9274daadff067aa183b88d6ed20d;hpb=37b5fc474cf0b4d739c12fc0356667a16006d217;p=sbcl.git diff --git a/src/code/full-eval.lisp b/src/code/full-eval.lisp index 83c1122..00e4e33 100644 --- a/src/code/full-eval.lisp +++ b/src/code/full-eval.lisp @@ -185,13 +185,13 @@ ;;; Augment ENV with a local function binding (declaim (inline push-fun)) -(defun push-fun (name value env) +(defun push-fun (name value calling-env body-env) (when (fboundp name) - (let ((sb!c:*lexenv* (env-native-lexenv env))) + (let ((sb!c:*lexenv* (env-native-lexenv calling-env))) (program-assert-symbol-home-package-unlocked :eval name "binding ~A as a local function"))) - (push (cons name value) (env-funs env)) - (push (cons name :bogus) (sb!c::lexenv-funs (env-native-lexenv env)))) + (push (cons name value) (env-funs body-env)) + (push (cons name :bogus) (sb!c::lexenv-funs (env-native-lexenv body-env)))) (sb!int:def!method print-object ((env env) stream) (print-unreadable-object (env stream :type t :identity t))) @@ -236,7 +236,10 @@ (cond ((eq type :constant) ;; Horrible place for this, but it works. - (ip-error "Can't bind constant symbol ~S" symbol)) + (ip-error "Can't bind constant symbol: ~S" symbol)) + ((eq type :global) + ;; Ditto... + (ip-error "Can't bind a global variable: ~S" symbol)) ((eq type :special) t) ((member symbol declared-specials :test #'eq) t) @@ -279,7 +282,8 @@ (defun parse-arguments (arguments lambda-list) (multiple-value-bind (required optional rest-p rest keyword-p keyword allow-other-keys-p aux-p aux) - (sb!int:parse-lambda-list lambda-list) + (handler-bind ((style-warning #'muffle-warning)) + (sb!int:parse-lambda-list lambda-list)) (let* ((original-arguments arguments) (arguments-present (length arguments)) (required-length (length required)) @@ -681,6 +685,8 @@ (push-fun (car function-def) ;; Evaluate the function definitions in ENV. (eval-local-function-def function-def env) + ;; Do package-lock checks in ENV. + env ;; But add the bindings to the child environment. new-env)) (eval-progn body new-env))))) @@ -697,6 +703,7 @@ (dolist (function-def local-functions) (push-fun (car function-def) (eval-local-function-def function-def env) + old-env env)) ;; And then add an environment for the body of the LABELS. A ;; separate environment from the one where we added the @@ -1200,11 +1207,6 @@ (%eval form env)) (compiler-environment-too-complex-error (condition) (declare (ignore condition)) - ;; FIXME: this could be a really annoying warning. It should - ;; have its own class. - (sb!int:style-warn - "~@" - form lexenv) + (sb!int:style-warn 'sb!kernel:lexical-environment-too-complex + :form form :lexenv lexenv) (sb!int:simple-eval-in-lexenv form lexenv)))))