(FILECREATED "26-Sep-86 17:45:52" {ERIS}<LISPCORE>SOURCES>FASL.;5 74231  

      changes to:  (VARIABLES FASL::INITIAL-VALUE-TABLE-SIZE FASL::VALUE-TABLE-INCREMENT 
                          FASL::VERSION-RANGE FASL:CURRENT-VERSION)
                   (FUNCTIONS FASL::COLLECT-LIST FASL::DUMP-STRING FASL::DUMP-DCODE FAT-STRING-P 
                          FASL:MAKE-OPTABLE FASL:DEFOP FASL:DEFRANGE)
                   (OPTIMIZERS FASL::OPTABLE-VECTOR)
                   (VARS FASLCOMS)
                   (FASL-OPS FASL:FASL-THIN-STRING FASL:FASL-DCODE)

      previous date: "26-Sep-86 15:54:44" {ERIS}<LISPCORE>SOURCES>FASL.;4)


(* "
Copyright (c) 1986 by Xerox Corporation.  All rights reserved.
")

(PRETTYCOMPRINT FASLCOMS)

(RPAQQ FASLCOMS 
       ((COMS (* ;;; "Common definitions.")
              (DECLARE: EVAL@COMPILE EVAL@LOAD DONTCOPY (FILES (LOADCOMP)
                                                               LLCHAR))
              (FNS FASL::SO-THAT-THE-FILE-WILL-GET-COMPILED)
              (STRUCTURES FASL:FASL-ERROR FASL:UNIMPLEMENTED-OPCODE FASL:OBJECT-NOT-DUMPABLE 
                     FASL:UNEXPECTED-END-OF-BLOCK FASL:INCONSISTENT-TABLE)
              (EXPORT (VARIABLES FASL:SIGNATURE))
              (VARIABLES FASL::CHECK-TABLE-SIZE FASL::FASL-EXTENDED FASL::END-MARK 
                     FASL::VERSION-RANGE FASL:CURRENT-VERSION)
              (FUNCTIONS FASL::TABLE-STATS))
        (COMS (* ;;; "Dumper.")
              (STRUCTURES FASL::HANDLE)
              (VARIABLES FASL::DUMMY-HANDLE)
              (VARIABLES FASL::+SMALLEST-FOUR-BYTE-INTEGER+ FASL::+LARGEST-FOUR-BYTE-INTEGER+)
              (VARIABLES FASL::*GATHER-DUMPER-STATS* FASL::*TABLE-ATTEMPTS* FASL::*TABLE-HITS*)
              (FUNCTIONS FASL::RESET-DUMPER-STATS)
              (FUNCTIONS DOTTED-LIST-LENGTH FASL::STATE-CASE FAT-STRING-P FASL::REMEMBER 
                     FASL::ELEMENTS-IDENTICAL-P FASL::END-BLOCK FASL::END-TEXT FASL::WRITE-OP 
                     FASL::LOOKUP-VALUE FASL::SAVE-VALUE)
              (FUNCTIONS FASL::DUMP-VALUE-FETCH FASL::DUMP-CHARACTER FASL::DUMP-SYMBOL 
                     FASL::DUMP-LIST FASL::DUMP-SIMPLE-VECTOR FASL::DUMP-ARRAY-DESCRIPTOR 
                     FASL::DUMP-BIT-ARRAY FASL::DUMP-GENERAL-ARRAY FASL::DUMP-ARRAY 
                     FASL::WRITE-INTEGER-BYTES FASL::INTEGER-BYTE-LIST FASL::DUMP-RATIONAL 
                     FASL::DUMP-COMPLEX FASL::DUMP-INTEGER FASL::DUMP-PACKAGE FASL::DUMP-DCODE 
                     FASL::DUMP-STRING FASL::DUMP-FLOAT32)
              (FUNCTIONS FASL:OPEN-FASL-HANDLE FASL:WITH-OPEN-HANDLE FASL:BEGIN-TEXT FASL:BEGIN-BLOCK 
                     FASL:VALUE-DUMPABLE-P FASL:DUMP-VALUE FASL:DUMP-FUNCTION-DEF FASL:DUMP-FUNCALL 
                     FASL:DUMP-EVAL FASL:CLOSE-FASL-HANDLE))
        (COMS (* ;;; "Reader.")
              (DEFINE-TYPES FASL-OPS)
              (STRUCTURES FASL::OPTABLE)
              (* ;; "This shouldn't have to be in here, but defstruct isn't complete yet.")
              (OPTIMIZERS FASL::OPTABLE-VECTOR)
              (FUNCTIONS FASL:MAKE-OPTABLE FASL::FASL-END-OF-BLOCK FASL:DEFOP FASL:DEFRANGE 
                     FASL::ADD-OP-TRANSLATION FASL:OPCODE-SEQUENCE FASL::FASL-EXTENDED 
                     FASL::SETESCAPE FASL::UNIMPLEMENTED-OPCODE)
              (VARIABLES FASL:*DEFAULT-OPTABLE* FASL::*CURRENT-OPTABLE* 
                     FASL::INITIAL-VALUE-TABLE-SIZE FASL::VALUE-TABLE-INCREMENT FASL::*VALUE-TABLE* 
                     FASL::*BLOCK-LEVEL* FASL::DEBUG-READER FASL::DEBUG-STREAM)
              (FUNCTIONS FASL:WITH-OPTABLE FASL:PROCESS-FILE FASL:CHECK-VERSION FASL:PROCESS-SEGMENT 
                     FASL:READ-TEXT FASL:PROCESS-BLOCK FASL:SKIP-TEXT FASL:NEXT-VALUE FASL::DO-OP 
                     FASL::NEW-VALUE-TABLE FASL::CLEAR-TABLE FASL::STORE-VALUE FASL::FETCH-VALUE 
                     FASL::COLLECT-LIST)
              (FASL-OPS FASL:FASL-SHORT-INTEGER FASL:FASL-NIL FASL:FASL-T FASL:FASL-INTEGER 
                     FASL:FASL-LARGE-INTEGER FASL:FASL-RATIO FASL:FASL-COMPLEX FASL:FASL-VECTOR 
                     FASL:FASL-CREATE-ARRAY FASL:FASL-INITIALIZE-ARRAY FASL:FASL-INITIALIZE-BIT-ARRAY 
                     FASL:FASL-THIN-STRING FASL:FASL-FAT-STRING FASL:FASL-CHARACTER 
                     FASL:FASL-LISP-SYMBOL FASL:FASL-KEYWORD-SYMBOL FASL:FASL-FIND-PACKAGE 
                     FASL:FASL-SYMBOL-IN-PACKAGE FASL:FASL-LIST FASL:FASL-LIST* FASL:FASL-DCODE 
                     FASL:FASL-TABLE-STORE FASL:FASL-TABLE-FETCH FASL:FASL-VERIFY-TABLE-SIZE 
                     FASL:FASL-EVAL FASL:FASL-FLOAT32 FASL:FASL-SETF-SYMBOL-FUNCTION 
                     FASL:FASL-FUNCALL))
        (PROP FILETYPE FASL)
        (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
                                                                            (NLAML)
                                                                            (LAMA 
                                                             FASL::SO-THAT-THE-FILE-WILL-GET-COMPILED
                                                                                  )))))



(* ;;; "Common definitions.")

(DECLARE: EVAL@COMPILE EVAL@LOAD DONTCOPY 
(FILESLOAD (LOADCOMP)
       LLCHAR)
)
(DEFINEQ

(FASL::SO-THAT-THE-FILE-WILL-GET-COMPILED
  (CL:LAMBDA NIL))
)
(DEFINE-CONDITION FASL:FASL-ERROR CL:ERROR)

(DEFINE-CONDITION FASL:UNIMPLEMENTED-OPCODE FASL:FASL-ERROR :REPORT (FORMAT T 
                                                                          "Unimplemented FASL op: ~S"
                                                                           (
                                                                     FASL:UNIMPLEMENTED-OPCODE-OPNAME
                                                                            CONDITION))
                                                  OPNAME)

(DEFINE-CONDITION FASL:OBJECT-NOT-DUMPABLE FASL:FASL-ERROR :REPORT (FORMAT T 
                                                                          "Object not dumpable:~&~S"
                                                                          (
                                                                      FASL:OBJECT-NOT-DUMPABLE-OBJECT
                                                                           CONDITION))
                                                 OBJECT)

(DEFINE-CONDITION FASL:UNEXPECTED-END-OF-BLOCK FASL:FASL-ERROR :REPORT (FORMAT T 
                                                                "Unexpected FASL-END-OF-BLOCK at ~D."
                                                                              (GETFILEPTR
                                                                               (
                                                                  FASL:UNEXPECTED-END-OF-BLOCK-STREAM
                                                                                CONDITION)))
                                                     STREAM)

