aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorAlan Mackenzie2011-11-03 22:03:18 +0000
committerAlan Mackenzie2011-11-03 22:03:18 +0000
commit85ba4cded3ef5a834c880edfdb6cf7ec3a747e9b (patch)
tree2a207d6e9e906119087ad357c892414db01211cb /src/alloc.c
parenta6ba2ab9277496b66f6939766a3470c1f0a84287 (diff)
parent14e1d9eab9f4b7341f92397a0a9a2706f7b26ee9 (diff)
downloademacs-85ba4cded3ef5a834c880edfdb6cf7ec3a747e9b.tar.gz
emacs-85ba4cded3ef5a834c880edfdb6cf7ec3a747e9b.zip
Merge.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 6e999a0ba6d..210dd7d1687 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -279,6 +279,7 @@ static void compact_small_strings (void);
279static void free_large_strings (void); 279static void free_large_strings (void);
280static void sweep_strings (void); 280static void sweep_strings (void);
281static void free_misc (Lisp_Object); 281static void free_misc (Lisp_Object);
282extern Lisp_Object which_symbols (Lisp_Object, EMACS_INT) EXTERNALLY_VISIBLE;
282 283
283/* When scanning the C stack for live Lisp objects, Emacs keeps track 284/* When scanning the C stack for live Lisp objects, Emacs keeps track
284 of what memory allocated via lisp_malloc is intended for what 285 of what memory allocated via lisp_malloc is intended for what
@@ -6250,6 +6251,55 @@ Frames, windows, buffers, and subprocesses count as vectors
6250 return Flist (8, consed); 6251 return Flist (8, consed);
6251} 6252}
6252 6253
6254/* Find at most FIND_MAX symbols which have OBJ as their value or
6255 function. This is used in gdbinit's `xwhichsymbols' command. */
6256
6257Lisp_Object
6258which_symbols (Lisp_Object obj, EMACS_INT find_max)
6259{
6260 struct symbol_block *sblk;
6261 int gc_count = inhibit_garbage_collection ();
6262 Lisp_Object found = Qnil;
6263
6264 if (!EQ (obj, Vdead))
6265 {
6266 for (sblk = symbol_block; sblk; sblk = sblk->next)
6267 {
6268 struct Lisp_Symbol *sym = sblk->symbols;
6269 int bn;
6270
6271 for (bn = 0; bn < SYMBOL_BLOCK_SIZE; bn++, sym++)
6272 {
6273 Lisp_Object val;
6274 Lisp_Object tem;
6275
6276 if (sblk == symbol_block && bn >= symbol_block_index)
6277 break;
6278
6279 XSETSYMBOL (tem, sym);
6280 val = find_symbol_value (tem);
6281 if (EQ (val, obj)
6282 || EQ (sym->function, obj)
6283 || (!NILP (sym->function)
6284 && COMPILEDP (sym->function)
6285 && EQ (AREF (sym->function, COMPILED_BYTECODE), obj))
6286 || (!NILP (val)
6287 && COMPILEDP (val)
6288 && EQ (AREF (val, COMPILED_BYTECODE), obj)))
6289 {
6290 found = Fcons (tem, found);
6291 if (--find_max == 0)
6292 goto out;
6293 }
6294 }
6295 }
6296 }
6297
6298 out:
6299 unbind_to (gc_count, Qnil);
6300 return found;
6301}
6302
6253#ifdef ENABLE_CHECKING 6303#ifdef ENABLE_CHECKING
6254int suppress_checking; 6304int suppress_checking;
6255 6305