Changeset 15483


Ignore:
Timestamp:
11/11/20 17:58:12 (2 years ago)
Author:
Mark Evenson
Message:

Fix compiling/loading using packages which don't USE :CL

Explicitly scope all symbols used in our fasl loader. Probably not
strictly necessary in all cases, but it makes things clearer to the
reader.

Use the (find-package :keyword) idiom where it works. One can't
reliably use +keyword-package+ when bootstrapping the compiler (?!?).

The last fasl prologue Lisp form in the loader init._ forms is now
an IN-PACKAGE to the COMPILE-FILE value used when creating the fasl.

Normalize whitespace and comments.

Fixes <https://abcl.org/trac/ticket/475>.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/compile-file.lisp

    r15398 r15483  
    3333
    3434(require "COMPILER-PASS2")
    35 
    3635
    3736(export 'compile-file-if-needed)
     
    224223                                             *compile-file-environment*))))))
    225224
    226 
    227225(declaim (ftype (function (t stream t) t) process-progn))
    228226(defun process-progn (forms stream compile-time-too)
     
    230228    (process-toplevel-form form stream compile-time-too))
    231229  nil)
    232 
    233230
    234231(declaim (ftype (function (t t t) t) process-toplevel-form))
     
    240237      (eval form))
    241238    form))
    242 
    243 
    244239
    245240(defun process-toplevel-macrolet (form stream compile-time-too)
     
    279274              :initial-contents ',(coerce initial-value 'list)))))
    280275  `(progn
    281      (put ',(second form) 'sys::source (cons '(,(second form) ,(namestring *source*) ,*source-position*) (get ',(second form)  'sys::source nil)))
     276     (sys:put ',(second form) 'sys::source
     277              (cl:cons '(,(second form) ,(namestring *source*) ,*source-position*)
     278                       (cl:get ',(second form)  'sys::source nil)))
    282279     ,form))
    283280
     
    322319    (when (quoted-form-p type) (setq type (second type)))
    323320    (let ((sym (if (consp name) (second name) name)))
    324       `(put ',sym 'sys::source (cons '(,type ,(namestring *source*) ,*source-position*)
    325            (get ',sym  'sys::source nil))))))
     321      `(sys:put ',sym 'sys::source
     322                (cl:cons '(,type ,(namestring *source*) ,*source-position*)
     323       (cl:get ',sym  'sys::source nil))))))
    326324
    327325   
     
    358356                          ;; FIXME This should be a warning or error of some sort...
    359357                          (format *error-output* "; Unable to compile method~%"))))))))))
    360 
    361 
    362358    (when compile-time-too
    363359      (let* ((copy-form (copy-tree form))
     
    398394              :initial-contents ',(coerce initial-value 'list))))
    399395    `(progn
    400        (put ',name 'sys::source (cons (list :variable ,(namestring *source*) ,*source-position*) (get ',name  'sys::source nil)))
     396       (sys:put ',name 'sys::source
     397                (cl:cons
     398                 (list :variable ,(namestring *source*) ,*source-position*)
     399                 (cl:get ',name 'sys::source nil)))
    401400       ,form)))
    402401
     
    413412    (let ((*package* +keyword-package+))
    414413      (output-form form))
    415     ;; a bit ugly here. Since we precompile, and added record-source-information we need to know where it is.
    416     ;; The defpackage is at top, so we know where the name is (though it is a string by now)
    417     ;; (if it is a defpackage)
     414    ;; a bit ugly here. Since we precompile, and added
     415    ;; record-source-information we need to know where it is.
     416
     417    ;; The defpackage is at top, so we know where the name is (though
     418    ;; it is a string by now) (if it is a defpackage)
    418419    (if defpackage-name
    419   `(put ,defpackage-name 'sys::source
    420         (cons '(:package ,(namestring *source*) ,*source-position*)
    421         (get ,defpackage-name 'sys::source nil)))
     420  `(sys:put ,defpackage-name 'sys::source
     421            (cl:cons '(:package ,(namestring *source*) ,*source-position*)
     422               (cl:get ,defpackage-name 'sys::source nil)))
    422423  nil)))
    423424
     
    439440  (eval form)
    440441  `(progn
    441      (put ',(second form) 'sys::source (cons '(,(second form) ,(namestring *source*) ,*source-position*) (get ',(second form)  'sys::source nil)))
     442     (sys:put ',(second form) 'sys::source
     443              (cl:cons '(,(second form) ,(namestring *source*) ,*source-position*)
     444                       (cl:get ',(second form) 'sys::source nil)))
    442445     ,form))
    443446
     
    487490    (when (eq (car form) 'defgeneric)
    488491      `(progn
    489    (put ',sym 'sys::source
    490         (cons  '((:generic-function ,(second form)) ,(namestring *source*) ,*source-position*) (get ',sym  'sys::source nil)))
     492   (sys:put ',sym 'sys::source
     493            (cl:cons '((:generic-function ,(second form))
     494                             ,(namestring *source*) ,*source-position*)
     495                           (cl:get ',sym  'sys::source nil)))
    491496   ,@(loop for method-form in (cdddr form)
    492497     when (eq (car method-form) :method)
     
    495500           (mop::parse-defmethod `(,(second form) ,@(rest method-form)))
    496501                     ;;; FIXME: style points for refactoring double backquote to "normal" form
    497          `(put ',sym 'sys::source
    498          (cons `((:method ,',sym ,',qualifiers ,',specializers) ,,(namestring *source*) ,,*source-position*)
    499          (get ',sym  'sys::source nil)))))))))
     502         `(sys:put ',sym 'sys::source
     503             (cl:cons `((:method ,',sym ,',qualifiers ,',specializers)
     504                                          ,,(namestring *source*) ,,*source-position*)
     505                (cl:get ',sym  'sys::source nil)))))))))
    500506
    501507
     
    538544
    539545      (if (special-operator-p name)
    540           `(put ',name 'macroexpand-macro
    541                 (make-macro ',name
    542                             (sys::get-fasl-function *fasl-loader*
    543                                                     ,saved-class-number)))
     546          `(sys:put ',name 'macroexpand-macro
     547                (sys:make-macro ',name
     548                                (sys::get-fasl-function *fasl-loader*
     549                                                        ,saved-class-number)))
    544550    `(progn
    545        (put ',name 'sys::source
    546       (cons '(:macro  ,(namestring *source*) ,*source-position*) (get ',name  'sys::source nil)))
    547        (fset ',name
    548        (make-macro ',name
    549              (sys::get-fasl-function *fasl-loader*
    550                    ,saved-class-number))
    551        ,*source-position*
    552        ',(third form)
    553        ,(%documentation name 'cl:function)))))))
     551       (sys:put ',name 'sys::source
     552          (cl:cons '(:macro ,(namestring *source*) ,*source-position*)
     553                               (cl:get ',name  'sys::source nil)))
     554       (sys:fset ',name
     555           (sys:make-macro ',name
     556                     (sys::get-fasl-function *fasl-loader*
     557                           ,saved-class-number))
     558           ,*source-position*
     559           ',(third form)
     560           ,(%documentation name 'cl:function)))))))
    554561
    555562(declaim (ftype (function (t t t) t) process-toplevel-defun))
     
    594601     (setf form
    595602           `(progn
    596        (put ',sym 'sys::source (cons '((:function ,name)  ,(namestring *source*) ,*source-position*) (get ',sym  'sys::source nil)))           
    597        (fset ',name
    598                             (sys::get-fasl-function *fasl-loader*
    599                                                     ,saved-class-number)
    600                             ,*source-position*
    601                             ',lambda-list
    602                             ,doc)))))
     603        (sys:put ',sym 'sys::source
     604                                   (cl:cons '((:function ,name)
     605                                              ,(namestring *source*) ,*source-position*)
     606                                            (cl:get ',sym  'sys::source nil)))           
     607        (sys:fset ',name
     608                                    (sys::get-fasl-function *fasl-loader*
     609                                                            ,saved-class-number)
     610                                    ,*source-position*
     611                                    ',lambda-list
     612                                    ,doc)))))
    603613              (t
    604614               (compiler-warn "Unable to compile function ~A.  Using interpreted form instead.~%" name)
     
    611621                                                   *compile-file-environment*)))
    612622                 (setf form
    613                        `(fset ',name
    614                               ,precompiled-function
    615                               ,*source-position*
    616                               ',lambda-list
    617                               ,doc)))
     623                       `(sys:fset ',name
     624                                  ,precompiled-function
     625                                  ,*source-position*
     626                                  ',lambda-list
     627                                  ,doc)))
    618628               (when compile-time-too
    619629                 (eval form)))))
     
    624634                                                  lambda-list
    625635                                                  (append decls body)))
    626             (output-form `(setf (inline-expansion ',name)
    627                                 ',(inline-expansion name))))))
     636            (output-form `(cl:setf (inline-expansion ',name)
     637                                   ',(inline-expansion name))))))
    628638    (push name jvm::*functions-defined-in-current-file*)
    629639    (note-name-defined name)
    630640    (push name *toplevel-functions*)
    631641    (when (and (consp name)
    632                (eq 'setf (first name)))
     642         (or
     643                (eq 'setf (first name))
     644    (eq 'cl:setf (first name))))
    633645      (push (second name) *toplevel-setf-functions*))
    634646    ;; If NAME is not fbound, provide a dummy definition so that
     
    688700      (when (and (symbolp operator)
    689701                 (macro-function operator *compile-file-environment*))
    690         (when (eq operator 'define-setf-expander) ;; ??? what if the symbol is package qualified?
     702        (when (eq operator 'define-setf-expander)
    691703          (push (second form) *toplevel-setf-expanders*))
    692         (when (and (eq operator 'defsetf) ;; ??? what if the symbol is package qualified?
     704        (when (and (eq operator 'defsetf)
    693705                   (consp (third form))) ;; long form of DEFSETF
    694706          (push (second form) *toplevel-setf-expanders*))
     
    770782    (rename-file zipfile output-file)))
    771783
    772 (defun write-fasl-prologue (stream)
    773   (let ((out stream))
     784(defun write-fasl-prologue (stream in-package)
     785  "Write the forms that form the fasl to STREAM. 
     786
     787The last form will use IN-PACKAGE to set the *package* to its value when
     788COMPILE-FILE was invoked."
     789  (let ((out stream)
     790        (*package* (find-package :keyword)))
    774791    ;; write header
    775792    (write "; -*- Mode: Lisp -*-" :escape nil :stream out)
    776793    (%stream-terpri out)
    777     (write (list 'init-fasl :version *fasl-version*) :stream out)
     794    (write (list 'sys:init-fasl :version *fasl-version*) :stream out)
    778795    (%stream-terpri out)
    779     (write (list 'setq '*source* *compile-file-truename*) :stream out)
     796    (write (list 'cl:setq 'sys:*source* *compile-file-truename*) :stream out)
    780797    (%stream-terpri out)
    781798
     
    783800    ;; because the list of uninterned symbols has been fixed now.
    784801    (when *fasl-uninterned-symbols*
    785       (write (list 'setq '*fasl-uninterned-symbols*
     802      (write (list 'cl:setq 'sys::*fasl-uninterned-symbols*
    786803                   (coerce (mapcar #'car (nreverse *fasl-uninterned-symbols*))
    787804                           'vector))
     
    790807
    791808    (when (> *class-number* 0)
    792       (write (list 'setq '*fasl-loader*
     809      (write (list 'cl:setq 'sys:*fasl-loader*
    793810                   `(sys::make-fasl-class-loader
    794811                     ,(concatenate 'string "org.armedbear.lisp."
    795812                                   (base-classname))))
    796813             :stream out))
     814    (%stream-terpri out)
     815
     816    (write `(in-package ,(package-name in-package))
     817     :stream out)
    797818    (%stream-terpri out)))
    798 
    799 
    800819
    801820(defvar *binary-fasls* nil)
     
    817836         *fasl-uninterned-symbols*
    818837         (warnings-p nil)
     838         (in-package *package*)
    819839         (failure-p nil))
    820840    (when *compile-verbose*
     
    933953                               :if-exists :supersede
    934954                               :external-format *fasl-external-format*)
    935             (let ((*package* (find-package '#:cl))
     955            (let ((*package* (find-package :keyword))
    936956                  (*print-fasl* t)
    937957                  (*print-array* t)
     
    966986              ;;        (*readtable* (copy-readtable nil))
    967987
    968               (write-fasl-prologue out)
     988              (write-fasl-prologue out in-package)
    969989              ;; copy remaining content
    970990              (loop for line = (read-line in nil :eof)
Note: See TracChangeset for help on using the changeset viewer.