(DEFINE-CONDITION FASL:INCONSISTENT-TABLE FASL:FASL-ERROR :REPORT (FORMAT T 
                                           "Inconsistent FASL table size.~&Expected ~D but found ~D."
                                                                         (
                                                                     FASL:INCONSISTENT-TABLE-EXPECTED
                                                                          CONDITION)
                                                                         (CL:LENGTH
                                                                          (FASL::OPTABLE-VECTOR
                                                                           (
                                                                        FASL:INCONSISTENT-TABLE-TABLE
                                                                            CONDITION))))
                                                TABLE EXPECTED)

(* FOLLOWING DEFINITIONS EXPORTED)


(DEFCONSTANT FASL:SIGNATURE 145 "First byte of a FASL file.")



(* END EXPORTED DEFINITIONS)

(DEFVAR FASL::CHECK-TABLE-SIZE T)

(DEFCONSTANT FASL::FASL-EXTENDED 254)

(DEFCONSTANT FASL::END-MARK 255)

(DEFCONSTANT FASL::VERSION-RANGE (QUOTE (2 . 2)) 
                                      "Handles (car version-range) <= version <= (cdr version-range)"
   )

(DEFCONSTANT FASL:CURRENT-VERSION 2)

(DEFUN FASL::TABLE-STATS (TABLE) (LET ((ITEMS (LIST (CONS (QUOTE --TOTAL--)
                                                          (CL:LENGTH TABLE)))))
                                      (DOTIMES (I (CL:LENGTH TABLE)
                                                  ITEMS)
                                             (LET* ((TYPE (TYPE-OF (AREF TABLE I)))
                                                    (PAIR (OR (CL:FIND TYPE ITEMS :TEST (QUOTE 
                                                                                             CL:EQUAL
                                                                                               )
                                                                     :KEY
                                                                     (QUOTE CAR))
                                                              (CAR (CL:PUSH (CONS TYPE 0)
                                                                          ITEMS)))))
                                                   (INCF (CDR PAIR))))))




(* ;;; "Dumper.")

(DEFSTRUCT (FASL::HANDLE (:CONSTRUCTOR FASL::MAKE-HANDLE)) STREAM (STATE :BLOCK-END)
                                                                 (LAST-INDEX 0)
                                                                 (HASH (MAKE-HASH-TABLE :TEST
                                                                              (CL:FUNCTION EQ))))

(DEFCONSTANT FASL::DUMMY-HANDLE (FASL::MAKE-HANDLE :STREAM (OPEN "{null}" :DIRECTION :OUTPUT)
                                       :STATE :BLOCK :HASH NIL) )

(DEFCONSTANT FASL::+SMALLEST-FOUR-BYTE-INTEGER+ (- (CL:EXPT 2 31)) )

(DEFCONSTANT FASL::+LARGEST-FOUR-BYTE-INTEGER+ (1- (CL:EXPT 2 31)) )

(DEFVAR FASL::*GATHER-DUMPER-STATS* NIL)

(DEFVAR FASL::*TABLE-ATTEMPTS* 0 "Number of table lookups by the FASL dumper.")

(DEFVAR FASL::*TABLE-HITS* 0 "Number of successful table lookups by the FASL dumper.")

(DEFUN FASL::RESET-DUMPER-STATS NIL (CL:SETQ FASL::*TABLE-ATTEMPTS* 0 FASL::*TABLE-HITS* 0))

(DEFUN DOTTED-LIST-LENGTH (X) (CL:DO ((N 0 (+ N 2))
                                      (FAST X (CDDR FAST))
                                      (SLOW X (CDR SLOW)))
                                     (NIL)
                                     (COND
                                        ((NULL FAST)
                                         (RETURN N))
                                        ((CL:ATOM FAST)
                                         (RETURN (VALUES N T)))
                                        ((NULL (CDR FAST))
                                         (RETURN (1+ N)))
                                        ((CL:ATOM (CDR FAST))
                                         (RETURN (VALUES (1+ N)
                                                        T)))
                                        ((AND (EQ FAST SLOW)
                                              (> N 0))
                                         (RETURN NIL)))))

(DEFMACRO FASL::STATE-CASE (&REST CLAUSES) (BQUOTE (ECASE (FASL::HANDLE-STATE HANDLE)
                                                          (\,@ CLAUSES))))

(DEFUN FAT-STRING-P (STRING) (COND
                                ((STRINGP STRING)
                                 (EQ (fetch (STRINGP TYP) of STRING)
                                     \ST.POS16))
                                (T (%%FAT-STRING-ARRAY-P STRING))))

(DEFMACRO FASL::REMEMBER (VALUE &BODY BODY) (LET ((REMEMBER-VAL (GENSYM)))
                                                 (BQUOTE (LET (((\, REMEMBER-VAL)
                                                                (\, VALUE)))
                                                              (CL:WHEN REMEMBER (FASL::WRITE-OP
                                                                                 HANDLE
                                                                                 (QUOTE 
                                                                                FASL:FASL-TABLE-STORE
                                                                                        )))
                                                              (\,@ BODY)
                                                              (CL:WHEN REMEMBER (FASL::SAVE-VALUE
                                                                                 HANDLE
                                                                                 (\, REMEMBER-VAL))))
                                                        )))

(DEFUN FASL::ELEMENTS-IDENTICAL-P (ARRAY) (LET* ((SEQ (\FLATTEN-ARRAY ARRAY))
                                                 (TESTELT (AREF SEQ 0)))
                                                (CL:EVERY (CL:FUNCTION (CL:LAMBDA (X)
                                                                              (EQL X TESTELT)))
                                                       SEQ)))

(DEFUN FASL::END-BLOCK (HANDLE) (FASL::STATE-CASE (:BLOCK (CL:WHEN FASL::CHECK-TABLE-SIZE
                                                                 (FASL::WRITE-OP HANDLE (QUOTE 
                                                                          FASL:FASL-VERIFY-TABLE-SIZE
                                                                                               ))
                                                                 (FASL:DUMP-VALUE HANDLE (
                                                                              FASL::HANDLE-LAST-INDEX
                                                                                          HANDLE)
                                                                        NIL))
                                                         (BOUT (FASL::HANDLE-STREAM HANDLE)
                                                               FASL::END-MARK)
                                                         (SETF (FASL::HANDLE-LAST-INDEX HANDLE)
                                                               0)
                                                         (SETF (FASL::HANDLE-HASH HANDLE)
                                                               (MAKE-HASH-TABLE :TEST (CL:FUNCTION
                                                                                       EQ)))
                                                         (SETF (FASL::HANDLE-STATE HANDLE)
                                                               :BLOCK-END))))

(DEFUN FASL::END-TEXT (HANDLE) (FASL::STATE-CASE (:TEXT (BOUT (FASL::HANDLE-STREAM HANDLE)
                                                              FASL::END-MARK)
                                                        (SETF (FASL::HANDLE-STATE HANDLE)
                                                              :BLOCK))))

(DEFUN FASL::WRITE-OP (HANDLE OPNAME) (FASL::STATE-CASE (:BLOCK (LET ((STREAM (FASL::HANDLE-STREAM
                                                                               HANDLE))
                                                                      (OPSEQ (FASL:OPCODE-SEQUENCE
                                                                              OPNAME)))
                                                                     (CL:IF (NULL OPSEQ)
                                                                            (CL:ERROR (QUOTE 
                                                                            FASL:UNIMPLEMENTED-OPCODE
                                                                                             )
                                                                                   :OPNAME OPNAME)
                                                                            (DOLIST (OP OPSEQ)
                                                                                   (BOUT STREAM OP)))
                                                                     ))))

(DEFUN FASL::LOOKUP-VALUE (HANDLE VALUE) (GETHASH VALUE (FASL::HANDLE-HASH HANDLE)))

(DEFUN FASL::SAVE-VALUE (HANDLE VALUE) (SETF (GETHASH VALUE (FASL::HANDLE-HASH HANDLE))
                                             (FASL::HANDLE-LAST-INDEX HANDLE))
                                       (INCF (FASL::HANDLE-LAST-INDEX HANDLE)))

(DEFUN FASL::DUMP-VALUE-FETCH (HANDLE INDEX) (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-TABLE-FETCH))
                                             (FASL:DUMP-VALUE HANDLE INDEX NIL))

(DEFUN FASL::DUMP-CHARACTER (HANDLE CHAR REMEMBER) (DECLARE (IGNORE REMEMBER))
                                                             (* "Characters don't get remembered.")
                                                   (LET ((CODE (CHAR-CODE CHAR))
                                                         (STREAM (FASL::HANDLE-STREAM HANDLE)))
                                                        (FASL::WRITE-OP HANDLE (QUOTE 
                                                                                  FASL:FASL-CHARACTER
                                                                                      ))
                                                        (CL:IF (< CODE 256)
                                                               (BOUT STREAM CODE)
                                                               (PROGN (BOUT STREAM 255)
                                                                      (BOUT16 STREAM CODE)))))

