X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-defstruct.lisp;h=4e9b59658522260470f672dae56615517abb2265;hb=2a03fda8299baea66cb9a6955d414dcc27af5ac9;hp=f179459a85bd96ef77485f38bf886efa4146adca;hpb=c55397520c6238fb878bb80ed6687da1700b66ca;p=sbcl.git diff --git a/src/code/target-defstruct.lisp b/src/code/target-defstruct.lisp index f179459..4e9b596 100644 --- a/src/code/target-defstruct.lisp +++ b/src/code/target-defstruct.lisp @@ -31,6 +31,29 @@ (defun %instance-set (instance index new-value) (setf (%instance-ref instance index) new-value)) +;;; Normally IR2 converted, definition needed for interpreted structure +;;; constructors only. +#!+sb-eval +(defun %make-structure-instance (dd slot-specs &rest slot-values) + (let ((instance (%make-instance (dd-instance-length dd)))) + (setf (%instance-layout instance) (dd-layout-or-lose dd)) + (mapc (lambda (spec value) + (destructuring-bind (raw-type . index) (cdr spec) + (macrolet ((make-case () + `(ecase raw-type + ((t) + (setf (%instance-ref instance index) value)) + ,@(mapcar + (lambda (rsd) + `(,(raw-slot-data-raw-type rsd) + (setf (,(raw-slot-data-accessor-name rsd) + instance index) + value))) + *raw-slot-data-list*)))) + (make-case)))) + slot-specs slot-values) + instance)) + #!-hppa (progn (defun %raw-instance-ref/word (instance index) @@ -151,19 +174,6 @@ (defun (setf funcallable-instance-fun) (new-value fin) (setf (%funcallable-instance-function fin) new-value)) - -;;; service function for structure constructors -(defun %make-instance-with-layout (layout) - ;; Make sure the object ends at a two-word boundary. Note that this does - ;; not affect the amount of memory used, since the allocator would add the - ;; same padding anyway. However, raw slots are indexed from the length of - ;; the object as indicated in the header, so the pad word needs to be - ;; included in that length to guarantee proper alignment of raw double float - ;; slots, necessary for (at least) the SPARC backend. - (let* ((length (layout-length layout)) - (result (%make-instance (+ length (mod (1+ length) 2))))) - (setf (%instance-layout result) layout) - result)) ;;;; target-only parts of the DEFSTRUCT top level code @@ -404,7 +414,7 @@ (when (layout-invalid layout) (error "attempt to copy an obsolete structure:~% ~S" structure)) - ;; Copy ordinary slots. + ;; Copy ordinary slots and layout. (dotimes (i (- len nuntagged)) (declare (type index i)) (setf (%instance-ref res i)