tags.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. /* classes: h_files */
  2. #ifndef SCM_TAGS_H
  3. #define SCM_TAGS_H
  4. /* Copyright (C) 1995-2004, 2008-2015 Free Software Foundation, Inc.
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public License
  8. * as published by the Free Software Foundation; either version 3 of
  9. * the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful, but
  12. * WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19. * 02110-1301 USA
  20. */
  21. /** This file defines the format of SCM values and cons pairs.
  22. ** It is here that tag bits are assigned for various purposes.
  23. **/
  24. /* picks up scmconfig.h too */
  25. #include "libguile/__scm.h"
  26. /* In the beginning was the Word:
  27. *
  28. * For the representation of scheme objects and their handling, Guile provides
  29. * two types: scm_t_bits and SCM.
  30. *
  31. * - scm_t_bits values can hold bit patterns of non-objects and objects:
  32. *
  33. * Non-objects -- in this case the value may not be changed into a SCM value
  34. * in any way.
  35. *
  36. * Objects -- in this case the value may be changed into a SCM value using
  37. * the SCM_PACK macro.
  38. *
  39. * - SCM values can hold proper scheme objects only. They can be changed into
  40. * a scm_t_bits value using the SCM_UNPACK macro.
  41. *
  42. * When working in the domain of scm_t_bits values, programmers must keep
  43. * track of any scm_t_bits value they create that is not a proper scheme
  44. * object. This makes sure that in the domain of SCM values developers can
  45. * rely on the fact that they are dealing with proper scheme objects only.
  46. * Thus, the distinction between scm_t_bits and SCM values helps to identify
  47. * those parts of the code where special care has to be taken not to create
  48. * bad SCM values.
  49. */
  50. /* For dealing with the bit level representation of scheme objects we define
  51. * scm_t_bits:
  52. */
  53. typedef scm_t_intptr scm_t_signed_bits;
  54. typedef scm_t_uintptr scm_t_bits;
  55. #define SCM_T_SIGNED_BITS_MAX SCM_T_INTPTR_MAX
  56. #define SCM_T_SIGNED_BITS_MIN SCM_T_INTPTR_MIN
  57. #define SCM_T_BITS_MAX SCM_T_UINTPTR_MAX
  58. /* But as external interface, we define SCM, which may, according to the
  59. * desired level of type checking, be defined in several ways:
  60. */
  61. #if (SCM_DEBUG_TYPING_STRICTNESS == 2)
  62. typedef union SCM { struct { scm_t_bits n; } n; } SCM;
  63. # define SCM_UNPACK(x) ((x).n.n)
  64. # define SCM_PACK(x) ((SCM) { { (scm_t_bits) (x) } })
  65. #elif (SCM_DEBUG_TYPING_STRICTNESS == 1)
  66. /* This is the default, which provides an intermediate level of compile time
  67. * type checking while still resulting in very efficient code.
  68. */
  69. typedef struct scm_unused_struct { char scm_unused_field; } *SCM;
  70. /*
  71. The 0?: constructions makes sure that the code is never executed,
  72. and that there is no performance hit. However, the alternative is
  73. compiled, and does generate a warning when used with the wrong
  74. pointer type. We use a volatile pointer type to avoid warnings
  75. from clang.
  76. The Tru64 and ia64-hp-hpux11.23 compilers fail on `case (0?0=0:x)'
  77. statements, so for them type-checking is disabled. */
  78. #if defined __DECC || defined __HP_cc
  79. # define SCM_UNPACK(x) ((scm_t_bits) (x))
  80. #else
  81. # define SCM_UNPACK(x) ((scm_t_bits) (0? (*(volatile SCM *)0=(x)): x))
  82. #endif
  83. /*
  84. There is no typechecking on SCM_PACK, since all kinds of types
  85. (unsigned long, void*) go in SCM_PACK
  86. */
  87. # define SCM_PACK(x) ((SCM) (x))
  88. #else
  89. /* This should be used as a fall back solution for machines on which casting
  90. * to a pointer may lead to loss of bit information, e. g. in the three least
  91. * significant bits.
  92. */
  93. typedef scm_t_bits SCM;
  94. # define SCM_UNPACK(x) (x)
  95. # define SCM_PACK(x) ((SCM) (x))
  96. #endif
  97. /* Packing SCM objects into and out of pointers.
  98. */
  99. #define SCM_UNPACK_POINTER(x) ((scm_t_bits *) (SCM_UNPACK (x)))
  100. #define SCM_PACK_POINTER(x) (SCM_PACK ((scm_t_bits) (x)))
  101. /* SCM values can not be compared by using the operator ==. Use the following
  102. * macro instead, which is the equivalent of the scheme predicate 'eq?'.
  103. */
  104. #define scm_is_eq(x, y) (SCM_UNPACK (x) == SCM_UNPACK (y))
  105. /* Representation of scheme objects:
  106. *
  107. * Guile's type system is designed to work on systems where scm_t_bits
  108. * and SCM variables consist of at least 32 bits. The objects that a
  109. * SCM variable can represent belong to one of the following two major
  110. * categories:
  111. *
  112. * - Immediates -- meaning that the SCM variable contains an entire
  113. * Scheme object. That means, all the object's data (including the
  114. * type tagging information that is required to identify the object's
  115. * type) must fit into 32 bits.
  116. *
  117. * - Heap objects -- meaning that the SCM variable holds a pointer into
  118. * the heap. On systems where a pointer needs more than 32 bits this
  119. * means that scm_t_bits and SCM variables need to be large enough to
  120. * hold such pointers. In contrast to immediates, the data associated
  121. * with a heap object can consume arbitrary amounts of memory.
  122. *
  123. * The 'heap' is the memory area that is under control of Guile's
  124. * garbage collector. It holds allocated memory of various sizes. The
  125. * impact on the runtime type system is that Guile needs to be able to
  126. * determine the type of an object given the pointer. Usually the way
  127. * that Guile does this is by storing a "type tag" in the first word of
  128. * the object.
  129. *
  130. * Some objects are common enough that they get special treatment.
  131. * Since Guile guarantees that the address of a GC-allocated object on
  132. * the heap is 8-byte aligned, Guile can play tricks with the lower 3
  133. * bits. That is, since heap objects encode a pointer to an
  134. * 8-byte-aligned pointer, the three least significant bits of a SCM can
  135. * be used to store additional information. The bits are used to store
  136. * information about the object's type and thus are called tc3-bits,
  137. * where tc stands for type-code.
  138. *
  139. * For a given SCM value, the distinction whether it holds an immediate
  140. * or heap object is based on the tc3-bits (see above) of its scm_t_bits
  141. * equivalent: If the tc3-bits equal #b000, then the SCM value holds a
  142. * heap object, and the scm_t_bits variable's value is just the pointer
  143. * to the heap cell.
  144. *
  145. * Summarized, the data of a scheme object that is represented by a SCM
  146. * variable consists of a) the SCM variable itself, b) in case of heap
  147. * objects memory that the SCM object points to, c) in case of heap
  148. * objects potentially additional data outside of the heap (like for
  149. * example malloc'ed data), and d) in case of heap objects potentially
  150. * additional data inside of the heap, since data stored in b) and c)
  151. * may hold references to other cells.
  152. *
  153. *
  154. * Immediates
  155. *
  156. * Operations on immediate objects can typically be processed faster than on
  157. * heap objects. The reason is that the object's data can be extracted
  158. * directly from the SCM variable (or rather a corresponding scm_t_bits
  159. * variable), instead of having to perform additional memory accesses to
  160. * obtain the object's data from the heap. In order to get the best possible
  161. * performance frequently used data types should be realized as immediates.
  162. * This is, as has been mentioned above, only possible if the objects can be
  163. * represented with 32 bits (including type tagging).
  164. *
  165. * In Guile, the following data types and special objects are realized as
  166. * immediates: booleans, characters, small integers (see below), the empty
  167. * list, the end of file object, the 'unspecified' object (which is delivered
  168. * as a return value by functions for which the return value is unspecified),
  169. * a 'nil' object used in the elisp-compatibility mode and certain other
  170. * 'special' objects which are only used internally in Guile.
  171. *
  172. * Integers in Guile can be arbitrarily large. On the other hand, integers
  173. * are one of the most frequently used data types. Especially integers with
  174. * less than 32 bits are commonly used. Thus, internally and transparently
  175. * for application code guile distinguishes between small and large integers.
  176. * Whether an integer is a large or a small integer depends on the number of
  177. * bits needed to represent its value. Small integers are those which can be
  178. * represented as immediates. Since they don't require more than a fixed
  179. * number of bits for their representation, they are also known as 'fixnums'.
  180. *
  181. * The tc3-combinations #b010 and #b110 are used to represent small integers,
  182. * which allows to use the most significant bit of the tc3-bits to be part of
  183. * the integer value being represented. This means that all integers with up
  184. * to 30 bits (including one bit for the sign) can be represented as
  185. * immediates. On systems where SCM and scm_t_bits variables hold more than
  186. * 32 bits, the amount of bits usable for small integers will even be larger.
  187. * The tc3-code #b100 is shared among booleans, characters and the other
  188. * special objects listed above.
  189. *
  190. *
  191. * Heap Objects
  192. *
  193. * All object types not mentioned above in the list of immediate objects
  194. * are represented as heap objects. The amount of memory referenced by
  195. * a heap object depends on the object's type, namely on the set of
  196. * attributes that have to be stored with objects of that type. Every
  197. * heap object type is allowed to define its own layout and
  198. * interpretation of the data stored in its cell (with some
  199. * restrictions, see below).
  200. *
  201. * One of the design goals of guile's type system is to make it possible
  202. * to store a scheme pair with as little memory usage as possible. The
  203. * minimum amount of memory that is required to store two scheme objects
  204. * (car and cdr of a pair) is the amount of memory required by two
  205. * scm_t_bits or SCM variables. Therefore pairs in guile are stored in
  206. * two words, and are tagged with a bit pattern in the SCM value, not
  207. * with a type tag on the heap.
  208. *
  209. *
  210. * Garbage collection
  211. *
  212. * During garbage collection, unreachable objects on the heap will be
  213. * freed. To determine the set of reachable objects, by default, the GC
  214. * just traces all words in all heap objects. It is possible to
  215. * register custom tracing ("marking") procedures.
  216. *
  217. * If an object is unreachable, by default, the GC just notes this fact
  218. * and moves on. Later allocations will clear out the memory associated
  219. * with the object, and re-use it. It is possible to register custom
  220. * finalizers, however.
  221. *
  222. *
  223. * Run-time type introspection
  224. *
  225. * Guile's type system is designed to make it possible to determine a
  226. * the type of a heap object from the object's first scm_t_bits
  227. * variable. (Given a SCM variable X holding a heap object, the macro
  228. * SCM_CELL_TYPE(X) will deliver the corresponding object's first
  229. * scm_t_bits variable.)
  230. *
  231. * If the object holds a scheme pair, then we already know that the
  232. * first scm_t_bits variable of the cell will hold a scheme object with
  233. * one of the following tc3-codes: #b000 (heap object), #b010 (small
  234. * integer), #b110 (small integer), #b100 (non-integer immediate). All
  235. * these tc3-codes have in common, that their least significant bit is
  236. * #b0. This fact is used by the garbage collector to identify cells
  237. * that hold pairs. The remaining tc3-codes are assigned as follows:
  238. * #b001 (class instance or, more precisely, a struct, of which a class
  239. * instance is a special case), #b011 (closure), #b101/#b111 (all
  240. * remaining heap object types).
  241. *
  242. *
  243. * Summary of type codes of scheme objects (SCM variables)
  244. *
  245. * Here is a summary of tagging bits as they might occur in a scheme object.
  246. * The notation is as follows: tc stands for type code as before, tc<n> with n
  247. * being a number indicates a type code formed by the n least significant bits
  248. * of the SCM variables corresponding scm_t_bits value.
  249. *
  250. * Note that (as has been explained above) tc1==1 can only occur in the first
  251. * scm_t_bits variable of a cell belonging to a heap object that is
  252. * not a pair. For an explanation of the tc tags with tc1==1, see the next
  253. * section with the summary of the type codes on the heap.
  254. *
  255. * tc1:
  256. * 0: For scheme objects, tc1==0 must be fulfilled.
  257. * (1: This can never be the case for a scheme object.)
  258. *
  259. * tc2:
  260. * 00: Either a heap object or some non-integer immediate
  261. * (01: This can never be the case for a scheme object.)
  262. * 10: Small integer
  263. * (11: This can never be the case for a scheme object.)
  264. *
  265. * tc3:
  266. * 000: a heap object (pair, closure, class instance etc.)
  267. * (001: This can never be the case for a scheme object.)
  268. * 010: an even small integer (least significant bit is 0).
  269. * (011: This can never be the case for a scheme object.)
  270. * 100: Non-integer immediate
  271. * (101: This can never be the case for a scheme object.)
  272. * 110: an odd small integer (least significant bit is 1).
  273. * (111: This can never be the case for a scheme object.)
  274. *
  275. * The remaining bits of the heap objects form the pointer to the heap
  276. * cell. The remaining bits of the small integers form the integer's
  277. * value and sign. Thus, the only scheme objects for which a further
  278. * subdivision is of interest are the ones with tc3==100.
  279. *
  280. * tc8 (for objects with tc3==100):
  281. * 00000-100: special objects ('flags')
  282. * 00001-100: characters
  283. * 00010-100: unused
  284. * 00011-100: unused
  285. *
  286. *
  287. * Summary of type codes on the heap
  288. *
  289. * Here is a summary of tagging in scm_t_bits values as they might occur in
  290. * the first scm_t_bits variable of a heap cell.
  291. *
  292. * tc1:
  293. * 0: the cell belongs to a pair.
  294. * 1: the cell belongs to a non-pair.
  295. *
  296. * tc2:
  297. * 00: the cell belongs to a pair with no short integer in its car.
  298. * 01: the cell belongs to a non-pair (struct or some other heap object).
  299. * 10: the cell belongs to a pair with a short integer in its car.
  300. * 11: the cell belongs to a non-pair (closure or some other heap object).
  301. *
  302. * tc3:
  303. * 000: the cell belongs to a pair with a heap object in its car.
  304. * 001: the cell belongs to a struct
  305. * 010: the cell belongs to a pair with an even short integer in its car.
  306. * 011: the cell belongs to a closure
  307. * 100: the cell belongs to a pair with a non-integer immediate in its car.
  308. * 101: the cell belongs to some other heap object.
  309. * 110: the cell belongs to a pair with an odd short integer in its car.
  310. * 111: the cell belongs to some other heap object.
  311. *
  312. * tc7 (for tc3==1x1):
  313. * See below for the list of types. Three special tc7-codes are of
  314. * interest: numbers, ports and smobs in fact each represent
  315. * collections of types, which are subdivided using tc16-codes.
  316. *
  317. * tc16 (for tc7==scm_tc7_smob):
  318. * The largest part of the space of smob types is not subdivided in a
  319. * predefined way, since smobs can be added arbitrarily by user C code.
  320. */
  321. /* Checking if a SCM variable holds an immediate or a heap object:
  322. * This check can either be performed by checking for tc3==000 or tc3==00x,
  323. * since for a SCM variable it is known that tc1==0. */
  324. #define SCM_IMP(x) (6 & SCM_UNPACK (x))
  325. #define SCM_NIMP(x) (!SCM_IMP (x))
  326. #define SCM_HEAP_OBJECT_P(x) (SCM_NIMP (x))
  327. /* Checking if a SCM variable holds a pair (for historical reasons, in Guile
  328. * also known as a cons-cell): This is done by first checking that the SCM
  329. * variable holds a heap object, and second, by checking that tc1==0 holds
  330. * for the SCM_CELL_TYPE of the SCM variable.
  331. */
  332. #define SCM_I_CONSP(x) (!SCM_IMP (x) && ((1 & SCM_CELL_TYPE (x)) == 0))
  333. /* Definitions for tc2: */
  334. #define scm_tc2_int 2
  335. /* Definitions for tc3: */
  336. #define SCM_ITAG3(x) (7 & SCM_UNPACK (x))
  337. #define SCM_TYP3(x) (7 & SCM_CELL_TYPE (x))
  338. #define scm_tc3_cons 0
  339. #define scm_tc3_struct 1
  340. #define scm_tc3_int_1 (scm_tc2_int + 0)
  341. #define scm_tc3_unused 3
  342. #define scm_tc3_imm24 4
  343. #define scm_tc3_tc7_1 5
  344. #define scm_tc3_int_2 (scm_tc2_int + 4)
  345. #define scm_tc3_tc7_2 7
  346. /* Definitions for tc7: */
  347. #define SCM_ITAG7(x) (0x7f & SCM_UNPACK (x))
  348. #define SCM_TYP7(x) (0x7f & SCM_CELL_TYPE (x))
  349. #define SCM_HAS_HEAP_TYPE(x, type, tag) \
  350. (SCM_NIMP (x) && type (x) == (tag))
  351. #define SCM_HAS_TYP7(x, tag) (SCM_HAS_HEAP_TYPE (x, SCM_TYP7, tag))
  352. /* These type codes form part of the ABI and cannot be changed in a
  353. stable series. The low bits of each must have the tc3 of a heap
  354. object type code (see above). If you do change them in a development
  355. series, change them also in (system vm assembler) and (system base
  356. types). Bonus points if you change the build to define these tag
  357. values in only one place! */
  358. #define scm_tc7_symbol 0x05
  359. #define scm_tc7_variable 0x07
  360. #define scm_tc7_vector 0x0d
  361. #define scm_tc7_wvect 0x0f
  362. #define scm_tc7_string 0x15
  363. #define scm_tc7_number 0x17
  364. #define scm_tc7_hashtable 0x1d
  365. #define scm_tc7_pointer 0x1f
  366. #define scm_tc7_fluid 0x25
  367. #define scm_tc7_stringbuf 0x27
  368. #define scm_tc7_dynamic_state 0x2d
  369. #define scm_tc7_frame 0x2f
  370. #define scm_tc7_keyword 0x35
  371. #define scm_tc7_atomic_box 0x37
  372. #define scm_tc7_syntax 0x3d
  373. #define scm_tc7_unused_3f 0x3f
  374. #define scm_tc7_program 0x45
  375. #define scm_tc7_vm_cont 0x47
  376. #define scm_tc7_bytevector 0x4d
  377. #define scm_tc7_unused_4f 0x4f
  378. #define scm_tc7_weak_set 0x55
  379. #define scm_tc7_weak_table 0x57
  380. #define scm_tc7_array 0x5d
  381. #define scm_tc7_bitvector 0x5f
  382. #define scm_tc7_unused_65 0x65
  383. #define scm_tc7_unused_67 0x67
  384. #define scm_tc7_unused_6d 0x6d
  385. #define scm_tc7_unused_6f 0x6f
  386. #define scm_tc7_unused_75 0x75
  387. #define scm_tc7_smob 0x77
  388. #define scm_tc7_port 0x7d
  389. #define scm_tc7_unused_7f 0x7f
  390. /* Definitions for tc16: */
  391. #define SCM_TYP16(x) (0xffff & SCM_CELL_TYPE (x))
  392. #define SCM_HAS_TYP16(x, tag) (SCM_HAS_HEAP_TYPE (x, SCM_TYP16, tag))
  393. #define SCM_TYP16_PREDICATE(tag, x) (SCM_HAS_TYP16 (x, tag))
  394. /* {Immediate Values}
  395. */
  396. enum scm_tc8_tags
  397. {
  398. scm_tc8_flag = scm_tc3_imm24 + 0x00, /* special objects ('flags') */
  399. scm_tc8_char = scm_tc3_imm24 + 0x08, /* characters */
  400. scm_tc8_unused_0 = scm_tc3_imm24 + 0x10,
  401. scm_tc8_unused_1 = scm_tc3_imm24 + 0x18
  402. };
  403. #define SCM_ITAG8(X) (SCM_UNPACK (X) & 0xff)
  404. #define SCM_MAKE_ITAG8_BITS(X, TAG) (((X) << 8) + TAG)
  405. #define SCM_MAKE_ITAG8(X, TAG) (SCM_PACK (SCM_MAKE_ITAG8_BITS (X, TAG)))
  406. #define SCM_ITAG8_DATA(X) (SCM_UNPACK (X) >> 8)
  407. /* Flags (special objects). The indices of the flags must agree with the
  408. * declarations in print.c: iflagnames. */
  409. #define SCM_IFLAGP(n) (SCM_ITAG8 (n) == scm_tc8_flag)
  410. #define SCM_MAKIFLAG_BITS(n) (SCM_MAKE_ITAG8_BITS ((n), scm_tc8_flag))
  411. #define SCM_IFLAGNUM(n) (SCM_ITAG8_DATA (n))
  412. /*
  413. * IMPORTANT NOTE regarding IFLAG numbering!!!
  414. *
  415. * Several macros depend upon careful IFLAG numbering of SCM_BOOL_F,
  416. * SCM_BOOL_T, SCM_ELISP_NIL, SCM_EOL, and the two SCM_XXX_*_DONT_USE
  417. * constants. In particular:
  418. *
  419. * - SCM_BOOL_F and SCM_BOOL_T must differ in exactly one bit position.
  420. * (used to implement scm_is_bool_and_not_nil, aka scm_is_bool)
  421. *
  422. * - SCM_ELISP_NIL and SCM_BOOL_F must differ in exactly one bit position.
  423. * (used to implement scm_is_false_or_nil and
  424. * scm_is_true_and_not_nil)
  425. *
  426. * - SCM_ELISP_NIL and SCM_EOL must differ in exactly one bit position.
  427. * (used to implement scm_is_null_or_nil)
  428. *
  429. * - SCM_ELISP_NIL, SCM_BOOL_F, SCM_EOL, SCM_XXX_ANOTHER_LISP_FALSE_DONT_USE
  430. * must all be equal except for two bit positions.
  431. * (used to implement scm_is_lisp_false)
  432. *
  433. * - SCM_ELISP_NIL, SCM_BOOL_F, SCM_BOOL_T, SCM_XXX_ANOTHER_BOOLEAN_DONT_USE_0
  434. * must all be equal except for two bit positions.
  435. * (used to implement scm_is_bool_or_nil)
  436. *
  437. * These properties allow the aforementioned macros to be implemented
  438. * by bitwise ANDing with a mask and then comparing with a constant,
  439. * using as a common basis the macro SCM_MATCHES_BITS_IN_COMMON,
  440. * defined below. The properties are checked at compile-time using
  441. * `verify' macros near the top of boolean.c and pairs.c.
  442. */
  443. #define SCM_BOOL_F_BITS SCM_MAKIFLAG_BITS (0)
  444. #define SCM_ELISP_NIL_BITS SCM_MAKIFLAG_BITS (1)
  445. #define SCM_BOOL_F SCM_PACK (SCM_BOOL_F_BITS)
  446. #define SCM_ELISP_NIL SCM_PACK (SCM_ELISP_NIL_BITS)
  447. #ifdef BUILDING_LIBGUILE
  448. #define SCM_XXX_ANOTHER_LISP_FALSE_DONT_USE SCM_MAKIFLAG_BITS (2)
  449. #endif
  450. #define SCM_EOL_BITS SCM_MAKIFLAG_BITS (3)
  451. #define SCM_BOOL_T_BITS SCM_MAKIFLAG_BITS (4)
  452. #define SCM_EOL SCM_PACK (SCM_EOL_BITS)
  453. #define SCM_BOOL_T SCM_PACK (SCM_BOOL_T_BITS)
  454. #ifdef BUILDING_LIBGUILE
  455. #define SCM_XXX_ANOTHER_BOOLEAN_DONT_USE_0 SCM_MAKIFLAG_BITS (5)
  456. #define SCM_XXX_ANOTHER_BOOLEAN_DONT_USE_1 SCM_MAKIFLAG_BITS (6)
  457. #define SCM_XXX_ANOTHER_BOOLEAN_DONT_USE_2 SCM_MAKIFLAG_BITS (7)
  458. #endif
  459. #define SCM_UNSPECIFIED_BITS SCM_MAKIFLAG_BITS (8)
  460. #define SCM_UNDEFINED_BITS SCM_MAKIFLAG_BITS (9)
  461. #define SCM_EOF_VAL_BITS SCM_MAKIFLAG_BITS (10)
  462. #define SCM_UNSPECIFIED SCM_PACK (SCM_UNSPECIFIED_BITS)
  463. #define SCM_UNDEFINED SCM_PACK (SCM_UNDEFINED_BITS)
  464. #define SCM_EOF_VAL SCM_PACK (SCM_EOF_VAL_BITS)
  465. /* When a variable is unbound this is marked by the SCM_UNDEFINED
  466. * value. The following is an unbound value which can be handled on
  467. * the Scheme level, i.e., it can be stored in and retrieved from a
  468. * Scheme variable. This value is only intended to mark an unbound
  469. * slot in GOOPS. It is needed now, but we should probably rewrite
  470. * the code which handles this value in C so that SCM_UNDEFINED can be
  471. * used instead. It is not ideal to let this kind of unique and
  472. * strange values loose on the Scheme level. */
  473. #define SCM_UNBOUND_BITS SCM_MAKIFLAG_BITS (11)
  474. #define SCM_UNBOUND SCM_PACK (SCM_UNBOUND_BITS)
  475. #define SCM_UNBNDP(x) (scm_is_eq ((x), SCM_UNDEFINED))
  476. /*
  477. * SCM_MATCHES_BITS_IN_COMMON(x,a,b) returns 1 if and only if x
  478. * matches both a and b in every bit position where a and b are equal;
  479. * otherwise it returns 0. Bit positions where a and b differ are
  480. * ignored.
  481. *
  482. * This is used to efficiently compare against two values which differ
  483. * in exactly one bit position, or against four values which differ in
  484. * exactly two bit positions. It is the basis for the following
  485. * macros:
  486. *
  487. * scm_is_null_or_nil,
  488. * scm_is_false_or_nil,
  489. * scm_is_true_and_not_nil,
  490. * scm_is_lisp_false,
  491. * scm_is_lisp_true,
  492. * scm_is_bool_and_not_nil (aka scm_is_bool)
  493. * scm_is_bool_or_nil.
  494. */
  495. #define SCM_MATCHES_BITS_IN_COMMON(x,a,b) \
  496. ((SCM_UNPACK(x) & ~(SCM_UNPACK(a) ^ SCM_UNPACK(b))) == \
  497. (SCM_UNPACK(a) & SCM_UNPACK(b)))
  498. /*
  499. * These macros are used for compile-time verification that the
  500. * constants have the properties needed for the above macro to work
  501. * properly.
  502. */
  503. #ifdef BUILDING_LIBGUILE
  504. #define SCM_WITH_LEAST_SIGNIFICANT_1_BIT_CLEARED(x) ((x) & ((x)-1))
  505. #define SCM_HAS_EXACTLY_ONE_BIT_SET(x) \
  506. ((x) != 0 && SCM_WITH_LEAST_SIGNIFICANT_1_BIT_CLEARED (x) == 0)
  507. #define SCM_HAS_EXACTLY_TWO_BITS_SET(x) \
  508. (SCM_HAS_EXACTLY_ONE_BIT_SET (SCM_WITH_LEAST_SIGNIFICANT_1_BIT_CLEARED (x)))
  509. #define SCM_BITS_DIFFER_IN_EXACTLY_ONE_BIT_POSITION(a,b) \
  510. (SCM_HAS_EXACTLY_ONE_BIT_SET ((a) ^ (b)))
  511. #define SCM_BITS_DIFFER_IN_EXACTLY_TWO_BIT_POSITIONS(a,b,c,d) \
  512. (SCM_HAS_EXACTLY_TWO_BITS_SET (((a) ^ (b)) | \
  513. ((b) ^ (c)) | \
  514. ((c) ^ (d))))
  515. #endif /* BUILDING_LIBGUILE */
  516. /* Dispatching aids:
  517. When switching on SCM_TYP7 of a SCM value, use these fake case
  518. labels to catch types that use fewer than 7 bits for tagging. */
  519. /* For cons pairs with immediate values in the CAR
  520. */
  521. #define scm_tcs_cons_imcar \
  522. scm_tc2_int + 0: case scm_tc2_int + 4: case scm_tc3_imm24 + 0:\
  523. case scm_tc2_int + 8: case scm_tc2_int + 12: case scm_tc3_imm24 + 8:\
  524. case scm_tc2_int + 16: case scm_tc2_int + 20: case scm_tc3_imm24 + 16:\
  525. case scm_tc2_int + 24: case scm_tc2_int + 28: case scm_tc3_imm24 + 24:\
  526. case scm_tc2_int + 32: case scm_tc2_int + 36: case scm_tc3_imm24 + 32:\
  527. case scm_tc2_int + 40: case scm_tc2_int + 44: case scm_tc3_imm24 + 40:\
  528. case scm_tc2_int + 48: case scm_tc2_int + 52: case scm_tc3_imm24 + 48:\
  529. case scm_tc2_int + 56: case scm_tc2_int + 60: case scm_tc3_imm24 + 56:\
  530. case scm_tc2_int + 64: case scm_tc2_int + 68: case scm_tc3_imm24 + 64:\
  531. case scm_tc2_int + 72: case scm_tc2_int + 76: case scm_tc3_imm24 + 72:\
  532. case scm_tc2_int + 80: case scm_tc2_int + 84: case scm_tc3_imm24 + 80:\
  533. case scm_tc2_int + 88: case scm_tc2_int + 92: case scm_tc3_imm24 + 88:\
  534. case scm_tc2_int + 96: case scm_tc2_int + 100: case scm_tc3_imm24 + 96:\
  535. case scm_tc2_int + 104: case scm_tc2_int + 108: case scm_tc3_imm24 + 104:\
  536. case scm_tc2_int + 112: case scm_tc2_int + 116: case scm_tc3_imm24 + 112:\
  537. case scm_tc2_int + 120: case scm_tc2_int + 124: case scm_tc3_imm24 + 120
  538. /* For cons pairs with heap objects in the SCM_CAR
  539. */
  540. #define scm_tcs_cons_nimcar \
  541. scm_tc3_cons + 0:\
  542. case scm_tc3_cons + 8:\
  543. case scm_tc3_cons + 16:\
  544. case scm_tc3_cons + 24:\
  545. case scm_tc3_cons + 32:\
  546. case scm_tc3_cons + 40:\
  547. case scm_tc3_cons + 48:\
  548. case scm_tc3_cons + 56:\
  549. case scm_tc3_cons + 64:\
  550. case scm_tc3_cons + 72:\
  551. case scm_tc3_cons + 80:\
  552. case scm_tc3_cons + 88:\
  553. case scm_tc3_cons + 96:\
  554. case scm_tc3_cons + 104:\
  555. case scm_tc3_cons + 112:\
  556. case scm_tc3_cons + 120
  557. /* For structs
  558. */
  559. #define scm_tcs_struct \
  560. scm_tc3_struct + 0:\
  561. case scm_tc3_struct + 8:\
  562. case scm_tc3_struct + 16:\
  563. case scm_tc3_struct + 24:\
  564. case scm_tc3_struct + 32:\
  565. case scm_tc3_struct + 40:\
  566. case scm_tc3_struct + 48:\
  567. case scm_tc3_struct + 56:\
  568. case scm_tc3_struct + 64:\
  569. case scm_tc3_struct + 72:\
  570. case scm_tc3_struct + 80:\
  571. case scm_tc3_struct + 88:\
  572. case scm_tc3_struct + 96:\
  573. case scm_tc3_struct + 104:\
  574. case scm_tc3_struct + 112:\
  575. case scm_tc3_struct + 120
  576. #endif /* SCM_TAGS_H */
  577. /*
  578. Local Variables:
  579. c-file-style: "gnu"
  580. End:
  581. */