(DEFUN FASL::DUMP-SYMBOL (HANDLE SYMBOL REMEMBER) (* ;; 
                  "No point in remembering the pname because SYMBOL-NAME always gives you a new one.")
   (LET ((PNAME (SYMBOL-NAME SYMBOL))
         (PACKAGE (SYMBOL-PACKAGE SYMBOL)))
        (FASL::REMEMBER SYMBOL (COND
                                  ((KEYWORDP SYMBOL)
                                   (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-KEYWORD-SYMBOL))
                                   (FASL:DUMP-VALUE HANDLE PNAME NIL))
                                  ((STRING-EQUAL (PACKAGE-NAME PACKAGE)
                                          "lisp")
                                   (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-LISP-SYMBOL))
                                   (FASL:DUMP-VALUE HANDLE PNAME NIL))
                                  (T (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-SYMBOL-IN-PACKAGE))
                                     (FASL:DUMP-VALUE HANDLE PNAME NIL)
                                     (FASL:DUMP-VALUE HANDLE PACKAGE REMEMBER))))))

(DEFUN FASL::DUMP-LIST (HANDLE LIST REMEMBER) (MULTIPLE-VALUE-BIND (LENGTH DOTTED)
                                                     (DOTTED-LIST-LENGTH LIST)
                                                     (CL:UNLESS LENGTH (CL:ERROR (QUOTE 
                                                                             FASL:OBJECT-NOT-DUMPABLE
                                                                                        )
                                                                              :OBJECT LIST))
                                                     (FASL::REMEMBER LIST (FASL::WRITE-OP
                                                                           HANDLE
                                                                           (CL:IF DOTTED (QUOTE
                                                                                          
                                                                                      FASL:FASL-LIST*
                                                                                          )
                                                                                  (QUOTE 
                                                                                       FASL:FASL-LIST
                                                                                         )))
                                                            (FASL:DUMP-VALUE HANDLE
                                                                   (CL:IF DOTTED (1+ LENGTH)
                                                                          LENGTH)
                                                                   NIL)
                                                            (DOTIMES (I LENGTH)
                                                                   (FASL:DUMP-VALUE HANDLE
                                                                          (CAR LIST))
                                                                   (CL:POP LIST))
                                                            (CL:WHEN DOTTED (FASL:DUMP-VALUE HANDLE 
                                                                                   LIST NIL)))))

(DEFUN FASL::DUMP-SIMPLE-VECTOR (HANDLE VECTOR REMEMBER) (LET ((LENGTH (CL:LENGTH VECTOR)))
                                                              (FASL::REMEMBER
                                                               VECTOR
                                                               (FASL::WRITE-OP HANDLE (QUOTE 
                                                                                     FASL:FASL-VECTOR
                                                                                             ))
                                                               (FASL:DUMP-VALUE HANDLE LENGTH 
                                                                      REMEMBER)
                                                               (DOTIMES (I LENGTH)
                                                                      (FASL:DUMP-VALUE HANDLE
                                                                             (SVREF VECTOR I)
                                                                             REMEMBER)))))

(DEFUN FASL::DUMP-ARRAY-DESCRIPTOR (HANDLE ARRAY REMEMBER &KEY (INITIAL-ELEMENT NIL USE-SINGLE-ELT))
   (FASL::REMEMBER ARRAY (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-CREATE-ARRAY))
          (FASL:DUMP-VALUE HANDLE (CL:IF (EQL (ARRAY-RANK ARRAY)
                                              1)
                                         (CAR (ARRAY-DIMENSIONS ARRAY))
                                         (ARRAY-DIMENSIONS ARRAY))
                 REMEMBER)
          (FASL:DUMP-VALUE HANDLE (BQUOTE (:ELEMENT-TYPE
                                           (\, (ARRAY-ELEMENT-TYPE ARRAY))
                                           :ADJUSTABLE
                                           (\, (ADJUSTABLE-ARRAY-P ARRAY))
                                           (\,@ (CL:WHEN (ARRAY-HAS-FILL-POINTER-P ARRAY)
                                                       (BQUOTE (:FILL-POINTER (\, (FILL-POINTER
                                                                                   ARRAY))))))
                                           (\,@ (CL:WHEN USE-SINGLE-ELT (BQUOTE (:INITIAL-ELEMENT
                                                                                 (\, INITIAL-ELEMENT)
                                                                                 ))))))
                 REMEMBER)))

(DEFUN FASL::DUMP-BIT-ARRAY (HANDLE ARRAY REMEMBER) (LET ((NBITS (ARRAY-TOTAL-SIZE ARRAY)))
                                                         (CL:UNLESS (CL:ZEROP (\ARRAY-OFFSET ARRAY))
                                                                (CL:ERROR (QUOTE 
                                                                             FASL:OBJECT-NOT-DUMPABLE
                                                                                 )
                                                                       :OBJECT ARRAY))
                                                         (FASL::REMEMBER ARRAY (FASL::WRITE-OP
                                                                                HANDLE
                                                                                (QUOTE 
                                                                       FASL:FASL-INITIALIZE-BIT-ARRAY
                                                                                       ))
                                                                (FASL:DUMP-VALUE HANDLE NBITS 
                                                                       REMEMBER)
                                                                (FASL::DUMP-ARRAY-DESCRIPTOR HANDLE 
                                                                       ARRAY REMEMBER)
                                                                (\BOUTS (FASL::HANDLE-STREAM HANDLE)
                                                                       (\ARRAY-BASE ARRAY)
                                                                       0
                                                                       (CEILING NBITS 8)))))

(DEFUN FASL::DUMP-GENERAL-ARRAY (HANDLE ARRAY REMEMBER)      (* 
                                     "Arrays don't get remembered. Displacement information is lost.")
   (LET* ((NELTS (ARRAY-TOTAL-SIZE ARRAY))
          (ELT-TYPE (ARRAY-ELEMENT-TYPE ARRAY)))
         (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-INITIALIZE-ARRAY))
         (FASL::DUMP-ARRAY-DESCRIPTOR HANDLE ARRAY NIL)
         (FASL:DUMP-VALUE HANDLE NELTS NIL)
         (LET ((INDIRECT (MAKE-ARRAY NELTS :DISPLACED-TO ARRAY :ELEMENT-TYPE ELT-TYPE)))
              (DOTIMES (I NELTS)
                     (FASL:DUMP-VALUE HANDLE (AREF INDIRECT I)
                            NIL)))))

(DEFUN FASL::DUMP-ARRAY (HANDLE ARRAY REMEMBER) (COND
                                                   ((DISPLACED-ARRAY-P ARRAY)
                                                    (CL:ERROR (QUOTE FASL:OBJECT-NOT-DUMPABLE)
                                                           :OBJECT ARRAY))
                                                   ((ADJUSTABLE-ARRAY-P ARRAY)
                                                    (FASL::DUMP-GENERAL-ARRAY HANDLE ARRAY REMEMBER))
                                                   ((TYPEP ARRAY (QUOTE (ARRAY BIT)))
                                                    (FASL::DUMP-BIT-ARRAY HANDLE ARRAY REMEMBER))
                                                   ((TYPEP ARRAY (QUOTE VECTOR))
                                                    (FASL::DUMP-SIMPLE-VECTOR HANDLE ARRAY REMEMBER))
                                                   (T (FASL::DUMP-GENERAL-ARRAY HANDLE ARRAY REMEMBER
                                                             ))))

(DEFUN FASL::WRITE-INTEGER-BYTES (HANDLE NBYTES VALUE) (LET ((STREAM (FASL::HANDLE-STREAM HANDLE)))
                                                            (DOLIST (BYTE (FASL::INTEGER-BYTE-LIST
                                                                           VALUE NBYTES))
                                                                   (BOUT STREAM BYTE))))

(DEFUN FASL::INTEGER-BYTE-LIST (VALUE NBYTES) (CL:DO ((COUNT 0 (1+ COUNT))
                                                      (RESULT NIL)
                                                      (N VALUE)
                                                      BYTE)
                                                     ((>= COUNT NBYTES)
                                                      RESULT)
                                                     (MULTIPLE-VALUE-SETQ (N BYTE)
                                                            (CL:FLOOR N 256))
                                                     (CL:PUSH BYTE RESULT)))

