diff options
author | Ken Raeburn <raeburn@raeburn.org> | 2000-03-29 22:14:34 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@raeburn.org> | 2000-03-29 22:14:34 +0000 |
commit | e0b8c689e2b1d80da6ed235ae400ad10d117b706 (patch) | |
tree | f54bb195d821f61b0f7c3fbf4eae79b72978fdbe /src/lisp.h | |
parent | 141384bdd2a332b79b36d118cd13becaf0b326b9 (diff) | |
download | emacs-e0b8c689e2b1d80da6ed235ae400ad10d117b706.tar.gz emacs-e0b8c689e2b1d80da6ed235ae400ad10d117b706.tar.bz2 emacs-e0b8c689e2b1d80da6ed235ae400ad10d117b706.zip |
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.
Diffstat (limited to 'src/lisp.h')
-rw-r--r-- | src/lisp.h | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/lisp.h b/src/lisp.h index af1ddb7a460..0e1cfff61ab 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -46,6 +46,23 @@ Boston, MA 02111-1307, USA. */ #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 @@ struct interval 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 |