;;;; SIMPLE-FUN-DEBUG-INFO slot holding a tagged object which needs
;;;; to be GCed, you need to tweak scav_code_header() and
;;;; verify_space() in gencgc.c, and the corresponding code in gc.c.
+;;;; * The src/runtime/print.c code (used by LDB) is implemented
+;;;; using hand-written lists of slot names, which aren't automatically
+;;;; generated from the code in this file.
;;;; * Various code (e.g. STATIC-FSET in genesis.lisp) is hard-wired
;;;; to know the name of the last slot of the object the code works
;;;; with, and implicitly to know that the last slot is special (being
:ref-trans %simple-fun-name
:set-known (unsafe)
:set-trans (setf %simple-fun-name))
- (arglist :ref-known (flushable)
+ (arglist :type list
+ :ref-known (flushable)
:ref-trans %simple-fun-arglist
:set-known (unsafe)
:set-trans (setf %simple-fun-arglist))
(define-primitive-object (symbol :lowtag other-pointer-lowtag
:widetag symbol-header-widetag
#!-x86 :alloc-trans #!-x86 make-symbol)
+
+ ;; Beware when changing this definition. NIL-the-symbol is defined
+ ;; using this layout, and NIL-the-end-of-list-marker is the cons
+ ;; ( NIL . NIL ), living in the first two slots of NIL-the-symbol
+ ;; (conses have no header). Careful selection of lowtags ensures
+ ;; that the same pointer can be used for both purposes:
+ ;; OTHER-POINTER-LOWTAG is 7, LIST-POINTER-LOWTAG is 3, so if you
+ ;; subtract 3 from (sb-kernel:get-lisp-obj-address 'NIL) you get the
+ ;; first data slot, and if you subtract 7 you get a symbol header.
+
(value :set-trans %set-symbol-value
- :init :unbound)
- #!+x86 (hash)
+ :init :unbound) ;also the CAR of NIL-as-end-of-list
+ (hash) ;the CDR of NIL-as-end-of-list
+
(plist :ref-trans symbol-plist
:set-trans %set-symbol-plist
:init :null)