/* -*-C-*-
$Id: trap.h,v 9.49 2001/12/21 04:36:15 cph Exp $
Copyright (c) 1987-1989, 1999-2001 Massachusetts Institute of Technology
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA.
*/
#ifndef SCM_TRAP_H
#define SCM_TRAP_H
/* Kinds of traps:
For efficiency, some traps are immediate, while some are
pointer objects. The type code is multiplexed, and the
garbage collector handles it specially.
The odd-numbered traps used to be "dangerous" versions of the
even-numbered ones, but all that complexity has been flushed. */
typedef unsigned long trap_kind_t;
/* The following are immediate traps: */
#define TRAP_UNASSIGNED 0
#define TRAP_UNBOUND 2
#define TRAP_EXPENSIVE 6
/* TRAP_MAX_IMMEDIATE is defined in const.h */
/* The following are non-immediate traps: */
#define TRAP_COMPILER_CACHED 14
#define TRAP_MACRO 15
/* Usages of the above traps:
TRAP_UNASSIGNED can appear in a value cell or a cache.
TRAP_UNBOUND can appear in the following locations:
* The value cell of a global variable. All symbols initially
have their value cell set to UNBOUND_OBJECT.
* A cache that is in the value cell of a global variable. This
is like the previous case except that some compiled code has
referenced the unbound variable.
* The value cell of a procedure's argument frame. This is caused
by calling unbind_variable on a procedure's argument.
* A cache that is not stored in an environment. This is caused
by referring to an unbound variable in an environment that does
not inherit from the global environment.
TRAP_EXPENSIVE can only appear in a "clone" cache. This causes
assignments to this cache to trap out to the microcode, where the
updating of the variable's associated UUO links can be performed.
TRAP_COMPILER_CACHED can only appear in a value cell. It is used
to associate a cache with the variable.
TRAP_MACRO can appear in a value cell or a cache. It is used for
storage of macro transformers in the environment structure.
*/
/* The following never appear in value cells. */
/* NON_TRAP_KIND is returned by get_trap_kind when its argument is not
a reference trap object. */
#define NON_TRAP_KIND 32
/* The garbage collector knows that pointers of type CACHE_TYPE point
to three words of storage, because these pointers are embedded in
compiled-code linkage sections (TC_LINKAGE_SECTION) without types.
*/
#define CACHE_TYPE TC_HUNK3
#define CACHE_REFERENCES_TYPE TC_HUNK3
#if (SIZEOF_UNSIGNED_LONG == 4) /* 32 bit objects */
# if (TYPE_CODE_LENGTH == 8)
# define UNASSIGNED_OBJECT 0x32000000
# define UNBOUND_OBJECT 0x32000002
# define EXPENSIVE_OBJECT 0x32000006
# endif
# if (TYPE_CODE_LENGTH == 6)
# define UNASSIGNED_OBJECT 0xc8000000
# define UNBOUND_OBJECT 0xc8000002
# define EXPENSIVE_OBJECT 0xc8000006
# endif
# if (TC_REFERENCE_TRAP != 0x32)
# include "error: trap.h and types.h are inconsistent"
# endif
#endif
#ifndef UNASSIGNED_OBJECT /* Safe version */
# define UNASSIGNED_OBJECT (MAKE_OBJECT (TC_REFERENCE_TRAP, TRAP_UNASSIGNED))
# define UNBOUND_OBJECT (MAKE_OBJECT (TC_REFERENCE_TRAP, TRAP_UNBOUND))
# define EXPENSIVE_OBJECT (MAKE_OBJECT (TC_REFERENCE_TRAP, TRAP_EXPENSIVE))
#endif
#endif /* not SCM_TRAP_H */
syntax highlighted by Code2HTML, v. 0.9.1