FunctionPackage: systemToCDocOverviewCGDocRelNotesFAQIndexPermutedIndex
Allegro CL version 10.0
Code change since the initial 10.0 release.
9.0 version


Arguments: object &optional type

Returns information about storage classifications or of the storage-classification of an object.

If type is not given, then the object's storage attributes are examined, and the most specific description of these attributes is returned in the form of a keyword. The possible keywords are:

  1. :immediate, which means the object is not referenced with a pointer (fixnums, e.g.)
  2. :static, which means the object is stored in an area which is not garbage collected.
  3. :tenured, which means the object is stored in oldspace (also called tenured space).
  4. :new, which means the object is stored in newspace but will, if it survives, eventually be tenured.
  5. :panified, which means that the object is stored in newspace and will never be tenured. (The name comes from Peter Pan, who never grew old.) See the note just below.
  6. :weak, which means the object is in newspace, will not be tenured, and is a weak vector.
  7. :finalized, which means that the object is a finalization.
  8. :weak-key-non-panified, which means that the object is a weak-key vector in newspace, but may be tenured (after which it will no longer be weak).
  9. :weak-key-panified, which means that the object is a weak-key vector in newspace which will not be tenured.
  10. :stack-allocated, which means the object resides on a stack somewhere. Note that on a non-os-threads Lisp the value may be seen as :stack-allocated even if it is outside of the stack it resides and should have been called :static. An object for which lispval-storage-type returns :stack-allocated will still cause sys:pointer-storage-type to return :static when passed as an argument to it.

Note on :panified objects: Only system-created objects can have storage type :panified but sometimes these objects are created as a consequnce of user action. The key vector of a weak-keys hashtable is typically a :panified object, though this can be controlled. See cl:make-hash-table in implementation.htm.

type can be :all or one of the storage types keywords in the list above.

If type is :all, a list of possible storage types is returned (and the object argument is ignored). Thus, when type is :all, the call is for information about the current implementation of lispval-storage-type, which may be modified in a patch subsequent to the release.

If type is a storage type, lispval-storage-type returns true or nil as the storage type of object matches or does not match type. Here match means `is of that storage type', not `is eq to the value returned by lispval-storage-type when type is not specified'. If lispval-storage-type returns :weak when type is not specified, it will return true when type is :weak and when type is :new.

See gc.htm for a discussion of where Lisp objects are stored. lispval-storage-type replaces the now deprecated pointer-storage-type.


;; A 1-d static array has storage type :STATIC
;; (2-d and higher dimension
;; static arrays have headers that are Lisp objects so they will have
;; storage type :NEW or :TENURED, but their data vectors
;; (available via INSPECT) 
;; will have storage type :STATIC):
CL-USER(24): (sys:lispval-storage-type 
               (make-array 3 :allocation :static
                           :element-type 'fixnum :initial-element 2))
;; Fixnums are immediates:
CL-USER(25): (sys:lispval-storage-type 22)
;; Most Lisp objects start in new space:
CL-USER(26): (setq a (cons 1 2))
(1 . 2)
CL-USER(27): (sys:lispval-storage-type a)
;; And after surviving several scavenges, they typically
;; move to oldspace:
CL-USER(28): (gc) (gc) (gc) (gc) (gc)
CL-USER(29): (sys:lispval-storage-type a)

;;  Here we show the use of the TYPE argument:
CL-USER(30): (setq a (make-array 10 :weak t))
CL-USER(31): (sys:lispval-storage-type a)
CL-USER(32): (sys:lispval-storage-type a :new)
CL-USER(5): (sys:lispval-storage-type a :weak)

Copyright (c) 1998-2019, Franz Inc. Oakland, CA., USA. All rights reserved.
This page was not revised from the 9.0 page.
Created 2015.5.21.

Allegro CL version 10.0
Code change since the initial 10.0 release.
9.0 version