Mercurial > emacs
diff src/lisp.h @ 28406:451721e784a8
Stop assuming interval pointers and lisp objects can be distinguished by
inspection. Beginnings of support for expensive internal consistency checks.
* config.in (ENABLE_CHECKING): Undef.
* lisp.h (struct interval): Replace "parent" field with a union of interval
pointer and Lisp_Object; add new bitfield to use as discriminant. Change other
flag fields to bitfields.
(CHECK): New macro for consistency checking. If ENABLE_CHECKING is defined and
the supplied test fails, print a message and abort.
(eassert): New macro. Use CHECK to provide an assert-like facility.
* intervals.h (NULL_INTERVAL_P): Now applies only to real interval pointers;
abort if the value looks like a lisp object.
(NULL_INTERVAL_P, NULL_PARENT, HAS_PARENT, HAS_OBJECT, SET_PARENT, SET_OBJECT,
INTERVAL_PARENT, GET_INTERVAL_OBJECT, COPY_PARENT): Modify for new interval
parent definition.
* alloc.c (mark_interval_tree, MARK_INTERVAL_TREE, UNMARK_BALANCE_INTERVALS):
Update references that need an addressable lisp object in the interval
structure.
(die): New function.
(suppress_checking): New variable.
* intervals.c (interval_start_pos): Just return 0 if there's no parent object.
author | Ken Raeburn <raeburn@raeburn.org> |
---|---|
date | Wed, 29 Mar 2000 22:14:34 +0000 |
parents | 52b185e0d8bd |
children | e5083ae09338 |
line wrap: on
line diff
--- a/src/lisp.h Wed Mar 29 21:57:22 2000 +0000 +++ b/src/lisp.h Wed Mar 29 22:14:34 2000 +0000 @@ -46,6 +46,23 @@ #endif #endif +/* Extra internal type checking? */ +extern int suppress_checking; +#ifdef ENABLE_CHECKING +extern void die P_((const char *, const char *, int)); +#define CHECK(check,msg) ((check || suppress_checking ? 0 : die (msg, __FILE__, __LINE__)), 0) +#else +/* Produce same side effects and result, but don't complain. */ +#define CHECK(check,msg) ((check),0) +#endif +/* Define an Emacs version of "assert", since some system ones are + flaky. */ +#if defined (__GNUC__) && __GNUC__ >= 2 && defined (__STDC__) +#define eassert(cond) CHECK(cond,"assertion failed: " #cond) +#else +#define eassert(cond) CHECK(cond,"assertion failed") +#endif + /* Define the fundamental Lisp data structures. */ /* This is the set of Lisp data types. */ @@ -494,17 +511,22 @@ You'd think we could store this information in the parent object somewhere (after all, that should be visited once and then ignored too, right?), but strings are GC'd strangely. */ - struct interval *parent; + union + { + struct interval *interval; + Lisp_Object obj; + } up; + unsigned int up_obj : 1; /* The remaining components are `properties' of the interval. The first four are duplicates for things which can be on the list, for purposes of speed. */ - unsigned char write_protect; /* Non-zero means can't modify. */ - unsigned char visible; /* Zero means don't display. */ - unsigned char front_sticky; /* Non-zero means text inserted just + unsigned int write_protect : 1; /* Non-zero means can't modify. */ + unsigned int visible : 1; /* Zero means don't display. */ + unsigned int front_sticky : 1; /* Non-zero means text inserted just before this interval goes into it. */ - unsigned char rear_sticky; /* Likewise for just after it. */ + unsigned int rear_sticky : 1; /* Likewise for just after it. */ /* Properties of this interval. The mark bit on this field says whether this particular interval