summaryrefslogtreecommitdiff
path: root/src/keymap.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2015-08-26 19:24:28 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2015-08-26 19:24:58 -0700
commit60d1b18734fff144f1608da6228d60e4bda7b24c (patch)
tree9b917c91b7de84ba517dba738784e1f1600f9234 /src/keymap.c
parent259a643d7f7c56976ff794cbdba8f5c70c795091 (diff)
downloademacs-60d1b18734fff144f1608da6228d60e4bda7b24c.tar.gz
Assume GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS
This removes the need for GCPRO1 etc. Suggested by Stefan Monnier in: http://lists.gnu.org/archive/html/emacs-devel/2015-08/msg00918.html * doc/lispref/internals.texi (Writing Emacs Primitives): * etc/NEWS: Document the change. * src/alloc.c (gcprolist, dump_zombies, MAX_ZOMBIES, zombies) (nzombies, ngcs, avg_zombies, max_live, max_zombies, avg_live) (Fgc_status, check_gcpros, relocatable_string_data_p, gc-precise): * src/bytecode.c (mark_byte_stack) [BYTE_MARK_STACK]: * src/eval.c (gcpro_level) [DEBUG_GCPRO]: * src/lisp.h (struct handler.gcpro, struct gcpro, GC_MARK_STACK) (GC_USE_GCPROS_AS_BEFORE, GC_MAKE_GCPROS_NOOPS) (GC_MARK_STACK_CHECK_GCPROS, GC_USE_GCPROS_CHECK_ZOMBIES) (BYTE_MARK_STACK, GCPRO1, GCPRO2, GCPRO3, GCPRO4, GCPRO5, GCPRO6) (GCPRO7, UNGCPRO, RETURN_UNGCPRO): Remove. All uses removed. The code now assumes GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS. * src/bytecode.c (relocate_byte_stack): Rename from unmark_byte_stack, since it now only relocates. All callers changed. * src/frame.c (make_frame): Add an IF_LINT to pacify GCC 5.2 with GCPROs removed. * src/systime.h: Use EMACS_LISP_H as the canary instead of GCPRO1. * test/automated/finalizer-tests.el (finalizer-basic) (finalizer-circular-reference, finalizer-cross-reference) (finalizer-error): * test/automated/generator-tests.el (cps-test-iter-close-finalizer): Remove tests, as they depend on gc-precise.
Diffstat (limited to 'src/keymap.c')
-rw-r--r--src/keymap.c82
1 files changed, 13 insertions, 69 deletions
diff --git a/src/keymap.c b/src/keymap.c
index b69b409fc2d..3668d4b24e2 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -254,12 +254,7 @@ get_keymap (Lisp_Object object, bool error_if_not_keymap, bool autoload)
{
if (autoload)
{
- struct gcpro gcpro1, gcpro2;
-
- GCPRO2 (tem, object);
Fautoload_do_load (tem, object, Qnil);
- UNGCPRO;
-
goto autoload_retry;
}
else
@@ -322,12 +317,10 @@ Return PARENT. PARENT should be nil or another keymap. */)
(Lisp_Object keymap, Lisp_Object parent)
{
Lisp_Object list, prev;
- struct gcpro gcpro1, gcpro2;
/* Flush any reverse-map cache. */
where_is_cache = Qnil; where_is_cache_keymaps = Qt;
- GCPRO2 (keymap, parent);
keymap = get_keymap (keymap, 1, 1);
if (!NILP (parent))
@@ -350,7 +343,7 @@ Return PARENT. PARENT should be nil or another keymap. */)
{
CHECK_IMPURE (prev);
XSETCDR (prev, parent);
- RETURN_UNGCPRO (parent);
+ return parent;
}
prev = list;
}
@@ -397,9 +390,7 @@ access_keymap_1 (Lisp_Object map, Lisp_Object idx,
{
/* See if there is a meta-map. If there's none, there is
no binding for IDX, unless a default binding exists in MAP. */
- struct gcpro gcpro1;
Lisp_Object event_meta_binding, event_meta_map;
- GCPRO1 (map);
/* A strange value in which Meta is set would cause
infinite recursion. Protect against that. */
if (XINT (meta_prefix_char) & CHAR_META)
@@ -407,7 +398,6 @@ access_keymap_1 (Lisp_Object map, Lisp_Object idx,
event_meta_binding = access_keymap_1 (map, meta_prefix_char, t_ok,
noinherit, autoload);
event_meta_map = get_keymap (event_meta_binding, 0, autoload);
- UNGCPRO;
if (CONSP (event_meta_map))
{
map = event_meta_map;
@@ -429,9 +419,6 @@ access_keymap_1 (Lisp_Object map, Lisp_Object idx,
Lisp_Object t_binding = Qunbound;
Lisp_Object retval = Qunbound;
Lisp_Object retval_tail = Qnil;
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
-
- GCPRO4 (tail, idx, t_binding, retval);
for (tail = (CONSP (map) && EQ (Qkeymap, XCAR (map))) ? XCDR (map) : map;
(CONSP (tail)
@@ -539,7 +526,7 @@ access_keymap_1 (Lisp_Object map, Lisp_Object idx,
}
QUIT;
}
- UNGCPRO;
+
return EQ (Qunbound, retval) ? get_keyelt (t_binding, autoload) : retval;
}
}
@@ -584,11 +571,9 @@ map_keymap_internal (Lisp_Object map,
Lisp_Object args,
void *data)
{
- struct gcpro gcpro1, gcpro2, gcpro3;
Lisp_Object tail
= (CONSP (map) && EQ (Qkeymap, XCAR (map))) ? XCDR (map) : map;
- GCPRO3 (map, args, tail);
for (; CONSP (tail) && !EQ (Qkeymap, XCAR (tail)); tail = XCDR (tail))
{
Lisp_Object binding = XCAR (tail);
@@ -614,7 +599,7 @@ map_keymap_internal (Lisp_Object map,
make_save_funcptr_ptr_obj ((voidfuncptr) fun, data,
args));
}
- UNGCPRO;
+
return tail;
}
@@ -630,8 +615,6 @@ void
map_keymap (Lisp_Object map, map_keymap_function_t fun, Lisp_Object args,
void *data, bool autoload)
{
- struct gcpro gcpro1;
- GCPRO1 (args);
map = get_keymap (map, 1, autoload);
while (CONSP (map))
{
@@ -645,7 +628,6 @@ map_keymap (Lisp_Object map, map_keymap_function_t fun, Lisp_Object args,
if (!CONSP (map))
map = get_keymap (map, 0, autoload);
}
- UNGCPRO;
}
/* Same as map_keymap, but does it right, properly eliminating duplicate
@@ -653,14 +635,11 @@ map_keymap (Lisp_Object map, map_keymap_function_t fun, Lisp_Object args,
void
map_keymap_canonical (Lisp_Object map, map_keymap_function_t fun, Lisp_Object args, void *data)
{
- struct gcpro gcpro1;
- GCPRO1 (args);
/* map_keymap_canonical may be used from redisplay (e.g. when building menus)
so be careful to ignore errors and to inhibit redisplay. */
map = safe_call1 (Qkeymap_canonicalize, map);
/* No need to use `map_keymap' here because canonical map has no parent. */
map_keymap_internal (map, fun, args, data);
- UNGCPRO;
}
DEFUN ("map-keymap-internal", Fmap_keymap_internal, Smap_keymap_internal, 2, 2, 0,
@@ -670,11 +649,8 @@ the definition it is bound to. The event may be a character range.
If KEYMAP has a parent, this function returns it without processing it. */)
(Lisp_Object function, Lisp_Object keymap)
{
- struct gcpro gcpro1;
- GCPRO1 (function);
keymap = get_keymap (keymap, 1, 1);
keymap = map_keymap_internal (keymap, map_keymap_call, function, NULL);
- UNGCPRO;
return keymap;
}
@@ -1079,14 +1055,12 @@ binding KEY to DEF is added at the front of KEYMAP. */)
bool metized = 0;
int meta_bit;
ptrdiff_t length;
- struct gcpro gcpro1, gcpro2, gcpro3;
- GCPRO3 (keymap, key, def);
keymap = get_keymap (keymap, 1, 1);
length = CHECK_VECTOR_OR_STRING (key);
if (length == 0)
- RETURN_UNGCPRO (Qnil);
+ return Qnil;
if (SYMBOLP (def) && !EQ (Vdefine_key_rebound_commands, Qt))
Vdefine_key_rebound_commands = Fcons (def, Vdefine_key_rebound_commands);
@@ -1149,7 +1123,7 @@ binding KEY to DEF is added at the front of KEYMAP. */)
message_with_string ("Key sequence contains invalid event %s", c, 1);
if (idx == length)
- RETURN_UNGCPRO (store_in_keymap (keymap, c, def));
+ return store_in_keymap (keymap, c, def);
cmd = access_keymap (keymap, c, 0, 1, 1);
@@ -1233,14 +1207,12 @@ recognize the default bindings, just as `read-key-sequence' does. */)
Lisp_Object c;
ptrdiff_t length;
bool t_ok = !NILP (accept_default);
- struct gcpro gcpro1, gcpro2;
- GCPRO2 (keymap, key);
keymap = get_keymap (keymap, 1, 1);
length = CHECK_VECTOR_OR_STRING (key);
if (length == 0)
- RETURN_UNGCPRO (keymap);
+ return keymap;
idx = 0;
while (1)
@@ -1261,11 +1233,11 @@ recognize the default bindings, just as `read-key-sequence' does. */)
cmd = access_keymap (keymap, c, t_ok, 0, 1);
if (idx == length)
- RETURN_UNGCPRO (cmd);
+ return cmd;
keymap = get_keymap (cmd, 0, 1);
if (!CONSP (keymap))
- RETURN_UNGCPRO (make_number (idx));
+ return make_number (idx);
QUIT;
}
@@ -1744,14 +1716,10 @@ bindings; see the description of `lookup-key' for more details about this. */)
int nmaps;
Lisp_Object binding;
int i, j;
- struct gcpro gcpro1, gcpro2;
nmaps = current_minor_maps (&modes, &maps);
- /* Note that all these maps are GCPRO'd
- in the places where we found them. */
binding = Qnil;
- GCPRO2 (key, binding);
for (i = j = 0; i < nmaps; i++)
if (!NILP (maps[i])
@@ -1761,10 +1729,9 @@ bindings; see the description of `lookup-key' for more details about this. */)
if (KEYMAPP (binding))
maps[j++] = Fcons (modes[i], binding);
else if (j == 0)
- RETURN_UNGCPRO (list1 (Fcons (modes[i], binding)));
+ return list1 (Fcons (modes[i], binding));
}
- UNGCPRO;
return Flist (j, maps);
}
@@ -1922,8 +1889,6 @@ then the value includes only maps for prefixes that start with PREFIX. */)
Lisp_Object maps, tail;
EMACS_INT prefixlen = XFASTINT (Flength (prefix));
- /* no need for gcpro because we don't autoload any keymaps. */
-
if (!NILP (prefix))
{
/* If a prefix was specified, start with the keymap (if any) for
@@ -2553,7 +2518,6 @@ The optional 5th arg NO-REMAP alters how command remapping is handled:
Lisp_Object found = Qnil;
/* 1 means ignore all menu bindings entirely. */
bool nomenus = !NILP (firstonly) && !EQ (firstonly, Qnon_ascii);
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, gcpro6;
/* List of sequences found via remapping. Keep them in a separate
variable, so as to push them later, since we prefer
non-remapped binding. */
@@ -2576,8 +2540,6 @@ The optional 5th arg NO-REMAP alters how command remapping is handled:
else
keymaps = Fcurrent_active_maps (Qnil, Qnil);
- GCPRO6 (definition, keymaps, found, sequences, remapped_sequences, tem);
-
tem = Fcommand_remapping (definition, Qnil, keymaps);
/* If `definition' is remapped to tem', then OT1H no key will run
that command (since they will run `tem' instead), so we should
@@ -2603,11 +2565,11 @@ The optional 5th arg NO-REMAP alters how command remapping is handled:
/* We have a list of advertised bindings. */
while (CONSP (tem))
if (EQ (shadow_lookup (keymaps, XCAR (tem), Qnil, 0), definition))
- RETURN_UNGCPRO (XCAR (tem));
+ return XCAR (tem);
else
tem = XCDR (tem);
if (EQ (shadow_lookup (keymaps, tem, Qnil, 0), definition))
- RETURN_UNGCPRO (tem);
+ return tem;
}
sequences = Freverse (where_is_internal (definition, keymaps,
@@ -2676,14 +2638,12 @@ The optional 5th arg NO-REMAP alters how command remapping is handled:
nil, then we should return the first ascii-only binding
we find. */
if (EQ (firstonly, Qnon_ascii))
- RETURN_UNGCPRO (sequence);
+ return sequence;
else if (!NILP (firstonly)
&& 2 == preferred_sequence_p (sequence))
- RETURN_UNGCPRO (sequence);
+ return sequence;
}
- UNGCPRO;
-
found = Fnreverse (found);
/* firstonly may have been t, but we may have gone all the way through
@@ -2769,7 +2729,6 @@ The optional argument MENUS, if non-nil, says to mention menu bindings.
Lisp_Object outbuf, shadow;
bool nomenu = NILP (menus);
Lisp_Object start1;
- struct gcpro gcpro1;
const char *alternate_heading
= "\
@@ -2780,8 +2739,6 @@ You type Translation\n\
CHECK_BUFFER (buffer);
shadow = Qnil;
- GCPRO1 (shadow);
-
outbuf = Fcurrent_buffer ();
/* Report on alternates for keys. */
@@ -2927,7 +2884,6 @@ You type Translation\n\
describe_map_tree (KVAR (current_kboard, Vinput_decode_map), 0, Qnil, prefix,
"\f\nInput decoding map translations", nomenu, 1, 0, 0);
- UNGCPRO;
return Qnil;
}
@@ -2959,7 +2915,6 @@ describe_map_tree (Lisp_Object startmap, bool partial, Lisp_Object shadow,
bool transl, bool always_title, bool mention_shadow)
{
Lisp_Object maps, orig_maps, seen, sub_shadows;
- struct gcpro gcpro1, gcpro2, gcpro3;
bool something = 0;
const char *key_heading
= "\
@@ -2969,7 +2924,6 @@ key binding\n\
orig_maps = maps = Faccessible_keymaps (startmap, prefix);
seen = Qnil;
sub_shadows = Qnil;
- GCPRO3 (maps, seen, sub_shadows);
if (nomenu)
{
@@ -3065,8 +3019,6 @@ key binding\n\
if (something)
insert_string ("\n");
-
- UNGCPRO;
}
static int previous_description_column;
@@ -3178,7 +3130,6 @@ describe_map (Lisp_Object map, Lisp_Object prefix,
Lisp_Object suppress;
Lisp_Object kludge;
bool first = 1;
- struct gcpro gcpro1, gcpro2, gcpro3;
/* These accumulate the values from sparse keymap bindings,
so we can sort them and handle them in order. */
@@ -3198,8 +3149,6 @@ describe_map (Lisp_Object map, Lisp_Object prefix,
kludge = Fmake_vector (make_number (1), Qnil);
definition = Qnil;
- GCPRO3 (prefix, definition, kludge);
-
map = call1 (Qkeymap_canonicalize, map);
for (tail = map; CONSP (tail); tail = XCDR (tail))
@@ -3350,7 +3299,6 @@ describe_map (Lisp_Object map, Lisp_Object prefix,
}
SAFE_FREE ();
- UNGCPRO;
}
static void
@@ -3423,7 +3371,6 @@ describe_vector (Lisp_Object vector, Lisp_Object prefix, Lisp_Object args,
Lisp_Object suppress;
Lisp_Object kludge;
bool first = 1;
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
/* Range of elements to be handled. */
int from, to, stop;
Lisp_Object character;
@@ -3449,7 +3396,6 @@ describe_vector (Lisp_Object vector, Lisp_Object prefix, Lisp_Object args,
that is done once per vector element, we don't want to cons up a
fresh vector every time. */
kludge = Fmake_vector (make_number (1), Qnil);
- GCPRO4 (elt_prefix, prefix, definition, kludge);
if (partial)
suppress = intern ("suppress-keymap");
@@ -3599,8 +3545,6 @@ describe_vector (Lisp_Object vector, Lisp_Object prefix, Lisp_Object args,
insert ("default", 7);
(*elt_describer) (XCHAR_TABLE (vector)->defalt, args);
}
-
- UNGCPRO;
}
/* Apropos - finding all symbols whose names match a regexp. */