(DEFUN FASL::DUMP-RATIONAL (HANDLE VALUE REMEMBER) (DECLARE (IGNORE REMEMBER))
                                                   (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-RATIO))
                                                   (FASL:DUMP-VALUE HANDLE (NUMERATOR VALUE)
                                                          NIL)
                                                   (FASL:DUMP-VALUE HANDLE (DENOMINATOR VALUE)
                                                          NIL))

(DEFUN FASL::DUMP-COMPLEX (HANDLE VALUE REMEMBER) (DECLARE (IGNORE REMEMBER))
                                                  (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-COMPLEX))
                                                  (FASL:DUMP-VALUE HANDLE (REALPART VALUE)
                                                         NIL)
                                                  (FASL:DUMP-VALUE HANDLE (IMAGPART VALUE)
                                                         NIL))

(DEFUN FASL::DUMP-INTEGER (HANDLE VALUE REMEMBER) (DECLARE (IGNORE REMEMBER))
                                                  (COND
                                                     ((AND (<= 0 VALUE)
                                                           (< VALUE 128))
                                                      (BOUT (FASL::HANDLE-STREAM HANDLE)
                                                            VALUE))
                                                     ((AND (<= FASL::+SMALLEST-FOUR-BYTE-INTEGER+ 
                                                            VALUE FASL::+LARGEST-FOUR-BYTE-INTEGER+))
                                                      (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-INTEGER
                                                                                    ))
                                                      (FASL::WRITE-INTEGER-BYTES HANDLE 4 VALUE))
                                                     (T (FASL::WRITE-OP HANDLE (QUOTE 
                                                                              FASL:FASL-LARGE-INTEGER
                                                                                      ))
                                                        (LET* ((MINBITS (1+ (INTEGER-LENGTH VALUE)))
                                                               (NBYTES (CEILING (INTEGER-LENGTH
                                                                                 VALUE)
                                                                              8)))
                                                             (* "According to the book, MINBITS gives the minimum field width for this number in 2's complement representation.")
                                                              (FASL:DUMP-VALUE HANDLE NBYTES NIL)
                                                              (FASL::WRITE-INTEGER-BYTES HANDLE 
                                                                     NBYTES VALUE)))))

(DEFUN FASL::DUMP-PACKAGE (HANDLE PACKAGE REMEMBER) (FASL::REMEMBER PACKAGE (FASL::WRITE-OP
                                                                             HANDLE
                                                                             (QUOTE 
                                                                               FASL:FASL-FIND-PACKAGE
                                                                                    ))
                                                           (FASL:DUMP-VALUE HANDLE (PACKAGE-NAME
                                                                                    PACKAGE)
                                                                  REMEMBER)))

(DEFUN FASL::DUMP-DCODE (HANDLE DCODE REMEMBER)   (* ;; 
                                             "DCODEs don't get remembered because they are never EQ.")
   (LET ((STREAM (FASL::HANDLE-STREAM HANDLE)))
        (MACROLET ((DUMP-SEQ (SEQ DUMP-LENGTH &REST STUFF)
                          (BQUOTE (LET ((SEQ (\, SEQ)))
                                       (\,@ (AND DUMP-LENGTH (QUOTE ((FASL:DUMP-VALUE HANDLE
                                                                            (CL:LENGTH SEQ)
                                                                            REMEMBER)))))
                                       (CL:IF (CL:LISTP SEQ)
                                              (DOLIST (ELT SEQ)
                                                     (\,@ STUFF))
                                              (DOTIMES (INDEX (CL:LENGTH SEQ))
                                                     (LET ((ELT (AREF SEQ INDEX)))
                                                          (\,@ STUFF))))))))
               (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-DCODE))
               (FASL:DUMP-VALUE HANDLE (CL:LENGTH (DCODE-NAME-TABLE DCODE))
                      REMEMBER)
               (LET* ((CODE-ARRAY (DCODE-CODE-ARRAY DCODE))
                      (NBYTES (CL:LENGTH CODE-ARRAY)))
                     (FASL:DUMP-VALUE HANDLE NBYTES REMEMBER)
                     (DOTIMES (I NBYTES)
                            (BOUT STREAM (AREF CODE-ARRAY I))))
               (DUMP-SEQ (DCODE-NAME-TABLE DCODE)
                      NIL
                      (BOUT STREAM (CL:FIRST ELT))
                      (FASL:DUMP-VALUE HANDLE (SECOND ELT)
                             REMEMBER)
                      (FASL:DUMP-VALUE HANDLE (THIRD ELT)
                             REMEMBER))
               (FASL:DUMP-VALUE HANDLE (DCODE-FRAME-NAME DCODE)
                      REMEMBER)
               (BOUT STREAM (DCODE-NLOCALS DCODE))
               (BOUT STREAM (DCODE-NFREEVARS DCODE))
               (BOUT STREAM (DCODE-ARG-TYPE DCODE))
               (FASL:DUMP-VALUE HANDLE (DCODE-NUM-ARGS DCODE)
                      REMEMBER)
               (FASL:DUMP-VALUE HANDLE (DCODE-CLOSURE-P DCODE)
                      REMEMBER)
               (FASL:DUMP-VALUE HANDLE (DCODE-DEBUGGING-INFO DCODE)
                      REMEMBER)
               (MACROLET ((DUMP-FIXUPS (LIST)
                                 (BQUOTE (DUMP-SEQ (\, LIST)
                                                T
                                                (FASL:DUMP-VALUE HANDLE (CL:FIRST ELT))
                                                (FASL:DUMP-VALUE HANDLE (SECOND ELT))))))
                      (DUMP-FIXUPS (DCODE-FN-FIXUPS DCODE))
                      (DUMP-FIXUPS (DCODE-SYM-FIXUPS DCODE))
                      (DUMP-FIXUPS (DCODE-LIT-FIXUPS DCODE))
                      (DUMP-FIXUPS (DCODE-TYPE-FIXUPS DCODE))))
        NIL))

(DEFUN FASL::DUMP-STRING (HANDLE STRING REMEMBER)
   (FASL::REMEMBER STRING (LET ((STREAM (FASL::HANDLE-STREAM HANDLE))
                                (NCHARS (CL:LENGTH STRING)))
                               (COND
                                  ((FAT-STRING-P STRING)
                                   (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-FAT-STRING))
                                   (FASL:DUMP-VALUE HANDLE NCHARS REMEMBER)
                                   (CL:DO ((I 0 (1+ I))
                                           (CSET 0))
                                          ((>= I NCHARS))    (* "Always run-encode")
                                          (LET* ((CHAR (CHAR-CODE (CHAR STRING I)))
                                                 (NEW-CSET (LRSH CHAR 8)))
                                                (CL:UNLESS (EQL NEW-CSET CSET)
                                                       (CL:SETQ CSET NEW-CSET)
                                                       (BOUT STREAM 255)
                                                       (BOUT STREAM CSET))
                                                (BOUT STREAM (LOGAND CHAR 255)))))
                                  (T (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-THIN-STRING))
                                     (FASL:DUMP-VALUE HANDLE NCHARS REMEMBER)
                                                             (* ;; "should use \bouts")
                                     (DOTIMES (I NCHARS)
                                            (BOUT STREAM (CHAR-CODE (CHAR STRING I)))))))))

(DEFUN FASL::DUMP-FLOAT32 (HANDLE NUMBER REMEMBER)           (* "Floats don't get remembered")
   (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-FLOAT32))
   (\BOUTS (FASL::HANDLE-STREAM HANDLE)
          NUMBER 0 4))

(DEFUN FASL:OPEN-FASL-HANDLE (NAME &REST OPEN-OPTIONS) (LET ((STREAM (CL:APPLY (CL:FUNCTION OPEN)
                                                                            NAME :DIRECTION :OUTPUT 
                                                                            OPEN-OPTIONS)))
                                                            (SETFILEPTR STREAM 0)
                                                            (BOUT STREAM FASL:SIGNATURE)
                                                            (BOUT16 STREAM FASL:CURRENT-VERSION)
                                                            (FASL::MAKE-HANDLE :STREAM STREAM)))

(DEFMACRO FASL:WITH-OPEN-HANDLE ((HANDLE FILENAME &REST OPEN-OPTIONS)
                                 &BODY
                                 (BODY DECLS)) (LET ((ABORT (GENSYM "FASL:WITH-OPEN-FASL-HANDLE")))
                                                    (BQUOTE (LET (((\, HANDLE)
                                                                   (FASL:OPEN-FASL-HANDLE
                                                                    (\, FILENAME)
                                                                    (\,@ OPEN-OPTIONS)))
                                                                  ((\, ABORT)
                                                                   T))
                                                                 (\,@ DECLS)
                                                                 (UNWIND-PROTECT
                                                                  (MULTIPLE-VALUE-PROG1
                                                                   (PROGN (\,@ BODY))
                                                                   (SETQ (\, ABORT)
                                                                    NIL))
                                                                  (CL:WHEN (\, HANDLE)
                                                                         (FASL:CLOSE-FASL-HANDLE
                                                                          (\, HANDLE)
                                                                          :ABORT
                                                                          (\, ABORT))))))))

