0.pre7.35:
[sbcl.git] / src / pcl / dlisp.lisp
index 8e769f3..a8400de 100644 (file)
 ;;;; specification.
 
 (in-package "SB-PCL")
-
-(sb-int:file-comment
-  "$Header$")
 \f
-;;; This file is (almost) functionally equivalent to dlap.lisp, but easier to
-;;; read.
+;;; This file is (almost) functionally equivalent to dlap.lisp, but
+;;; easier to read.
 
-;;; Might generate faster code, too, depending on the compiler and whether an
-;;; implementation-specific lap assembler was used.
+;;; Might generate faster code, too, depending on the compiler and
+;;; whether an implementation-specific lap assembler was used.
 
 (defun emit-one-class-reader (class-slot-p)
   (emit-reader/writer :reader 1 class-slot-p))
                          ,form)))))
     (values (if *precompiling-lap*
                `#',lambda
-               (compile-lambda lambda))
+               (compile nil lambda))
            nil)))
 
 ;;; note on implementation for CMU 17 and later (including SBCL):
                                   (eq wrapper wrapper-1)))))
              ,@(if readp
                    `((let ((value ,read-form))
-                       (unless (eq value *slot-unbound*)
+                       (unless (eq value +slot-unbound+)
                          (return-from access value))))
                    `((return-from access (setf ,read-form ,(car arglist))))))
            (funcall miss-fn ,@arglist))))))
 (defun emit-slot-read-form (class-slot-p index slots)
   (if class-slot-p
       `(cdr ,index)
-      `(%instance-ref ,slots ,index)))
+      `(clos-slots-ref ,slots ,index)))
+
+(defun emit-slot-write-form (class-slot-p index slots value)
+  (if class-slot-p
+      `(setf (cdr ,index) ,value)
+      `(and ,slots (setf (clos-slots-ref ,slots ,index) ,value))))
 
 (defun emit-boundp-check (value-form miss-fn arglist)
   `(let ((value ,value-form))
-     (if (eq value *slot-unbound*)
+     (if (eq value +slot-unbound+)
         (funcall ,miss-fn ,@arglist)
         value)))
 
 (defun emit-slot-access (reader/writer class-slot-p slots index miss-fn arglist)
-  (let ((read-form (emit-slot-read-form class-slot-p index slots)))
+  (let ((read-form (emit-slot-read-form class-slot-p index slots))
+        (write-form (emit-slot-write-form
+                     class-slot-p index slots (car arglist))))
     (ecase reader/writer
       (:reader (emit-boundp-check read-form miss-fn arglist))
-      (:writer `(setf ,read-form ,(car arglist))))))
+      (:writer write-form))))
 
 (defmacro emit-reader/writer-macro (reader/writer 1-or-2-class class-slot-p)
   (let ((*emit-function-p* nil)
 (defun emit-dlap (args metatypes hit miss value-reg &optional slot-regs)
   (let* ((index -1)
         (wrapper-bindings (mapcan #'(lambda (arg mt)
-                                      (unless (eq mt 't)
+                                      (unless (eq mt t)
                                         (incf index)
                                         `((,(intern (format nil
                                                             "WRAPPER-~D"