be compared to the sizes recorded in Lisp strings. */
#define GC_CHECK_STRING_BYTES 1
-#endif /* 0*/
+#endif /* 0 */
/* These are default choices for the types to use. */
/* Two flags that are set during GC. On some machines, these flags
are defined differently by the m- file. */
-/* This is set in the car of a cons and in the plist slot of a symbol
- to indicate it is marked. Likewise in the plist slot of an interval,
- the chain slot of a marker, the type slot of a float, and the name
- slot of a buffer.
-
- In strings, this bit in the size field indicates that the string
- is a "large" one, one which was separately malloc'd
- rather than being part of a string block. */
+/* This is set in the car of a cons to indicate it is marked.
+ Likewise in the type slot of a float and in the size slot of strings. */
#ifndef MARKBIT
#define MARKBIT ((EMACS_INT) ((EMACS_UINT) 1 << (VALBITS + GCTYPEBITS)))
#endif /*MARKBIT */
-/* In the size word of a vector, this bit means the vector has been marked.
- In the size word of a large string, likewise. */
+/* In the size word of a vector, this bit means the vector has been marked. */
#ifndef ARRAY_MARK_FLAG
#define ARRAY_MARK_FLAG ((MARKBIT >> 1) & ~MARKBIT)
#define XMARKBIT(a) ((a) & MARKBIT)
#endif
-#ifndef XSETMARKBIT
-#define XSETMARKBIT(a,b) ((a) = ((a) & ~MARKBIT) | ((b) ? MARKBIT : 0))
-#endif
-
#ifndef XMARK
#define XMARK(a) ((a) |= MARKBIT)
#endif
#define XGCTYPE(a) ((a).gu.type)
#define XMARKBIT(a) ((a).gu.markbit)
-#define XSETMARKBIT(a,b) (XMARKBIT(a) = (b))
#define XMARK(a) (XMARKBIT(a) = 1)
#define XUNMARK(a) (XMARKBIT(a) = 0)
/* Construct a Lisp_Object from a value or address. */
-#define XSETINT(a, b) XSET (a, Lisp_Int, b)
+#define XSETINT(a, b) (a) = make_number (b)
#define XSETCONS(a, b) XSET (a, Lisp_Cons, b)
#define XSETVECTOR(a, b) XSET (a, Lisp_Vectorlike, b)
#define XSETSTRING(a, b) XSET (a, Lisp_String, b)
} up;
unsigned int up_obj : 1;
+ unsigned gcmarkbit : 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. */
struct Lisp_Symbol
{
+ unsigned gcmarkbit : 1;
+
/* Non-zero means symbol serves as a variable alias. The symbol
holding the real value is found in the value slot. */
unsigned indirect_variable : 1;
struct Lisp_Free
{
int type : 16; /* = Lisp_Misc_Free */
- int spacer : 16;
+ unsigned gcmarkbit : 1;
+ int spacer : 15;
union Lisp_Misc *chain;
};
struct Lisp_Marker
{
int type : 16; /* = Lisp_Misc_Marker */
- int spacer : 15;
+ unsigned gcmarkbit : 1;
+ int spacer : 14;
/* 1 means normal insertion at the marker's position
leaves the marker after the inserted text. */
unsigned int insertion_type : 1;
/* For markers that point somewhere,
this is used to chain of all the markers in a given buffer. */
- Lisp_Object chain;
+ struct Lisp_Marker *next;
/* This is the char position where the marker points. */
int charpos;
/* This is the byte position. */
struct Lisp_Intfwd
{
int type : 16; /* = Lisp_Misc_Intfwd */
- int spacer : 16;
+ unsigned gcmarkbit : 1;
+ int spacer : 15;
EMACS_INT *intvar;
};
struct Lisp_Boolfwd
{
int type : 16; /* = Lisp_Misc_Boolfwd */
- int spacer : 16;
+ unsigned gcmarkbit : 1;
+ int spacer : 15;
int *boolvar;
};
struct Lisp_Objfwd
{
int type : 16; /* = Lisp_Misc_Objfwd */
- int spacer : 16;
+ unsigned gcmarkbit : 1;
+ int spacer : 15;
Lisp_Object *objvar;
};
struct Lisp_Buffer_Objfwd
{
int type : 16; /* = Lisp_Misc_Buffer_Objfwd */
- int spacer : 16;
+ unsigned gcmarkbit : 1;
+ int spacer : 15;
int offset;
};
{
int type : 16; /* = Lisp_Misc_Buffer_Local_Value
or Lisp_Misc_Some_Buffer_Local_Value */
- int spacer : 13;
+ unsigned gcmarkbit : 1;
+ int spacer : 12;
/* 1 means this variable is allowed to have frame-local bindings,
so check for them when looking for the proper binding. */
struct Lisp_Overlay
{
int type : 16; /* = Lisp_Misc_Overlay */
- int spacer : 16;
+ unsigned gcmarkbit : 1;
+ int spacer : 15;
Lisp_Object start, end, plist;
};
struct Lisp_Kboard_Objfwd
{
int type : 16; /* = Lisp_Misc_Kboard_Objfwd */
- int spacer : 16;
+ unsigned gcmarkbit : 1;
+ int spacer : 15;
int offset;
};
struct Lisp_Save_Value
{
int type : 16; /* = Lisp_Misc_Save_Value */
- int spacer : 16;
+ unsigned gcmarkbit : 1;
+ int spacer : 15;
void *pointer;
int integer;
};
/* Lisp floating point type */
struct Lisp_Float
{
- Lisp_Object type; /* essentially used for mark-bit
- and chaining when on free-list */
#ifdef HIDE_LISP_IMPLEMENTATION
double data_;
#else
means we saw a buffer-local or frame-local value. Other values of
WHERE mean an internal error. */
+typedef Lisp_Object (*specbinding_func) P_ ((Lisp_Object));
+
struct specbinding
{
- Lisp_Object symbol, old_value;
- Lisp_Object (*func) P_ ((Lisp_Object));
+ volatile Lisp_Object symbol, old_value;
+ volatile specbinding_func func;
Lisp_Object unused; /* Dividing by 16 is faster than by 12 */
};
extern struct specbinding *specpdl;
-extern struct specbinding *specpdl_ptr;
+extern volatile struct specbinding *specpdl_ptr;
extern int specpdl_size;
extern EMACS_INT max_specpdl_size;
EXFUN (Fstring_lessp, 2);
extern int char_table_translate P_ ((Lisp_Object, int));
extern void map_char_table P_ ((void (*) (Lisp_Object, Lisp_Object, Lisp_Object),
- Lisp_Object, Lisp_Object, Lisp_Object, int,
+ Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, int,
Lisp_Object *));
extern Lisp_Object char_table_ref_and_index P_ ((Lisp_Object, int, int *));
extern void syms_of_fns P_ ((void));
extern void memory_full P_ ((void));
extern void buffer_memory_full P_ ((void));
extern int survives_gc_p P_ ((Lisp_Object));
-extern void mark_object P_ ((Lisp_Object *));
+extern void mark_object P_ ((Lisp_Object));
extern Lisp_Object Vpurify_flag;
extern Lisp_Object Vmemory_full;
EXFUN (Fcons, 2);
extern int charpos_to_bytepos P_ ((int));
extern int buf_charpos_to_bytepos P_ ((struct buffer *, int));
extern int buf_bytepos_to_charpos P_ ((struct buffer *, int));
-extern void unchain_marker P_ ((Lisp_Object));
+extern void unchain_marker P_ ((struct Lisp_Marker *marker));
extern Lisp_Object set_marker_restricted P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
extern Lisp_Object set_marker_both P_ ((Lisp_Object, Lisp_Object, int, int));
extern Lisp_Object set_marker_restricted_both P_ ((Lisp_Object, Lisp_Object,
/* Defined in abbrev.c */
-extern Lisp_Object Vfundamental_mode_abbrev_table;
extern void syms_of_abbrev P_ ((void));
/* defined in search.c */
extern int indented_beyond_p P_ ((int, int, double));
extern void syms_of_indent P_ ((void));
-/* defined in window.c */
-extern Lisp_Object Qwindowp, Qwindow_live_p;
-extern Lisp_Object Vwindow_list;
-EXFUN (Fwindow_end, 2);
-EXFUN (Fselected_window, 0);
-EXFUN (Fnext_window, 3);
-EXFUN (Fdelete_window, 1);
-EXFUN (Fselect_window, 1);
-EXFUN (Fset_window_buffer, 2);
-EXFUN (Fwindow_buffer, 1);
-EXFUN (Fget_buffer_window, 2);
-EXFUN (Fsave_window_excursion, UNEVALLED);
-EXFUN (Fsplit_window, 3);
-EXFUN (Fset_window_configuration, 1);
-EXFUN (Fcurrent_window_configuration, 1);
-extern int compare_window_configurations P_ ((Lisp_Object, Lisp_Object, int));
-EXFUN (Fcoordinates_in_window_p, 2);
-EXFUN (Fwindow_at, 3);
-EXFUN (Fpos_visible_in_window_p, 3);
-extern void mark_window_cursors_off P_ ((struct window *));
-extern int window_internal_height P_ ((struct window *));
-extern int window_internal_width P_ ((struct window *));
-EXFUN (Frecenter, 1);
-EXFUN (Fscroll_other_window, 1);
-EXFUN (Fset_window_start, 3);
-extern void temp_output_buffer_show P_ ((Lisp_Object));
-extern void replace_buffer_in_all_windows P_ ((Lisp_Object));
-extern void init_window_once P_ ((void));
-extern void init_window P_ ((void));
-extern void syms_of_window P_ ((void));
-extern void keys_of_window P_ ((void));
-
/* defined in frame.c */
extern Lisp_Object Qvisible;
extern void store_frame_param P_ ((struct frame *, Lisp_Object, Lisp_Object));