(DEFUN FASL:BEGIN-TEXT (HANDLE) (FASL::STATE-CASE ((:TEXT :BLOCK-END))
                                       (:BLOCK (FASL::END-BLOCK HANDLE)))
                                (SETF (FASL::HANDLE-STATE HANDLE)
                                      :TEXT)
                                (FASL::HANDLE-STREAM HANDLE))

(DEFUN FASL:BEGIN-BLOCK (HANDLE) (FASL::STATE-CASE (:BLOCK-END (FASL:BEGIN-TEXT HANDLE)
                                                          (FASL::END-TEXT HANDLE))
                                        (:TEXT (FASL::END-TEXT HANDLE))
                                        (:BLOCK)))

(DEFUN FASL:VALUE-DUMPABLE-P (OBJ) 
          
          (* (COND ((TYPEP OBJ (QUOTE (OR SYMBOL NUMBER CHARACTER PACKAGE DCODE 
          SIMPLE-STRING))) (VALUES T T)) ((TYPEP OBJ
          (QUOTE EVAL-AT-LOAD)) (FASL:VALUE-DUMPABLE-P
          (EVAL-AT-LOAD-FORM OBJ))) ((TYPEP OBJ (QUOTE
          (OR CONS SIMPLE-ARRAY))) (VALUES T NIL))
          ((TYPEP OBJ (QUOTE ARRAY)) (CL:IF (ARRAY-DISPLACED-P OBJ)
          (VALUES NIL T) (VALUES T NIL))) (T (VALUES NIL T))))
 (CONDITION-CASE (PROGN (FASL:DUMP-VALUE FASL::DUMMY-HANDLE OBJ NIL)
                        T)
        (FASL:OBJECT-NOT-DUMPABLE NIL NIL)))

(DEFUN FASL:DUMP-VALUE (HANDLE VALUE &OPTIONAL (REMEMBER T)
                              &AUX INDEX) (FASL::STATE-CASE
                                           (:BLOCK (COND
                                                      ((EQ VALUE NIL)
                                                       (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-NIL)))
                                                      ((EQ VALUE T)
                                                       (FASL::WRITE-OP HANDLE (QUOTE FASL:FASL-T)))
                                                      ((PROG1 (CL:SETQ INDEX (FASL::LOOKUP-VALUE
                                                                              HANDLE VALUE))
                                                              (CL:WHEN FASL::*GATHER-DUMPER-STATS*
                                                                     (INCF FASL::*TABLE-ATTEMPTS*)))
                                                       (CL:WHEN FASL::*GATHER-DUMPER-STATS*
                                                              (INCF FASL::*TABLE-HITS*))
                                                       (FASL::DUMP-VALUE-FETCH HANDLE INDEX))
                                                      (T (TYPECASE VALUE (INTEGER (FASL::DUMP-INTEGER
                                                                                   HANDLE VALUE 
                                                                                   REMEMBER))
                                                                (RATIONAL (FASL::DUMP-RATIONAL HANDLE 
                                                                                 VALUE REMEMBER))
                                                                (SINGLE-FLOAT (FASL::DUMP-FLOAT32
                                                                               HANDLE VALUE REMEMBER)
                                                                       )
                                                                (COMPLEX (FASL::DUMP-COMPLEX HANDLE 
                                                                                VALUE REMEMBER))
                                                                (CHARACTER (FASL::DUMP-CHARACTER
                                                                            HANDLE VALUE REMEMBER))
                                                                (SYMBOL (FASL::DUMP-SYMBOL HANDLE 
                                                                               VALUE REMEMBER))
                                                                (PACKAGE (FASL::DUMP-PACKAGE HANDLE 
                                                                                VALUE REMEMBER))
                                                                (CONS (FASL::DUMP-LIST HANDLE VALUE 
                                                                             REMEMBER))
                                                                (DCODE (FASL::DUMP-DCODE HANDLE VALUE 
                                                                              REMEMBER))
                                                                (STRING (FASL::DUMP-STRING HANDLE 
                                                                               VALUE REMEMBER))
                                                                (ARRAY (FASL::DUMP-ARRAY HANDLE VALUE 
                                                                              REMEMBER))
                                                                (EVAL-WHEN-LOAD (FASL:DUMP-EVAL
                                                                                 HANDLE
                                                                                 (EVAL-WHEN-LOAD-FORM
                                                                                  VALUE)))
                                                                (OTHERWISE (CL:ERROR (QUOTE 
                                                                             FASL:OBJECT-NOT-DUMPABLE
                                                                                            )
                                                                                  :OBJECT VALUE))))))
                                           ))

(DEFUN FASL:DUMP-FUNCTION-DEF (HANDLE DCODE NAME) (FASL::STATE-CASE (:BLOCK (FASL::WRITE-OP
                                                                             HANDLE
                                                                             (QUOTE 
                                                                       FASL:FASL-SETF-SYMBOL-FUNCTION
                                                                                    ))
                                                                           (FASL:DUMP-VALUE HANDLE 
                                                                                  NAME)
                                                                           (FASL:DUMP-VALUE HANDLE 
                                                                                  DCODE))))

(DEFUN FASL:DUMP-FUNCALL (HANDLE FUNCTION) (FASL::STATE-CASE (:BLOCK (FASL::WRITE-OP HANDLE
                                                                            (QUOTE FASL:FASL-FUNCALL)
                                                                            )
                                                                    (FASL:DUMP-VALUE HANDLE FUNCTION)
                                                                    )))

(DEFUN FASL:DUMP-EVAL (HANDLE FORM) (FASL::STATE-CASE (:BLOCK (FASL::WRITE-OP HANDLE (QUOTE 
                                                                                       FASL:FASL-EVAL
                                                                                            ))
                                                             (FASL:DUMP-VALUE HANDLE FORM))))

(DEFUN FASL:CLOSE-FASL-HANDLE (HANDLE &REST CLOSE-OPTIONS &KEY ABORT &ALLOW-OTHER-KEYS)
   (FASL::STATE-CASE (:TEXT (FASL::END-TEXT HANDLE)
                            (FASL::END-BLOCK HANDLE))
          (:BLOCK (FASL::END-BLOCK HANDLE))
          (:BLOCK-END))
   (SETF (FASL::HANDLE-STATE HANDLE)
         :CLOSED)
   (CL:APPLY (CL:FUNCTION CLOSE)
          (FASL::HANDLE-STREAM HANDLE)
          CLOSE-OPTIONS))




(* ;;; "Reader.")

(DEF-DEFINE-TYPE FASL-OPS "FASL file opcodes" )

(DEFSTRUCT (FASL::OPTABLE (:CONSTRUCTOR FASL::NEW-OPTABLE)) VECTOR OPNAMES NEXT)




(* ;; "This shouldn't have to be in here, but defstruct isn't complete yet.")

(DEFOPTIMIZER FASL::OPTABLE-VECTOR (X) (BQUOTE (FETCH (FASL::OPTABLE VECTOR) OF (\, X))))

(DEFUN FASL:MAKE-OPTABLE NIL (LET ((TABLE (FASL::NEW-OPTABLE))
                                   (VECTOR (MAKE-ARRAY 256 :INITIAL-ELEMENT (QUOTE 
                                                                           FASL::UNIMPLEMENTED-OPCODE
                                                                                   ))))
                                  (SETF (FASL::OPTABLE-VECTOR TABLE)
                                        VECTOR)
                                  (SETF (SVREF VECTOR FASL::END-MARK)
                                        (QUOTE FASL::FASL-END-OF-BLOCK))
                                  TABLE))

(DEFUN FASL::FASL-END-OF-BLOCK (STREAM OP) (CL:IF (CL:ZEROP FASL::*BLOCK-LEVEL*)
                                                  (THROW (QUOTE FASL-BLOCK-FINISHED))
                                                  (CL:ERROR (QUOTE FASL:UNEXPECTED-END-OF-BLOCK)
                                                         :STREAM STREAM)))

