X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fdefstruct.lisp;h=338c09a991ce59d85dc801d306260a0120465093;hb=119c1bcd2cfff74d2968209207ea34ba0e1739f7;hp=e4f6fb26b5bbc24fb9da271dabd8bf6ad6c493eb;hpb=085501b44cc1cbdd9e260139d30b383372ddd1b8;p=sbcl.git diff --git a/src/code/defstruct.lisp b/src/code/defstruct.lisp index e4f6fb2..338c09a 100644 --- a/src/code/defstruct.lisp +++ b/src/code/defstruct.lisp @@ -933,9 +933,14 @@ ;;; Return a LAMBDA form which can be used to set a slot. (defun slot-setter-lambda-form (dd dsd) - `(lambda (new-value instance) - ,(funcall (nth-value 1 (slot-accessor-transforms dd dsd)) - '(dummy new-value instance)))) + ;; KLUDGE: Evaluating the results of SLOT-ACCESSOR-TRANSFORMS needs + ;; a lexenv. + (let ((sb!c:*lexenv* (if (boundp 'sb!c:*lexenv*) + sb!c:*lexenv* + (sb!c::make-null-lexenv)))) + `(lambda (new-value instance) + ,(funcall (nth-value 1 (slot-accessor-transforms dd dsd)) + '(dummy new-value instance))))) ;;; core compile-time setup of any class with a LAYOUT, used even by ;;; !DEFSTRUCT-WITH-ALTERNATE-METACLASS weirdosities @@ -1029,6 +1034,7 @@ (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) @@ -1733,49 +1739,4 @@ (when errorp (error "No DEFSTRUCT-DESCRIPTION for ~S." name))))) -(defun structure-slot-index (type slot-name &optional (errorp t)) - (let ((slotd (find slot-name - (dd-slots (find-defstruct-description type)) - :key #'dsd-name))) - (if slotd - (dsd-index slotd) - (when errorp - (error "No slot named ~S in ~S." slot-name type))))) - -;;; Used internally, but it would be nice to provide something -;;; like this for users as well. -#!+sb-thread -(defmacro define-structure-slot-compare-and-exchange - (name &key structure slot) - (let* ((dd (find-defstruct-description structure t)) - (slotd (when dd (find slot (dd-slots dd) :key #'dsd-name))) - (type (when slotd (dsd-type slotd))) - (index (when slotd (dsd-index slotd)))) - (unless index - (error "Slot ~S not found in ~S." slot structure)) - `(progn - (declaim (inline ,name)) - (defun ,name (instance old new) - (declare (type ,structure instance) - (type ,type new)) - (sb!vm::%instance-set-conditional instance ,index old new))))) - -;;; Ditto -#!+sb-thread -(defmacro define-structure-slot-addressor (name &key structure slot) - (let* ((dd (find-defstruct-description structure t)) - (slotd (when dd (find slot (dd-slots dd) :key #'dsd-name))) - (index (when slotd (dsd-index slotd)))) - (unless index - (error "Slot ~S not found in ~S." slot structure)) - `(progn - (declaim (inline ,name)) - (defun ,name (instance) - (declare (type ,structure instance) (optimize speed)) - (sb!ext:truly-the - sb!vm:word - (+ (sb!kernel:get-lisp-obj-address instance) - (- (* ,(+ sb!vm:instance-slots-offset index) sb!vm:n-word-bytes) - sb!vm:instance-pointer-lowtag))))))) - (/show0 "code/defstruct.lisp end of file")