diff options
author | Dirk Herrmann <dirk@dirk-herrmanns-seiten.de> | 2000-03-26 10:08:52 +0000 |
---|---|---|
committer | Dirk Herrmann <dirk@dirk-herrmanns-seiten.de> | 2000-03-26 10:08:52 +0000 |
commit | 2549a7096d2443b3f581ca7bffa4ece1d07894c0 (patch) | |
tree | 658dadad693b078adf759f55f003b33f17af0c16 /libguile/pairs.h | |
parent | 8d3356e761c0469c124e4e88de3ec3b835d4069c (diff) |
Moved some cell related definitions from tags.h and pairs.h to gc.h.
Diffstat (limited to 'libguile/pairs.h')
-rw-r--r-- | libguile/pairs.h | 166 |
1 files changed, 1 insertions, 165 deletions
diff --git a/libguile/pairs.h b/libguile/pairs.h index b14532b0d..90c88e043 100644 --- a/libguile/pairs.h +++ b/libguile/pairs.h @@ -2,7 +2,7 @@ #ifndef PAIRSH #define PAIRSH -/* Copyright (C) 1995,1996, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,2000 Free Software Foundation, Inc. * * 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 @@ -52,108 +52,15 @@ -typedef struct scm_cell -{ - SCM car; - SCM cdr; -} scm_cell; - - -/* Low level cell data accessing macros: - */ - -#define SCM_CELL_WORD(x, n) (SCM_UNPACK (((SCM *) SCM2PTR (x))[n])) -#define SCM_CELL_WORD_0(x) SCM_CELL_WORD (x, 0) -#define SCM_CELL_WORD_1(x) SCM_CELL_WORD (x, 1) -#define SCM_CELL_WORD_2(x) SCM_CELL_WORD (x, 2) -#define SCM_CELL_WORD_3(x) SCM_CELL_WORD (x, 3) - -#define SCM_CELL_OBJECT(x, n) (((SCM *) SCM2PTR (x))[n]) -#define SCM_CELL_OBJECT_0(x) SCM_CELL_OBJECT (x, 0) -#define SCM_CELL_OBJECT_1(x) SCM_CELL_OBJECT (x, 1) -#define SCM_CELL_OBJECT_2(x) SCM_CELL_OBJECT (x, 2) -#define SCM_CELL_OBJECT_3(x) SCM_CELL_OBJECT (x, 3) - -#define SCM_SET_CELL_WORD(x, n, v) ((((SCM *) SCM2PTR (x))[n]) = SCM_PACK (v)) -#define SCM_SET_CELL_WORD_0(x, v) SCM_SET_CELL_WORD (x, 0, v) -#define SCM_SET_CELL_WORD_1(x, v) SCM_SET_CELL_WORD (x, 1, v) -#define SCM_SET_CELL_WORD_2(x, v) SCM_SET_CELL_WORD (x, 2, v) -#define SCM_SET_CELL_WORD_3(x, v) SCM_SET_CELL_WORD (x, 3, v) - -#define SCM_SET_CELL_OBJECT(x, n, v) ((((SCM *) SCM2PTR (x))[n]) = v) -#define SCM_SET_CELL_OBJECT_0(x, v) SCM_SET_CELL_OBJECT (x, 0, v) -#define SCM_SET_CELL_OBJECT_1(x, v) SCM_SET_CELL_OBJECT (x, 1, v) -#define SCM_SET_CELL_OBJECT_2(x, v) SCM_SET_CELL_OBJECT (x, 2, v) -#define SCM_SET_CELL_OBJECT_3(x, v) SCM_SET_CELL_OBJECT (x, 3, v) - - -#define SCM_CELL_TYPE(x) SCM_CELL_WORD_0 (x) -#define SCM_SET_CELL_TYPE(x, t) SCM_SET_CELL_WORD_0 (x, t) - - -/* SCM_PTR_LT defines how to compare two SCM_CELLPTRs (which may not be in the - * same scm_array). SCM_CELLPTR is a pointer to a cons cell which may be - * compared or differenced. SCMPTR is used for stack bounds. - */ - -#if !defined(__TURBOC__) || defined(__TOS__) - -typedef scm_cell *SCM_CELLPTR; -typedef SCM *SCMPTR; - -# ifdef nosve -# define SCM_PTR_MASK 0xffffffffffff -# define SCM_PTR_LT(x, y)\ - (((int) (x) &SCM_PTR_MASK) < ((int) (y) & SCM_PTR_MASK)) -# else -# define SCM_PTR_LT(x, y) ((x) < (y)) -# endif /* def nosve */ - -#else /* defined(__TURBOC__) && !defined(__TOS__) */ - -# ifdef PROT386 -typedef scm_cell *SCM_CELLPTR; -typedef SCM *SCMPTR; -# define SCM_PTR_LT(x, y) (((long) (x)) < ((long) (y))) -# else -typedef scm_cell huge *SCM_CELLPTR; -typedef SCM huge *SCMPTR; -# define SCM_PTR_LT(x, y) ((x) < (y)) -# endif /* def PROT386 */ - -#endif /* defined(__TURBOC__) && !defined(__TOS__) */ - -#define SCM_PTR_GT(x, y) SCM_PTR_LT (y, x) -#define SCM_PTR_LE(x, y) (!SCM_PTR_GT (x, y)) -#define SCM_PTR_GE(x, y) (!SCM_PTR_LT (x, y)) - #define SCM_NULLP(x) (SCM_EOL == (x)) #define SCM_NNULLP(x) (SCM_EOL != (x)) - - - -/* Cons Pairs - */ - #define SCM_CAR(x) (((scm_cell *) (SCM2PTR (x)))->car) #define SCM_CDR(x) (((scm_cell *) (SCM2PTR (x)))->cdr) #define SCM_GCCDR(x) SCM_PACK(~1L & SCM_UNPACK (SCM_CDR (x))) #define SCM_SETCAR(x, v) (SCM_CAR (x) = SCM_PACK (v)) #define SCM_SETCDR(x, v) (SCM_CDR (x) = SCM_PACK (v)) -#define SCM_CARLOC(x) (&SCM_CAR (x)) -#define SCM_CDRLOC(x) (&SCM_CDR (x)) - -#define SCM_SETAND_CAR(x, y)\ - (SCM_CAR (x) = SCM_PACK (SCM_UNPACK (SCM_CAR (x)) & (y))) -#define SCM_SETAND_CDR(x, y)\ - (SCM_CDR (x) = SCM_PACK (SCM_UNPACK (SCM_CDR (x)) & (y))) -#define SCM_SETOR_CAR(x, y)\ - (SCM_CAR (x) = SCM_PACK (SCM_UNPACK (SCM_CAR (x)) | (y))) -#define SCM_SETOR_CDR(x, y)\ - (SCM_CDR (x) = SCM_PACK (SCM_UNPACK (SCM_CDR (x)) | (y))) - #define SCM_CAAR(OBJ) SCM_CAR (SCM_CAR (OBJ)) #define SCM_CDAR(OBJ) SCM_CDR (SCM_CAR (OBJ)) #define SCM_CADR(OBJ) SCM_CAR (SCM_CDR (OBJ)) @@ -185,77 +92,6 @@ typedef SCM huge *SCMPTR; #define SCM_CADDDR(OBJ) SCM_CAR (SCM_CDR (SCM_CDR (SCM_CDR (OBJ)))) #define SCM_CDDDDR(OBJ) SCM_CDR (SCM_CDR (SCM_CDR (SCM_CDR (OBJ)))) -/* Multi-cells - */ - -#define SCM_CELL_WORD_LOC(x, n) (&SCM_CELL_WORD (x, n)) - -/* the allocated thing: The car of newcells are set to - scm_tc16_allocated to avoid the fragile state of newcells wrt the - gc. If it stays as a freecell, any allocation afterwards could - cause the cell to go back on the freelist, which will bite you - sometime afterwards */ - -#ifdef GUILE_DEBUG_FREELIST -#define SCM_NEWCELL(_into) do { _into = scm_debug_newcell (); } while (0) -#define SCM_NEWCELL2(_into) do { _into = scm_debug_newcell2 (); } while (0) -#else -#ifdef GUILE_NEW_GC_SCHEME -/* When we introduce POSIX threads support, every thread will have - a freelist of its own. Then it won't any longer be necessary to - initialize cells with scm_tc16_allocated. */ -#define SCM_NEWCELL(_into) \ - do { \ - if (SCM_IMP (scm_freelist)) \ - _into = scm_gc_for_newcell (&scm_master_freelist, \ - &scm_freelist); \ - else \ - { \ - _into = scm_freelist; \ - scm_freelist = SCM_CDR (scm_freelist);\ - SCM_SETCAR (_into, scm_tc16_allocated); \ - } \ - } while(0) -#define SCM_NEWCELL2(_into) \ - do { \ - if (SCM_IMP (scm_freelist2)) \ - _into = scm_gc_for_newcell (&scm_master_freelist2, \ - &scm_freelist2); \ - else \ - { \ - _into = scm_freelist2; \ - scm_freelist2 = SCM_CDR (scm_freelist2);\ - SCM_SETCAR (_into, scm_tc16_allocated); \ - } \ - } while(0) -#else /* GUILE_NEW_GC_SCHEME */ -#define SCM_NEWCELL(_into) \ - do { \ - if (SCM_IMP (scm_freelist.cells)) \ - _into = scm_gc_for_newcell (&scm_freelist);\ - else \ - { \ - _into = scm_freelist.cells; \ - scm_freelist.cells = SCM_CDR (scm_freelist.cells);\ - SCM_SETCAR (_into, scm_tc16_allocated); \ - ++scm_cells_allocated; \ - } \ - } while(0) -#define SCM_NEWCELL2(_into) \ - do { \ - if (SCM_IMP (scm_freelist2.cells)) \ - _into = scm_gc_for_newcell (&scm_freelist2);\ - else \ - { \ - _into = scm_freelist2.cells; \ - scm_freelist2.cells = SCM_CDR (scm_freelist2.cells);\ - SCM_SETCAR (_into, scm_tc16_allocated); \ - scm_cells_allocated += 2; \ - } \ - } while(0) -#endif /* GUILE_NEW_GC_SCHEME */ -#endif - extern SCM scm_cons (SCM x, SCM y); |