(DEFDEFINER FASL:DEFOP FASL-OPS (NAME (OPCODE &KEY (INDIRECT 0)
                                             (TABLE (QUOTE FASL:*DEFAULT-OPTABLE*)))
                                      &BODY
                                      (BODY DECLS DOC))
                             (CL:IF (CL:ZEROP INDIRECT)
                                    (BQUOTE (PROGN (DEFUN (\, NAME) (STREAM OPCODE)
                                                      (\, (OR DOC "FASL opcode implementation"))
                                                      (\,@ DECLS)
                                                      (\,@ BODY))

                                                   (SETF (CL:ELT (FASL::OPTABLE-VECTOR (\, TABLE))
                                                                (\, OPCODE))
                                                         (QUOTE (\, NAME)))
                                                   (FASL::ADD-OP-TRANSLATION (QUOTE (\, NAME))
                                                          (\, OPCODE)
                                                          (\, TABLE))))
                                    (BQUOTE (PROGN (CL:UNLESS (FASL::OPTABLE-NEXT (\, TABLE))
                                                          (SETF (FASL::OPTABLE-NEXT (\, TABLE))
                                                                (FASL:MAKE-OPTABLE))
                                                          (FASL::SETESCAPE (\, TABLE)))
                                                   (FASL:DEFOP (\, NAME) ((\, OPCODE)
                                                                          :INDIRECT
                                                                          (\, (1- INDIRECT))
                                                                          :TABLE
                                                                          (FASL::OPTABLE-NEXT
                                                                           (\, TABLE)))
                                                      (\, (OR DOC "FASL opcode implementation"))
                                                      (\,@ DECLS)
                                                      (\,@ BODY))
))))

(DEFDEFINER FASL:DEFRANGE
   FASL-OPS (NAME (FIRST-OPCODE &KEY (INDIRECT 0)
                         (TABLE (QUOTE FASL:*DEFAULT-OPTABLE*)))
                  RANGE OFFSET &BODY (BODY DECLS DOC))
         (CL:IF (CL:ZEROP INDIRECT)
                (BQUOTE (PROGN (DEFUN (\, NAME) (STREAM OPCODE) (\, (OR DOC 
                                                                        "FASL opcode implementation")
                                                                    )
                                                                (\,@ DECLS)
                                                                (\,@ BODY))

                               (LET ((PACKAGE (SYMBOL-PACKAGE (QUOTE (\, NAME))))
                                     (PNAME (SYMBOL-NAME (QUOTE (\, NAME)))))
                                    (DOTIMES (I (\, RANGE))
                                           (LET ((OPCODE (+ I (\, FIRST-OPCODE))))
                                                (SETF (CL:ELT (FASL::OPTABLE-VECTOR (\, TABLE))
                                                             OPCODE)
                                                      (QUOTE (\, NAME)))
                                                (FASL::ADD-OP-TRANSLATION
                                                 (INTERN (CONCATENATE (QUOTE STRING)
                                                                PNAME
                                                                (WRITE-TO-STRING (+ I (\, OFFSET))))
                                                        PACKAGE)
                                                 OPCODE
                                                 (\, TABLE)))))))
                (BQUOTE (PROGN (CL:UNLESS (FASL::OPTABLE-NEXT (\, TABLE))
                                      (SETF (FASL::OPTABLE-NEXT (\, TABLE))
                                            (FASL:MAKE-OPTABLE))
                                      (FASL::SETESCAPE (\, TABLE)))
                               (FASL:DEFRANGE (\, NAME) ((\, FIRST-OPCODE)
                                                         :INDIRECT
                                                         (\, (1- INDIRECT))
                                                         :TABLE
                                                         (FASL::OPTABLE-NEXT (\, TABLE)))
                                  (\, (OR DOC "FASL opcode implementation"))
                                  (\,@ DECLS)
                                  (\,@ BODY))
))))

(DEFUN FASL::ADD-OP-TRANSLATION (NAME OPCODE TABLE) (LET ((PAIR (CL:ASSOC NAME (FASL::OPTABLE-OPNAMES
                                                                                TABLE))))
                                                         (CL:IF PAIR (SETF (CDR PAIR)
                                                                           OPCODE)
                                                                (CL:PUSH (CONS NAME OPCODE)
                                                                       (FASL::OPTABLE-OPNAMES TABLE))
                                                                )))

(DEFUN FASL:OPCODE-SEQUENCE (OPNAME &OPTIONAL (TABLE FASL:*DEFAULT-OPTABLE*)
                                   &AUX ENTRY) (COND
                                                  ((NULL TABLE)
                                                   NIL)
                                                  ((CL:SETQ ENTRY (CL:ASSOC OPNAME (
                                                                                FASL::OPTABLE-OPNAMES
                                                                                    TABLE)))
                                                   (LIST (CDR ENTRY)))
                                                  ((CL:SETQ ENTRY (FASL:OPCODE-SEQUENCE OPNAME
                                                                         (FASL::OPTABLE-NEXT TABLE)))
                                                   (CONS FASL::FASL-EXTENDED ENTRY))
                                                  (T NIL)))

(DEFUN FASL::FASL-EXTENDED (STREAM OP) (FASL:WITH-OPTABLE (FASL::OPTABLE-NEXT FASL::*CURRENT-OPTABLE*
                                                                 )
                                              (FASL::DO-OP STREAM)))

(DEFUN FASL::SETESCAPE (TABLE) (SETF (SVREF (FASL::OPTABLE-VECTOR TABLE)
                                            FASL::FASL-EXTENDED)
                                     (CL:FUNCTION FASL::FASL-EXTENDED)))

(DEFUN FASL::UNIMPLEMENTED-OPCODE (STREAM OPCODE) (CL:ERROR (QUOTE FASL:UNIMPLEMENTED-OPCODE)
                                                         :OPNAME OPCODE))

(DEFVAR FASL:*DEFAULT-OPTABLE* (FASL:MAKE-OPTABLE) )

(DEFVAR FASL::*CURRENT-OPTABLE* NIL)

(DEFPARAMETER FASL::INITIAL-VALUE-TABLE-SIZE 2048)

(DEFCONSTANT FASL::VALUE-TABLE-INCREMENT 1024)

(DEFVAR FASL::*VALUE-TABLE* NIL)

(DEFVAR FASL::*BLOCK-LEVEL* 0)

(DEFVAR FASL::DEBUG-READER NIL)

(DEFVAR FASL::DEBUG-STREAM NIL)

(DEFMACRO FASL:WITH-OPTABLE (TABLE &BODY BODY) (BQUOTE (LET ((FASL::*CURRENT-OPTABLE* (\, TABLE)))
                                                            (\,@ BODY))))

(DEFUN FASL:PROCESS-FILE (STREAM &KEY (TEXT-FN (CL:FUNCTION (LAMBDA (TEXT)
                                                                   (PRINC TEXT)
                                                                   (TERPRI))))
                                (ITEM-FN NIL)) "Calls FASL:PROCESS-SEGMENT with the approriate arguments for each segment in the file. The stream should be positioned at the beginning."
   (CL:UNLESS (EQL (BIN STREAM)
                   FASL:SIGNATURE)
          (CL:ERROR "Not a FASL file."))
   (FASL:CHECK-VERSION STREAM)
   (CL:DO NIL ((EOFP STREAM)
               (VALUES))
          (FASL:PROCESS-SEGMENT STREAM TEXT-FN ITEM-FN)))

(DEFUN FASL:CHECK-VERSION (STREAM) (LET ((VERSION (BIN16 STREAM)))
                                        (OR (AND (<= (CAR FASL::VERSION-RANGE)
                                                  VERSION)
                                                 (<= VERSION (CDR FASL::VERSION-RANGE)))
                                            (CL:ERROR "Version not supported: ~D." VERSION))))

(DEFUN FASL:PROCESS-SEGMENT (STREAM &OPTIONAL TEXT-FN ITEM-FN (OPTABLE FASL:*DEFAULT-OPTABLE*))
   (CL:IF TEXT-FN (FUNCALL TEXT-FN (FASL:READ-TEXT STREAM))
          (FASL:SKIP-TEXT STREAM))
   (FASL:PROCESS-BLOCK STREAM ITEM-FN OPTABLE))

(DEFUN FASL:READ-TEXT (STREAM) (CL:DO ((RESULT (MAKE-ARRAY 512 :ELEMENT-TYPE (QUOTE CHARACTER)
                                                      :ADJUSTABLE T :FILL-POINTER 0))
                                       (BYTE (BIN STREAM)
                                             (BIN STREAM)))
                                      ((EQL BYTE FASL::END-MARK)
                                       (CL:COERCE RESULT (QUOTE STRING)))
                                      (VECTOR-PUSH-EXTEND (CODE-CHAR BYTE)
                                             RESULT)))

(DEFUN FASL:PROCESS-BLOCK (STREAM &OPTIONAL ITEM-FN (OPTABLE FASL:*DEFAULT-OPTABLE*))
   (CATCH (QUOTE FASL-BLOCK-FINISHED)
          (FASL:WITH-OPTABLE OPTABLE (CL:DO ((FASL::*VALUE-TABLE* (FASL::NEW-VALUE-TABLE))
                                             VAL)
                                            NIL
                                            (SETF VAL (FASL::DO-OP STREAM 0))
                                            (CL:WHEN ITEM-FN (FUNCALL ITEM-FN VAL))))))

