⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objdef.lisp

📁 开源跨平台Lisp编译器
💻 LISP
📖 第 1 页 / 共 2 页
字号:
;;;; 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 + -