| 1 | /* This is a minimally edited version of Guile's tags.h. */ |
| 2 | /* classes: h_files */ |
| 3 | |
| 4 | #ifndef TAGSH |
| 5 | #define TAGSH |
| 6 | /* Copyright (C) 1995, 1999, 2008 Free Software Foundation, Inc. |
| 7 | |
| 8 | This program is free software; you can redistribute it and/or modify |
| 9 | it under the terms of the GNU General Public License as published by |
| 10 | the Free Software Foundation; either version 3 of the License, or |
| 11 | (at your option) any later version. |
| 12 | |
| 13 | This program is distributed in the hope that it will be useful, |
| 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | GNU General Public License for more details. |
| 17 | |
| 18 | You should have received a copy of the GNU General Public License |
| 19 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 20 | |
| 21 | As a special exception, the Free Software Foundation gives permission |
| 22 | for additional uses of the text contained in its release of GUILE. |
| 23 | |
| 24 | The exception is that, if you link the GUILE library with other files |
| 25 | to produce an executable, this does not by itself cause the |
| 26 | resulting executable to be covered by the GNU General Public License. |
| 27 | Your use of that executable is in no way restricted on account of |
| 28 | linking the GUILE library code into it. |
| 29 | |
| 30 | This exception does not however invalidate any other reasons why |
| 31 | the executable file might be covered by the GNU General Public License. |
| 32 | |
| 33 | This exception applies only to the code released by the |
| 34 | Free Software Foundation under the name GUILE. If you copy |
| 35 | code from other Free Software Foundation releases into a copy of |
| 36 | GUILE, as the General Public License permits, the exception does |
| 37 | not apply to the code that you add in this way. To avoid misleading |
| 38 | anyone as to the status of such modified files, you must delete |
| 39 | this exception notice from them. |
| 40 | |
| 41 | If you write modifications of your own for GUILE, it is your choice |
| 42 | whether to permit this exception to apply to your modifications. |
| 43 | If you do not wish that, delete this exception notice. */ |
| 44 | \f |
| 45 | |
| 46 | /** This file defines the format of SCM values and cons pairs. |
| 47 | ** It is here that tag bits are assigned for various purposes. |
| 48 | **/ |
| 49 | \f |
| 50 | |
| 51 | /* Three Bit Tags |
| 52 | |
| 53 | * 000 -- a non-immediate value. Points into the pair heap. |
| 54 | * |
| 55 | * 001 -- a gloc (i.e., a resolved global variable in a CAR in a code graph) |
| 56 | * or the CAR of an object handle (i.e., the tagged pointer to the |
| 57 | * vtable part of a user-defined object). |
| 58 | * |
| 59 | * If X has this tag, the value at CDAR(X - 1) distinguishes |
| 60 | * glocs from object handles. The distinction only needs |
| 61 | * to be made in a few places. Only a few parts of the code know |
| 62 | * about glocs. In most cases, when a value in the CAR of a pair |
| 63 | * has the tag 001, it means that the pair is an object handle. |
| 64 | * |
| 65 | * 010 -- the tag for immediate, exact integers. |
| 66 | * |
| 67 | * 011 -- in the CAR of a pair, this tag indicates that the pair is a closure. |
| 68 | * The remaining bits of the CAR are a pointer into the pair heap |
| 69 | * to the code graph for the closure. |
| 70 | * |
| 71 | * 1xy -- an extension tag which means that there is a five or six bit |
| 72 | * tag to the left of the low three bits. See the nice diagrams |
| 73 | * in ../doc/code.doc if you want to know what the bits mean. |
| 74 | */ |
| 75 | \f |
| 76 | |
| 77 | |
| 78 | |
| 79 | |
| 80 | #define scm_tc3_cons 0 |
| 81 | #define scm_tc3_cons_gloc 1 |
| 82 | #define scm_tc3_closure 3 |
| 83 | |
| 84 | #define scm_tc7_ssymbol 5 |
| 85 | #define scm_tc7_msymbol 7 |
| 86 | #define scm_tc7_string 13 |
| 87 | #define scm_tc7_bvect 15 |
| 88 | #define scm_tc7_vector 21 |
| 89 | #define scm_tc7_lvector 23 |
| 90 | #define scm_tc7_ivect 29 |
| 91 | #define scm_tc7_uvect 31 |
| 92 | /* spare 37 39 */ |
| 93 | #define scm_tc7_fvect 45 |
| 94 | #define scm_tc7_dvect 47 |
| 95 | #define scm_tc7_cvect 53 |
| 96 | #define scm_tc7_port 55 |
| 97 | #define scm_tc7_contin 61 |
| 98 | #define scm_tc7_cclo 63 |
| 99 | /* spare 69 71 77 79 */ |
| 100 | #define scm_tc7_subr_0 85 |
| 101 | #define scm_tc7_subr_1 87 |
| 102 | #define scm_tc7_cxr 93 |
| 103 | #define scm_tc7_subr_3 95 |
| 104 | #define scm_tc7_subr_2 101 |
| 105 | #define scm_tc7_asubr 103 |
| 106 | #define scm_tc7_subr_1o 109 |
| 107 | #define scm_tc7_subr_2o 111 |
| 108 | #define scm_tc7_lsubr_2 117 |
| 109 | #define scm_tc7_lsubr 119 |
| 110 | #define scm_tc7_rpsubr 125 |
| 111 | |
| 112 | #define scm_tc7_smob 127 |
| 113 | #define scm_tc_free_cell 127 |
| 114 | |
| 115 | #define scm_tc16_flo 0x017f |
| 116 | #define scm_tc_flo 0x017fL |
| 117 | |
| 118 | #define SCM_REAL_PART (1L<<16) |
| 119 | #define SCM_IMAG_PART (2L<<16) |
| 120 | #define scm_tc_dblr (scm_tc16_flo|REAL_PART) |
| 121 | #define scm_tc_dblc (scm_tc16_flo|REAL_PART|IMAG_PART) |
| 122 | |
| 123 | #define scm_tc16_bigpos 0x027f |
| 124 | #define scm_tc16_bigneg 0x037f |
| 125 | |
| 126 | #define scm_tc16_fport (scm_tc7_port + 0*256L) |
| 127 | #define scm_tc16_pipe (scm_tc7_port + 1*256L) |
| 128 | #define scm_tc16_strport (scm_tc7_port + 2*256L) |
| 129 | #define scm_tc16_sfport (scm_tc7_port + 3*256L) |
| 130 | |
| 131 | |
| 132 | |
| 133 | /* For cons pairs with immediate values in the CAR */ |
| 134 | #define scm_tcs_cons_imcar 2:case 4:case 6:case 10:\ |
| 135 | case 12:case 14:case 18:case 20:\ |
| 136 | case 22:case 26:case 28:case 30:\ |
| 137 | case 34:case 36:case 38:case 42:\ |
| 138 | case 44:case 46:case 50:case 52:\ |
| 139 | case 54:case 58:case 60:case 62:\ |
| 140 | case 66:case 68:case 70:case 74:\ |
| 141 | case 76:case 78:case 82:case 84:\ |
| 142 | case 86:case 90:case 92:case 94:\ |
| 143 | case 98:case 100:case 102:case 106:\ |
| 144 | case 108:case 110:case 114:case 116:\ |
| 145 | case 118:case 122:case 124:case 126 |
| 146 | |
| 147 | /* For cons pairs with non-immediate values in the CAR */ |
| 148 | #define scm_tcs_cons_nimcar 0:case 8:case 16:case 24:\ |
| 149 | case 32:case 40:case 48:case 56:\ |
| 150 | case 64:case 72:case 80:case 88:\ |
| 151 | case 96:case 104:case 112:case 120 |
| 152 | |
| 153 | /* A CONS_GLOC occurs in code. It's CAR is a pointer to the |
| 154 | * CDR of a variable. The low order bits of the CAR are 001. |
| 155 | * The CDR of the gloc is the code continuation. |
| 156 | */ |
| 157 | #define scm_tcs_cons_gloc 1:case 9:case 17:case 25:\ |
| 158 | case 33:case 41:case 49:case 57:\ |
| 159 | case 65:case 73:case 81:case 89:\ |
| 160 | case 97:case 105:case 113:case 121 |
| 161 | |
| 162 | #define scm_tcs_closures 3:case 11:case 19:case 27:\ |
| 163 | case 35:case 43:case 51:case 59:\ |
| 164 | case 67:case 75:case 83:case 91:\ |
| 165 | case 99:case 107:case 115:case 123 |
| 166 | |
| 167 | #define scm_tcs_subrs scm_tc7_asubr:case scm_tc7_subr_0:case scm_tc7_subr_1:case scm_tc7_cxr:\ |
| 168 | case scm_tc7_subr_3:case scm_tc7_subr_2:case scm_tc7_rpsubr:case scm_tc7_subr_1o:\ |
| 169 | case scm_tc7_subr_2o:case scm_tc7_lsubr_2:case scm_tc7_lsubr |
| 170 | |
| 171 | #define scm_tcs_symbols scm_tc7_ssymbol:case scm_tc7_msymbol |
| 172 | |
| 173 | #define scm_tcs_bignums tc16_bigpos:case tc16_bigneg |
| 174 | \f |
| 175 | |
| 176 | |
| 177 | /* References to objects are of type SCM. Values may be non-immediate |
| 178 | * (pointers) or immediate (encoded, immutable, scalar values that fit |
| 179 | * in an SCM variable). |
| 180 | */ |
| 181 | |
| 182 | typedef long SCM; |
| 183 | |
| 184 | /* Cray machines have pointers that are incremented once for each word, |
| 185 | * rather than each byte, the 3 most significant bits encode the byte |
| 186 | * within the word. The following macros deal with this by storing the |
| 187 | * native Cray pointers like the ones that looks like scm expects. This |
| 188 | * is done for any pointers that might appear in the car of a scm_cell, pointers |
| 189 | * to scm_vector elts, functions, &c are not munged. |
| 190 | */ |
| 191 | #ifdef _UNICOS |
| 192 | #define SCM2PTR(x) ((int)(x) >> 3) |
| 193 | #define PTR2SCM(x) (((SCM)(x)) << 3) |
| 194 | #define SCM_POINTERS_MUNGED |
| 195 | #else |
| 196 | #define SCM2PTR(x) (x) |
| 197 | #define PTR2SCM(x) ((SCM)(x)) |
| 198 | #endif /* def _UNICOS */ |
| 199 | \f |
| 200 | |
| 201 | |
| 202 | /* Immediate? Predicates |
| 203 | */ |
| 204 | #define SCM_IMP(x) (6 & (int)(x)) |
| 205 | #define SCM_NIMP(x) (!SCM_IMP(x)) |
| 206 | \f |
| 207 | |
| 208 | |
| 209 | enum scm_tags |
| 210 | { |
| 211 | scm_tc8_char = 0xf4 |
| 212 | }; |
| 213 | |
| 214 | #define SCM_ITAG8(X) ((int)(X) & 0xff) |
| 215 | #define SCM_MAKE_ITAG8(X, TAG) (((X)<<8) + TAG) |
| 216 | #define SCM_ITAG8_DATA(X) ((X)>>8) |
| 217 | \f |
| 218 | |
| 219 | |
| 220 | /* Local Environment Structure |
| 221 | */ |
| 222 | #define SCM_ILOCP(n) ((0xff & (int)(n))==0xfc) |
| 223 | #define SCM_ILOC00 (0x000000fcL) |
| 224 | #define SCM_IDINC (0x00100000L) |
| 225 | #define SCM_ICDR (0x00080000L) |
| 226 | #define SCM_IFRINC (0x00000100L) |
| 227 | #define SCM_IDSTMSK (-SCM_IDINC) |
| 228 | #define SCM_IFRAME(n) ((int)((SCM_ICDR-SCM_IFRINC)>>8) & ((int)(n)>>8)) |
| 229 | #define SCM_IDIST(n) (((unsigned long)(n))>>20) |
| 230 | #define SCM_ICDRP(n) (SCM_ICDR & (n)) |
| 231 | \f |
| 232 | |
| 233 | /* Immediate Symbols, Special Symbols, Flags (various constants). |
| 234 | */ |
| 235 | |
| 236 | /* ISYMP tests for ISPCSYM and ISYM */ |
| 237 | #define SCM_ISYMP(n) ((0x187 & (int)(n))==4) |
| 238 | |
| 239 | /* IFLAGP tests for ISPCSYM, ISYM and IFLAG */ |
| 240 | #define SCM_IFLAGP(n) ((0x87 & (int)(n))==4) |
| 241 | #define SCM_ISYMNUM(n) ((int)((n)>>9)) |
| 242 | #define SCM_ISYMCHARS(n) (scm_isymnames[SCM_ISYMNUM(n)]) |
| 243 | #define SCM_MAKSPCSYM(n) (((n)<<9)+((n)<<3)+4L) |
| 244 | #define SCM_MAKISYM(n) (((n)<<9)+0x74L) |
| 245 | #define SCM_MAKIFLAG(n) (((n)<<9)+0x174L) |
| 246 | |
| 247 | /* This table must agree with the declarations |
| 248 | * in repl.c: {Names of immediate symbols}. |
| 249 | * |
| 250 | * These are used only in eval but their values |
| 251 | * have to be allocated here. |
| 252 | * |
| 253 | */ |
| 254 | |
| 255 | #define SCM_IM_AND SCM_MAKSPCSYM(0) |
| 256 | #define SCM_IM_BEGIN SCM_MAKSPCSYM(1) |
| 257 | #define SCM_IM_CASE SCM_MAKSPCSYM(2) |
| 258 | #define SCM_IM_COND SCM_MAKSPCSYM(3) |
| 259 | #define SCM_IM_DO SCM_MAKSPCSYM(4) |
| 260 | #define SCM_IM_IF SCM_MAKSPCSYM(5) |
| 261 | #define SCM_IM_LAMBDA SCM_MAKSPCSYM(6) |
| 262 | #define SCM_IM_LET SCM_MAKSPCSYM(7) |
| 263 | #define SCM_IM_LETSTAR SCM_MAKSPCSYM(8) |
| 264 | #define SCM_IM_LETREC SCM_MAKSPCSYM(9) |
| 265 | #define SCM_IM_OR SCM_MAKSPCSYM(10) |
| 266 | #define SCM_IM_QUOTE SCM_MAKSPCSYM(11) |
| 267 | #define SCM_IM_SET SCM_MAKSPCSYM(12) |
| 268 | #define SCM_IM_DEFINE SCM_MAKSPCSYM(13) |
| 269 | #define SCM_IM_APPLY SCM_MAKISYM(14) |
| 270 | #define SCM_IM_CONT SCM_MAKISYM(15) |
| 271 | #define SCM_NUM_ISYMS 16 |
| 272 | |
| 273 | /* Important immediates |
| 274 | */ |
| 275 | |
| 276 | #define SCM_BOOL_F SCM_MAKIFLAG(SCM_NUM_ISYMS+0) |
| 277 | #define SCM_BOOL_T SCM_MAKIFLAG(SCM_NUM_ISYMS+1) |
| 278 | #define SCM_UNDEFINED SCM_MAKIFLAG(SCM_NUM_ISYMS+2) |
| 279 | #define SCM_EOF_VAL SCM_MAKIFLAG(SCM_NUM_ISYMS+3) |
| 280 | |
| 281 | #ifdef SICP |
| 282 | #define SCM_EOL SCM_BOOL_F |
| 283 | #else |
| 284 | #define SCM_EOL SCM_MAKIFLAG(SCM_NUM_ISYMS+4) |
| 285 | #endif |
| 286 | |
| 287 | #define SCM_UNSPECIFIED SCM_MAKIFLAG(SCM_NUM_ISYMS+5) |
| 288 | \f |
| 289 | |
| 290 | |
| 291 | /* Heap Pairs and the Empty List Predicates |
| 292 | */ |
| 293 | #define SCM_NULLP(x) (SCM_EOL == (x)) |
| 294 | #define SCM_NNULLP(x) (SCM_EOL != (x)) |
| 295 | #define SCM_CELLP(x) (!SCM_NCELLP(x)) |
| 296 | #define SCM_NCELLP(x) ((sizeof(scm_cell)-1) & (int)(x)) |
| 297 | \f |
| 298 | |
| 299 | |
| 300 | #define SCM_UNBNDP(x) (SCM_UNDEFINED==(x)) |
| 301 | \f |
| 302 | |
| 303 | |
| 304 | /* Testing and Changing GC Marks in Various Standard Positions |
| 305 | */ |
| 306 | #define SCM_GCMARKP(x) (1 & (int)SCM_CDR(x)) |
| 307 | #define SCM_GC8MARKP(x) (0x80 & (int)SCM_CAR(x)) |
| 308 | #define SCM_SETGCMARK(x) (SCM_CDR(x) |= 1) |
| 309 | #define SCM_CLRGCMARK(x) (SCM_CDR(x) &= ~1L) |
| 310 | #define SCM_SETGC8MARK(x) (SCM_CAR(x) |= 0x80) |
| 311 | #define SCM_CLRGC8MARK(x) (SCM_CAR(x) &= ~0x80L) |
| 312 | \f |
| 313 | |
| 314 | /* Extracting Tag Bits, With or Without GC Safety and Optional Bits |
| 315 | */ |
| 316 | #define SCM_TYP3(x) (7 & (int)SCM_CAR(x)) |
| 317 | #define SCM_TYP7(x) (0x7f & (int)SCM_CAR(x)) |
| 318 | #define SCM_TYP7S(x) (0x7d & (int)SCM_CAR(x)) |
| 319 | #define SCM_TYP16(x) (0xffff & (int)SCM_CAR(x)) |
| 320 | #define SCM_TYP16S(x) (0xfeff & (int)SCM_CAR(x)) |
| 321 | #define SCM_GCTYP16(x) (0xff7f & (int)SCM_CAR(x)) |
| 322 | \f |
| 323 | |
| 324 | /* Two slightly extensible types: smobs and ptobs. |
| 325 | |
| 326 | */ |
| 327 | #define SCM_SMOBNUM(x) (0x0ff & (CAR(x)>>8)); |
| 328 | #define SCM_PTOBNUM(x) (0x0ff & (CAR(x)>>8)); |
| 329 | \f |
| 330 | |
| 331 | |
| 332 | |
| 333 | #define SCM_DIRP(x) (SCM_NIMP(x) && (TYP16(x)==(scm_tc16_dir))) |
| 334 | #define SCM_OPDIRP(x) (SCM_NIMP(x) && (CAR(x)==(scm_tc16_dir | OPN))) |
| 335 | \f |
| 336 | |
| 337 | |
| 338 | /* Lvectors |
| 339 | */ |
| 340 | #define SCM_LVECTORP(x) (TYP7(x)==tc7_lvector) |
| 341 | \f |
| 342 | |
| 343 | #if 0 |
| 344 | \f |
| 345 | /* Sockets |
| 346 | */ |
| 347 | #define tc_socket (tc7_port | OPN) |
| 348 | #define SCM_SOCKP(x) (((0x7f | OPN | RDNG | WRTNG) & CAR(x))==(tc_socket)) |
| 349 | #define SCM_SOCKTYP(x) (CAR(x)>>24) |
| 350 | \f |
| 351 | |
| 352 | |
| 353 | extern int scm_tc16_key_vector; |
| 354 | #define SCM_KEYVECP(X) (scm_tc16_key_vector == TYP16 (X)) |
| 355 | #define SCM_KEYVECLEN(OBJ) (((unsigned long)CAR (obj)) >> 16) |
| 356 | \f |
| 357 | |
| 358 | #define SCM_MALLOCDATA(obj) ((char *)CDR(obj)) |
| 359 | #define SCM_MALLOCLEN(obj) (((unsigned long)CAR (obj)) >> 16) |
| 360 | #define SCM_WORDDATA(obj) (CDR (obj)) |
| 361 | |
| 362 | |
| 363 | #define SCM_BYTECODEP(X) ((TYP7 (X) == tc7_cclo) && (CCLO_SUBR (X) == rb_proc)) |
| 364 | #define SCM_BYTECODE_CONSTANTS(X) (VELTS(X)[1]) |
| 365 | #define SCM_BYTECODE_CODE(X) (VELTS(X)[2]) |
| 366 | #define SCM_BYTECODE_NAME(X) (VELTS(X)[3]) |
| 367 | #define SCM_BYTECODE_BCODE(X) (VELTS(X)[4]) |
| 368 | #define SCM_BYTECODE_ELTS 5 |
| 369 | \f |
| 370 | |
| 371 | #define SCM_FREEP(x) (CAR(x)==tc_free_cell) |
| 372 | #define SCM_NFREEP(x) (!FREEP(x)) |
| 373 | \f |
| 374 | #endif /* 0 */ |
| 375 | \f |
| 376 | |
| 377 | #endif /* TAGSH */ |