Mercurial > emacs
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)) |