Function: eieio-oset-default

eieio-oset-default is a byte-compiled function defined in eieio-core.el.gz.

Signature

(eieio-oset-default CLASS SLOT VALUE)

Documentation

Do the work for the macro oset-default.

Fills in the default value in CLASS' in SLOT with VALUE.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/eieio-core.el.gz
(defun eieio-oset-default (class slot value)
  "Do the work for the macro `oset-default'.
Fills in the default value in CLASS' in SLOT with VALUE."
  (declare (compiler-macro
            (lambda (exp)
              (ignore class value)
              (pcase slot
                ((and (or `',name (and name (pred keywordp)))
                      (guard (not (eieio--known-slot-name-p name))))
                 (macroexp-warn-and-return
                  (format-message "Unknown slot `%S'" name)
                  exp nil 'compile-only name))
                ((and (or `',name (and name (pred keywordp)))
                      (guard (not (memq name eieio--known-class-slot-names))))
                 (macroexp-warn-and-return
                  (format-message "Slot `%S' is not class-allocated" name)
                  exp nil 'compile-only name))
                (_ exp)))))
  (setq class (eieio--class-object class))
  (cl-check-type class eieio--class)
  (cl-check-type slot symbol)
  (let* ((c (eieio--slot-name-index class slot)))
    (if (not c)
        ;; It might be missing because it is a :class allocated slot.
        ;; Let's check that info out.
        (if (setq c (eieio--class-slot-name-index class slot))
            (progn
              ;; Oref that slot.
              (eieio--validate-class-slot-value class c value slot)
              (aset (eieio--class-class-allocation-values class) c
                    value))
          (signal 'invalid-slot-name (list (cl--class-name class) slot)))
      ;; `oset-default' on an instance-allocated slot is allowed by EIEIO but
      ;; not by CLOS and is mildly inconsistent with the :initform thingy, so
      ;; it'd be nice to get rid of it.
      ;; This said, it is/was used at one place by gnus/registry.el, so it
      ;; might be used elsewhere as well, so let's keep it for now.
      ;; FIXME: Generate a compile-time warning for it!
      ;; (error "Can't `oset-default' an instance-allocated slot: %S of %S"
      ;;        slot class)
      (eieio--validate-slot-value class c value slot)
      ;; Set this into the storage for defaults.
      (setf (cl--slot-descriptor-initform
             (aref (eieio--class-slots class)
                   (- c (eval-when-compile eieio--object-num-slots))))
            (macroexp-quote value))
      ;; Take the value, and put it into our cache object.
      (eieio-oset (eieio--class-default-object-cache class)
                  slot value)
      )))