(DEFUN FASL:SKIP-TEXT (STREAM) (CL:DO ((BYTE (BIN STREAM)))
                                      ((EQL BYTE FASL::END-MARK)
                                       (VALUES))))

(DEFMACRO FASL:NEXT-VALUE NIL (QUOTE (FASL::DO-OP STREAM)))

(DEFUN FASL::DO-OP (STREAM &OPTIONAL (FASL::*BLOCK-LEVEL* (1+ FASL::*BLOCK-LEVEL*)))
   (LET ((OP (BIN STREAM))
         VAL)
        (CL:WHEN FASL::DEBUG-READER (FORMAT FASL::DEBUG-STREAM "~VT~A (~3O)~%%" (ITIMES 
                                                                                  FASL::*BLOCK-LEVEL* 
                                                                                       4)
                                           (CAR (RASSOC OP (FASL::OPTABLE-OPNAMES 
                                                                  FASL::*CURRENT-OPTABLE*)))
                                           OP))
        (CL:SETQ VAL (FUNCALL (SVREF (FASL::OPTABLE-VECTOR FASL::*CURRENT-OPTABLE*)
                                     OP)
                            STREAM OP))
        (CL:WHEN FASL::DEBUG-READER (FORMAT FASL::DEBUG-STREAM "~VTValue: ~S~%%" (ITIMES 
                                                                                  FASL::*BLOCK-LEVEL* 
                                                                                        4)
                                           VAL))
        (RETURN-FROM FASL::DO-OP VAL)))

(DEFUN FASL::NEW-VALUE-TABLE NIL (MAKE-ARRAY FASL::INITIAL-VALUE-TABLE-SIZE :FILL-POINTER 0 
                                        :EXTENDABLE T))

(DEFUN FASL::CLEAR-TABLE (&OPTIONAL (TABLE FASL::*VALUE-TABLE*)) (SETF (FILL-POINTER TABLE)
                                                                       0))

(DEFUN FASL::STORE-VALUE (OBJ &OPTIONAL (TABLE FASL::*VALUE-TABLE*)) 
                                                  (* ;; 
 "This may want to change to another representation if we can't make VECTOR-PUSH-EXTEND fast enough.")
   (VECTOR-PUSH-EXTEND OBJ TABLE FASL::VALUE-TABLE-INCREMENT)
   OBJ)

(DEFUN FASL::FETCH-VALUE (INDEX &OPTIONAL (TABLE FASL::*VALUE-TABLE*)) (AREF TABLE INDEX))

(DEFUN FASL::COLLECT-LIST (STREAM NELTS DOTTED) (CL:IF (AND DOTTED (EQL NELTS 2))
                                                       (RETURN-FROM FASL::COLLECT-LIST
                                                              (CONS (FASL::DO-OP STREAM)
                                                                    (FASL::DO-OP STREAM))))
                                                (CL:WHEN DOTTED (DECF NELTS))
                                                (LET ((RESULT (to NELTS collect (FASL::DO-OP STREAM))
                                                             ))
                                                  (* ;; 
                                                "Assume dotted and other than a simple cons is rare.")
                                                     (CL:WHEN DOTTED (SETF (CDR (LAST RESULT))
                                                                           (FASL::DO-OP STREAM)))
                                                     (RETURN-FROM FASL::COLLECT-LIST RESULT)))

(FASL:DEFRANGE FASL:FASL-SHORT-INTEGER (0) 128 0 OPCODE)

(FASL:DEFOP FASL:FASL-NIL (128) NIL)

(FASL:DEFOP FASL:FASL-T (129) T)

(FASL:DEFOP FASL:FASL-INTEGER (130) (IPLUS (LLSH (BIN STREAM)
                                                 24)
                                           (LLSH (BIN STREAM)
                                                 16)
                                           (LLSH (BIN STREAM)
                                                 8)
                                           (BIN STREAM)))

(FASL:DEFOP FASL:FASL-LARGE-INTEGER (131) (LET ((NBYTES (FASL:NEXT-VALUE))
                                                (FIRST-TIME T)
                                                (MASK 0))
                                               (CL:DO ((OFFSET (ITIMES (1- NBYTES)
                                                                      8)
                                                              (- OFFSET 8))
                                                       (RESULT 0)
                                                       BYTE)
                                                      ((< OFFSET 0)
                                                       (CL:IF (CL:ZEROP MASK)
                                                              RESULT
                                                              (- (1+ RESULT))))
                                                      (SETF BYTE (BIN STREAM))
                                                      (CL:WHEN FIRST-TIME (SETF FIRST-TIME NIL)
                                                             (CL:WHEN (> BYTE 127)
                                                                    (CL:SETQ MASK 255)))
                                                      (SETF (LDB (BYTE 8 OFFSET)
                                                                 RESULT)
                                                            (LOGXOR BYTE MASK)))))

(FASL:DEFOP FASL:FASL-RATIO (134) (/ (FASL:NEXT-VALUE)
                                     (FASL:NEXT-VALUE)))

(FASL:DEFOP FASL:FASL-COMPLEX (135) (COMPLEX (FASL:NEXT-VALUE)
                                           (FASL:NEXT-VALUE)))

(FASL:DEFOP FASL:FASL-VECTOR (136) (LET* ((NELTS (FASL:NEXT-VALUE))
                                          (VECTOR (MAKE-ARRAY NELTS :INITIAL-ELEMENT NIL)))
                                         (DOTIMES (I NELTS VECTOR)
                                                (SETF (AREF VECTOR I)
                                                      (FASL:NEXT-VALUE)))))

(FASL:DEFOP FASL:FASL-CREATE-ARRAY (137) (CL:APPLY (CL:FUNCTION MAKE-ARRAY)
                                                (FASL:NEXT-VALUE)
                                                (FASL:NEXT-VALUE)))

(FASL:DEFOP FASL:FASL-INITIALIZE-ARRAY (138) (LET* ((ARRAY (FASL:NEXT-VALUE))
                                                    (INDIRECT (%%FLATTEN-ARRAY ARRAY))
                                                    (NELTS (FASL:NEXT-VALUE)))
                                                   (DOTIMES (I NELTS ARRAY)
                                                          (SETF (AREF INDIRECT I)
                                                                (FASL:NEXT-VALUE)))))

(FASL:DEFOP FASL:FASL-INITIALIZE-BIT-ARRAY (139)
   (LET* ((ARRAY (FASL::DO-OP STREAM))
          (BASE (%%ARRAY-BASE ARRAY))
          (NBITS (FASL::DO-OP STREAM)))
         (MULTIPLE-VALUE-BIND (NBYTES LEFTOVER)
                (CL:FLOOR NBITS 8)
                (CL:UNLESS (CL:ZEROP LEFTOVER)
                       (CL:DO* ((INITIAL (ITIMES NBYTES 8))
                                (INDIRECT (%%FLATTEN-ARRAY ARRAY))
                                (LAST-BYTE (BIN STREAM))
                                (I 0 (1+ I)))
                              ((= I LEFTOVER))
                              (SETF (BIT INDIRECT (+ INITIAL I))
                                    (LET ((BS (BYTE 1 (- 7 I))))
                                         (LDB BS LAST-BYTE)))))
                ARRAY)))

(FASL:DEFOP FASL:FASL-THIN-STRING (140) (LET* ((NCHARS (FASL:NEXT-VALUE))
                                               (STRING (ALLOCSTRING NCHARS)))
                                              (\BINS STREAM (fetch (STRINGP BASE) of STRING)
                                                     0 NCHARS)
                                              STRING))

(FASL:DEFOP FASL:FASL-FAT-STRING (141) (LET* ((NCHARS (FASL:NEXT-VALUE))
                                              (STRING (ALLOCSTRING NCHARS)))
                                             (CHARSET STREAM 0)
                                             (UNWIND-PROTECT (DOTIMES (I NCHARS STRING)
                                                                    (SETF (SVREF STRING I)
                                                                          (CODE-CHAR (READCCODE
                                                                                      STREAM))))
                                                    (CHARSET STREAM 0))))

(FASL:DEFOP FASL:FASL-CHARACTER (142) (LET ((CODE (BIN STREAM)))
                                           (CODE-CHAR (CL:IF (EQL CODE 255)
                                                             (BIN16 STREAM)
                                                             CODE))))

(FASL:DEFOP FASL:FASL-LISP-SYMBOL (143) (INTERN (FASL:NEXT-VALUE)
                                               (FIND-PACKAGE "LISP")))

(FASL:DEFOP FASL:FASL-KEYWORD-SYMBOL (144) (INTERN (FASL:NEXT-VALUE)
                                                  (FIND-PACKAGE "KEYWORD")))

