📄 objdef.lisp
字号:
;;;; machine-independent aspects of the object representation;;;; This software is part of the SBCL system. See the README file for;;;; more information.;;;;;;;; This software is derived from the CMU CL system, which was;;;; written at Carnegie Mellon University and released into the;;;; public domain. The software is in the public domain and is;;;; provided with absolutely no warranty. See the COPYING and CREDITS;;;; files for more information.(in-package "SB!VM");;;; KLUDGE: The primitive objects here may look like self-contained;;;; definitions, but in general they're not. In particular, if you;;;; try to add a slot to them, beware of the following:;;;; * (mysterious crashes which occur after changing the length;;;; of SIMPLE-FUN, just adding a new slot not even doing anything;;;; with it, still dunno why);;;; * The GC scavenging code (and for all I know other GC code too);;;; is not automatically generated from these layouts, but instead;;;; was hand-written to correspond to them. The offsets are;;;; automatically propagated into the GC scavenging code, but the;;;; existence of slots, and whether they should be scavenged, is;;;; not automatically propagated. Thus e.g. if you add a;;;; 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;;;; the beginning of an arbitrary-length sequence of bytes following;;;; the fixed-layout slots).;;;; -- WHN 2001-12-29;;;; the primitive objects themselves(define-primitive-object (cons :lowtag list-pointer-lowtag :alloc-trans cons) (car :ref-trans car :set-trans sb!c::%rplaca :init :arg :cas-trans %compare-and-swap-car) (cdr :ref-trans cdr :set-trans sb!c::%rplacd :init :arg :cas-trans %compare-and-swap-cdr))(define-primitive-object (instance :lowtag instance-pointer-lowtag :widetag instance-header-widetag :alloc-trans %make-instance) (slots :rest-p t))(define-primitive-object (bignum :lowtag other-pointer-lowtag :widetag bignum-widetag :alloc-trans sb!bignum::%allocate-bignum) (digits :rest-p t :c-type #!-alpha "long" #!+alpha "u32"))(define-primitive-object (ratio :type ratio :lowtag other-pointer-lowtag :widetag ratio-widetag :alloc-trans %make-ratio) (numerator :type integer :ref-known (flushable movable) :ref-trans %numerator :init :arg) (denominator :type integer :ref-known (flushable movable) :ref-trans %denominator :init :arg))#!+#.(cl:if (cl:= sb!vm:n-word-bits 32) '(and) '(or))(define-primitive-object (single-float :lowtag other-pointer-lowtag :widetag single-float-widetag) (value :c-type "float"))(define-primitive-object (double-float :lowtag other-pointer-lowtag :widetag double-float-widetag) #!-x86-64 (filler) (value :c-type "double" :length #!-x86-64 2 #!+x86-64 1))#!+long-float(define-primitive-object (long-float :lowtag other-pointer-lowtag :widetag long-float-widetag) #!+sparc (filler) (value :c-type "long double" :length #!+x86 3 #!+sparc 4))(define-primitive-object (complex :type complex :lowtag other-pointer-lowtag :widetag complex-widetag :alloc-trans %make-complex) (real :type real :ref-known (flushable movable) :ref-trans %realpart :init :arg) (imag :type real :ref-known (flushable movable) :ref-trans %imagpart :init :arg))(define-primitive-object (array :lowtag other-pointer-lowtag :widetag t) ;; FILL-POINTER of an ARRAY is in the same place as LENGTH of a ;; VECTOR -- see SHRINK-VECTOR. (fill-pointer :type index :ref-trans %array-fill-pointer :ref-known (flushable foldable) :set-trans (setf %array-fill-pointer) :set-known (unsafe)) (fill-pointer-p :type (member t nil) :ref-trans %array-fill-pointer-p :ref-known (flushable foldable) :set-trans (setf %array-fill-pointer-p) :set-known (unsafe)) (elements :type index :ref-trans %array-available-elements :ref-known (flushable foldable) :set-trans (setf %array-available-elements) :set-known (unsafe)) (data :type array :ref-trans %array-data-vector :ref-known (flushable foldable) :set-trans (setf %array-data-vector) :set-known (unsafe)) (displacement :type (or index null) :ref-trans %array-displacement :ref-known (flushable foldable) :set-trans (setf %array-displacement) :set-known (unsafe)) (displaced-p :type (member t nil) :ref-trans %array-displaced-p :ref-known (flushable foldable) :set-trans (setf %array-displaced-p) :set-known (unsafe)) (dimensions :rest-p t))(define-primitive-object (vector :type vector :lowtag other-pointer-lowtag :widetag t) ;; FILL-POINTER of an ARRAY is in the same place as LENGTH of a ;; VECTOR -- see SHRINK-VECTOR. (length :ref-trans sb!c::vector-length :type index) (data :rest-p t :c-type #!-alpha "unsigned long" #!+alpha "u32"))(define-primitive-object (code :type code-component :lowtag other-pointer-lowtag :widetag t) (code-size :type index :ref-known (flushable movable) :ref-trans %code-code-size) (entry-points :type (or function null) :ref-known (flushable) :ref-trans %code-entry-points :set-known (unsafe) :set-trans (setf %code-entry-points)) (debug-info :type t :ref-known (flushable) :ref-trans %code-debug-info :set-known (unsafe) :set-trans (setf %code-debug-info)) (trace-table-offset) (constants :rest-p t))(define-primitive-object (fdefn :type fdefn :lowtag other-pointer-lowtag :widetag fdefn-widetag) (name :ref-trans fdefn-name) (fun :type (or function null) :ref-trans fdefn-fun) (raw-addr :c-type #!-alpha "char *" #!+alpha "u32"));;; a simple function (as opposed to hairier things like closures;;; which are also subtypes of Common Lisp's FUNCTION type)(define-primitive-object (simple-fun :type function :lowtag fun-pointer-lowtag :widetag simple-fun-header-widetag) #!-(or x86 x86-64) (self :ref-trans %simple-fun-self :set-trans (setf %simple-fun-self)) #!+(or x86 x86-64) (self ;; KLUDGE: There's no :SET-KNOWN, :SET-TRANS, :REF-KNOWN, or ;; :REF-TRANS here in this case. Instead, there's separate ;; DEFKNOWN/DEFINE-VOP/DEFTRANSFORM stuff in ;; compiler/x86/system.lisp to define and declare them by ;; hand. I don't know why this is, but that's (basically) ;; the way it was done in CMU CL, and it works. (It's not ;; exactly the same way it was done in CMU CL in that CMU ;; CL's allows duplicate DEFKNOWNs, blithely overwriting any ;; previous data associated with the previous DEFKNOWN, and ;; that property was used to mask the definitions here. In ;; SBCL as of 0.6.12.64 that's not allowed -- too confusing! ;; -- so we have to explicitly suppress the DEFKNOWNish ;; stuff here in order to allow this old hack to work in the ;; new world. -- WHN 2001-08-82 ) (next :type (or function null) :ref-known (flushable) :ref-trans %simple-fun-next :set-known (unsafe) :set-trans (setf %simple-fun-next)) (name :ref-known (flushable) :ref-trans %simple-fun-name :set-known (unsafe) :set-trans (setf %simple-fun-name))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -