;;; 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)))
(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)))))
(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
(assert (eql #c(1.0 2.0) (evaluated-struct-csingle *evaluated-struct*)))
(assert (eql #c(2.0d0 3.0d0) (evaluated-struct-cdouble *evaluated-struct*))))))
+;;; Prior to 1.0.25, the interpreter checked for package lock
+;;; violation for a local function in the fbinding form's body's
+;;; lexical environment.
+(let ((sb-ext:*evaluator-mode* :interpret))
+ (assert
+ (ignore-errors
+ (eval
+ '(eql
+ (locally (declare (disable-package-locks
+ ;; rather than create a whole new package
+ ;; just to test this corner case, we'll
+ ;; lexically shadow something innocuous in
+ ;; the CL package.
+ cl:ed))
+ (flet ((cl:ed ()
+ 42))
+ (declare (enable-package-locks cl:ed))
+ (cl:ed)))
+ 42)))))