(FASL:DEFOP FASL:FASL-FIND-PACKAGE (145) (FIND-PACKAGE (FASL:NEXT-VALUE)))

(FASL:DEFOP FASL:FASL-SYMBOL-IN-PACKAGE (146) (INTERN (FASL:NEXT-VALUE)
                                                     (FASL:NEXT-VALUE)))

(FASL:DEFOP FASL:FASL-LIST (147) (FASL::COLLECT-LIST STREAM (FASL:NEXT-VALUE)
                                        NIL))

(FASL:DEFOP FASL:FASL-LIST* (148) (FASL::COLLECT-LIST STREAM (FASL:NEXT-VALUE)
                                         T))

(FASL:DEFOP FASL:FASL-DCODE (150)                 (* ;;; "DIRE WARNING!!! Be sure you have your pointy hat with lots of stars on if you're going to muck around with this code. Due to unfortunately unaviodaple performace requirements, this code duplicates INTERN-DCODE. If you make a change here, you should probably change the corresponding code there.")
   (LET ((OVERHEADBYTES (CL:* (fetch (FNHEADER OVERHEADWORDS) of T)
                              BYTESPERWORD))
         NT-COUNT RAW-CODE START-PC CLOSURE-INFO)
        (SETF NT-COUNT (FASL:NEXT-VALUE))
        (LET ((CODE-LEN (FASL:NEXT-VALUE)))
             (MULTIPLE-VALUE-SETQ (RAW-CODE START-PC)
                    (ALLOCATE-CODE-BLOCK NT-COUNT CODE-LEN))
             (\BINS STREAM RAW-CODE START-PC CODE-LEN)
             (replace (FNHEADER STARTPC) of RAW-CODE with START-PC))
                                                  (* ;; "Set up the free variable lookup name table.")
        (CL:DO* ((I 0 (1+ I))
                 (INDEX OVERHEADBYTES (+ INDEX BYTESPERWORD))
                                                  (* ;; 
                         "NTSIZE and NTBYTESIZE the sizes of half the table in words and bytes resp.")
                 (NTSIZE (CEIL (1+ NT-COUNT)
                               WORDSPERQUAD))
                 (NTBYTESIZE (CL:* NTSIZE BYTESPERWORD))
                 PFI OFFSET NAME FVAROFFSET)
               ((>= I NT-COUNT)
                (replace (FNHEADER FVAROFFSET) of RAW-CODE with (OR FVAROFFSET 0))
                (replace (FNHEADER NTSIZE) of RAW-CODE with NTSIZE))
               (SETF PFI (BIN STREAM))
               (SETF OFFSET (FASL:NEXT-VALUE))
               (SETF NAME (FASL:NEXT-VALUE))
               (FIXUP-WORD RAW-CODE INDEX (\LOLOC NAME))
               (FIXUP-WORD RAW-CODE (+ INDEX NTBYTESIZE)
                      (+ (LLSH PFI 14)
                         OFFSET))
               (CL:WHEN (AND (NULL FVAROFFSET)
                             (= PFI +FVAR-CODE+))
                      (SETF FVAROFFSET (CL:FLOOR INDEX BYTESPERWORD))))
                                                  (* ;; 
                                           "Fill in the fixed-size fields at the front of the block.")
        (LET ((FRAME-NAME (FASL:NEXT-VALUE)))
             (UNINTERRUPTABLY
                 (\ADDREF FRAME-NAME)
                 (replace (FNHEADER #FRAMENAME) of RAW-CODE with FRAME-NAME)))
        (LET ((NLOCALS (BIN STREAM))
              (NFREEVARS (BIN STREAM)))
             (replace (FNHEADER NLOCALS) of RAW-CODE with NLOCALS)
             (replace (FNHEADER PV) of RAW-CODE with (1- (CEILING (+ NLOCALS NFREEVARS)
                                                                CELLSPERQUAD))))
        (replace (FNHEADER ARGTYPE) of RAW-CODE with (BIN STREAM))
        (replace (FNHEADER NA) of RAW-CODE with (FASL:NEXT-VALUE))
        (SETF CLOSURE-INFO (FASL:NEXT-VALUE))
        (replace (FNHEADER CLOSUREP) of RAW-CODE with (CL:IF (EQ CLOSURE-INFO :CLOSURE)
                                                             1 0))
        (replace (FNHEADER FIXED) of RAW-CODE with T)
                                                  (* ;; "Fill in debugging info. It goes into the spare cell just before the code: it's -3 instead of -bytespercell to right-justify the pointer in the cell. Aren't you glad I told you this?")
        (FIXUP-PTR RAW-CODE (- START-PC 3)
               (FASL:NEXT-VALUE))                            (* ;; "Do fixups")
        (CL:DO ((FN-FIXUP-COUNT (FASL:NEXT-VALUE))
                (I 0 (1+ I))
                OFFSET VALUE)
               ((>= I FN-FIXUP-COUNT))
               (SETF OFFSET (FASL:NEXT-VALUE))
               (SETF VALUE (FASL:NEXT-VALUE))
               (FIXUP-WORD RAW-CODE (+ START-PC OFFSET)
                      (\LOLOC VALUE)))
        (CL:DO ((SYM-FIXUP-COUNT (FASL:NEXT-VALUE))
                (I 0 (1+ I))
                OFFSET VALUE)
               ((>= I SYM-FIXUP-COUNT))
               (SETF OFFSET (FASL:NEXT-VALUE))
               (SETF VALUE (FASL:NEXT-VALUE))
               (FIXUP-WORD RAW-CODE (+ START-PC OFFSET)
                      (\LOLOC VALUE)))
        (CL:DO ((LIT-FIXUP-COUNT (FASL:NEXT-VALUE))
                (I 0 (1+ I))
                OFFSET VALUE)
               ((>= I LIT-FIXUP-COUNT))
               (SETF OFFSET (FASL:NEXT-VALUE))
               (SETF VALUE (FASL:NEXT-VALUE))
               (FIXUP-PTR RAW-CODE (+ START-PC OFFSET)
                      (CL:IF (DCODE-P VALUE)
                             (INTERN-DCODE VALUE)
                             VALUE)))
        (CL:DO ((TYPE-FIXUP-COUNT (FASL:NEXT-VALUE))
                (I 0 (1+ I))
                OFFSET VALUE)
               ((>= I TYPE-FIXUP-COUNT))
               (SETF OFFSET (FASL:NEXT-VALUE))
               (SETF VALUE (FASL:NEXT-VALUE))
               (FIXUP-WORD RAW-CODE (+ START-PC OFFSET)
                      (\RESOLVE.TYPENUMBER VALUE)))
                                                  (* ;; 
                                              "Finally, wrap this up in a closure-object if desired.")
        (CL:IF (EQ CLOSURE-INFO :FUNCTION)
               (MAKE-COMPILED-CLOSURE RAW-CODE NIL)
               RAW-CODE)))

(FASL:DEFOP FASL:FASL-TABLE-STORE (152) (FASL::STORE-VALUE (FASL:NEXT-VALUE)))

(FASL:DEFOP FASL:FASL-TABLE-FETCH (153) (FASL::FETCH-VALUE (FASL:NEXT-VALUE)))

(FASL:DEFOP FASL:FASL-VERIFY-TABLE-SIZE (154) (LET ((EXPECTED (FASL:NEXT-VALUE)))
                                                   (OR (EQL EXPECTED (CL:LENGTH FASL::*VALUE-TABLE*))
                                                       (CL:ERROR (QUOTE FASL:INCONSISTENT-TABLE)
                                                              :TABLE FASL::*VALUE-TABLE* :EXPECTED 
                                                              EXPECTED))))

(FASL:DEFOP FASL:FASL-EVAL (155) (CL:EVAL (FASL:NEXT-VALUE)))

(FASL:DEFOP FASL:FASL-FLOAT32 (132) (LET ((RESULT (NCREATE (QUOTE FLOATP))))
                                         (\BINS STREAM RESULT 0 4)
                                         RESULT))

(FASL:DEFOP FASL:FASL-SETF-SYMBOL-FUNCTION (156) (SETF (SYMBOL-FUNCTION (FASL:NEXT-VALUE))
                                                       (FASL:NEXT-VALUE)))

(FASL:DEFOP FASL:FASL-FUNCALL (157) (FUNCALL (FASL:NEXT-VALUE)))


(PUTPROPS FASL FILETYPE COMPILE-FILE)
(DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML )

(ADDTOVAR LAMA FASL::SO-THAT-THE-FILE-WILL-GET-COMPILED)
)
(PUTPROPS FASL COPYRIGHT ("Xerox Corporation" 1986))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (5272 5348 (FASL::SO-THAT-THE-FILE-WILL-GET-COMPILED 5282 . 5346)))))
STOP