(in-package "SB-PCL")
\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"