comparison src/keymap.c @ 35520:beec07f3fec0

(Fwhere_is_internal): Don't nreverse the cached value in where_is_cache; the next lookup in the cache returns something bogus if we do.
author Gerd Moellmann <gerd@gnu.org>
date Wed, 24 Jan 2001 19:39:42 +0000
parents f585b46c055a
children bf541983af82
comparison
equal deleted inserted replaced
35519:e550edb781e6 35520:beec07f3fec0
2242 (definition, keymap, firstonly, noindirect) 2242 (definition, keymap, firstonly, noindirect)
2243 Lisp_Object definition, keymap; 2243 Lisp_Object definition, keymap;
2244 Lisp_Object firstonly, noindirect; 2244 Lisp_Object firstonly, noindirect;
2245 { 2245 {
2246 Lisp_Object sequences, keymaps; 2246 Lisp_Object sequences, keymaps;
2247 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2248 /* 1 means ignore all menu bindings entirely. */ 2247 /* 1 means ignore all menu bindings entirely. */
2249 int nomenus = !NILP (firstonly) && !EQ (firstonly, Qnon_ascii); 2248 int nomenus = !NILP (firstonly) && !EQ (firstonly, Qnon_ascii);
2249 Lisp_Object result;
2250 2250
2251 /* Find the relevant keymaps. */ 2251 /* Find the relevant keymaps. */
2252 if (CONSP (keymap) && KEYMAPP (XCAR (keymap))) 2252 if (CONSP (keymap) && KEYMAPP (XCAR (keymap)))
2253 keymaps = keymap; 2253 keymaps = keymap;
2254 else if (! NILP (keymap)) 2254 else if (! NILP (keymap))
2264 2264
2265 /* Only use caching for the menubar (i.e. called with (def nil t nil). 2265 /* Only use caching for the menubar (i.e. called with (def nil t nil).
2266 We don't really need to check `keymap'. */ 2266 We don't really need to check `keymap'. */
2267 if (nomenus && NILP (noindirect) && NILP (keymap)) 2267 if (nomenus && NILP (noindirect) && NILP (keymap))
2268 { 2268 {
2269 Lisp_Object *defns;
2270 int i, n;
2271 struct gcpro gcpro1, gcpro2;
2272
2269 /* Check heuristic-consistency of the cache. */ 2273 /* Check heuristic-consistency of the cache. */
2270 if (NILP (Fequal (keymaps, where_is_cache_keymaps))) 2274 if (NILP (Fequal (keymaps, where_is_cache_keymaps)))
2271 where_is_cache = Qnil; 2275 where_is_cache = Qnil;
2272 2276
2273 if (NILP (where_is_cache)) 2277 if (NILP (where_is_cache))
2283 UNGCPRO; 2287 UNGCPRO;
2284 2288
2285 where_is_cache_keymaps = keymaps; 2289 where_is_cache_keymaps = keymaps;
2286 } 2290 }
2287 2291
2292 /* We want to process definitions from the last to the first.
2293 Instead of consing, copy definitions to a vector and step
2294 over that vector. */
2288 sequences = Fgethash (definition, where_is_cache, Qnil); 2295 sequences = Fgethash (definition, where_is_cache, Qnil);
2289 /* Verify that the key bindings are not shadowed. */ 2296 n = Flength (sequences);
2290 /* key-binding can GC. */ 2297 defns = (Lisp_Object *) alloca (n * sizeof *defns);
2291 GCPRO3 (definition, sequences, keymaps); 2298 for (i = 0; CONSP (sequences); sequences = XCDR (sequences))
2292 for (sequences = Fnreverse (sequences); 2299 defns[i++] = XCAR (sequences);
2293 CONSP (sequences); 2300
2294 sequences = XCDR (sequences)) 2301 /* Verify that the key bindings are not shadowed. Note that
2295 if (EQ (shadow_lookup (keymaps, XCAR (sequences), Qnil), definition) 2302 the following can GC. */
2296 && ascii_sequence_p (XCAR (sequences))) 2303 GCPRO2 (definition, keymaps);
2297 RETURN_UNGCPRO (XCAR (sequences)); 2304 result = Qnil;
2298 RETURN_UNGCPRO (Qnil); 2305 for (i = n - 1; i >= 0; --i)
2306 if (EQ (shadow_lookup (keymaps, defns[i], Qnil), definition)
2307 && ascii_sequence_p (defns[i]))
2308 break;
2309
2310 result = i >= 0 ? defns[i] : Qnil;
2311 UNGCPRO;
2299 } 2312 }
2300 else 2313 else
2301 { 2314 {
2302 /* Kill the cache so that where_is_internal_1 doesn't think 2315 /* Kill the cache so that where_is_internal_1 doesn't think
2303 we're filling it up. */ 2316 we're filling it up. */
2304 where_is_cache = Qnil; 2317 where_is_cache = Qnil;
2305 return where_is_internal (definition, keymaps, firstonly, noindirect); 2318 result = where_is_internal (definition, keymaps, firstonly, noindirect);
2306 } 2319 }
2320
2321 return result;
2307 } 2322 }
2308 2323
2309 /* This is the function that Fwhere_is_internal calls using map_char_table. 2324 /* This is the function that Fwhere_is_internal calls using map_char_table.
2310 ARGS has the form 2325 ARGS has the form
2311 (((DEFINITION . NOINDIRECT) . (KEYMAP . RESULT)) 2326 (((DEFINITION . NOINDIRECT) . (KEYMAP . RESULT))