X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fdefstruct.lisp;h=9ff1cb91cf60397db1761ffbdd5f14b6512d38f1;hb=b7e68df14bbdcee894af620e4168328797be94b9;hp=0f25b5dff919d5141b9ecc7bd160bc06e719a86e;hpb=2fdd5c9276ba68458e1186c8ae3b7b5a42729a6f;p=sbcl.git diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index 0f25b5d..9ff1cb9 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -31,20 +31,20 @@ (and layout (typep (layout-info layout) 'defstruct-description)))) (sb!xc:defmacro %make-structure-instance-macro (dd slot-specs &rest slot-vars) - `(truly-the ,(dd-name dd) - ,(if (compiler-layout-ready-p (dd-name dd)) - `(%make-structure-instance ,dd ,slot-specs ,@slot-vars) - ;; Non-toplevel defstructs don't have a layout at compile time, - ;; so we need to construct the actual function at runtime -- but - ;; we cache it at the call site, so that we don't perform quite - ;; so horribly. - `(let* ((cell (load-time-value (list nil))) - (fun (car cell))) - (if (functionp fun) - (funcall fun ,@slot-vars) - (funcall (setf (car cell) - (%make-structure-instance-allocator ,dd ,slot-specs)) - ,@slot-vars)))))) + (if (compiler-layout-ready-p (dd-name dd)) + `(truly-the ,(dd-name dd) + (%make-structure-instance ,dd ,slot-specs ,@slot-vars)) + ;; Non-toplevel defstructs don't have a layout at compile time, + ;; so we need to construct the actual function at runtime -- but + ;; we cache it at the call site, so that we don't perform quite + ;; so horribly. + `(let* ((cell (load-time-value (list nil))) + (fun (car cell))) + (if (functionp fun) + (funcall fun ,@slot-vars) + (funcall (setf (car cell) + (%make-structure-instance-allocator ,dd ,slot-specs)) + ,@slot-vars))))) (declaim (ftype (sfunction (defstruct-description list) function) %make-structure-instance-allocator)) @@ -1127,10 +1127,10 @@ (let* ((accessor-name (dsd-accessor-name dsd)) (dsd-type (dsd-type dsd))) (when accessor-name - (setf (info :function :structure-accessor accessor-name) dd) (let ((inherited (accessor-inherited-data accessor-name dd))) (cond ((not inherited) + (setf (info :function :structure-accessor accessor-name) dd) (multiple-value-bind (reader-designator writer-designator) (slot-accessor-transforms dd dsd) (sb!xc:proclaim `(ftype (sfunction (,dtype) ,dsd-type) @@ -1542,7 +1542,9 @@ arg (arglist `(,name ,def ,@(if supplied-test-p `(,supplied-test) nil))) (vars name) - (arg-type (get-slot name)))) + (arg-type (get-slot name)) + (when supplied-test-p + (vars supplied-test)))) (t (do-default arg))))) @@ -1573,7 +1575,9 @@ (arglist `(,wot ,(if def-p def slot-def) ,@(if supplied-test-p `(,supplied-test) nil))) (vars name) - (arg-type type key name)))) + (arg-type type key name) + (when supplied-test-p + (vars supplied-test))))) (do-default key t)))) (when allowp