aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorPaul Eggert2011-10-29 10:33:13 -0700
committerPaul Eggert2011-10-29 10:33:13 -0700
commit8d0eb4c275581847990b85dbb350caa3df9e653f (patch)
treec161f977d59ac3103b04dc0f4aea57c83436a456 /src/alloc.c
parent929bb973dd3faf1655f03ac758942d5b009354ad (diff)
parent196e41e4aec1a44ec5b6e9bed485185ba872ae67 (diff)
downloademacs-8d0eb4c275581847990b85dbb350caa3df9e653f.tar.gz
emacs-8d0eb4c275581847990b85dbb350caa3df9e653f.zip
Merge from trunk.
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 ee49a2dfb2e..86127dd5197 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
@@ -6251,6 +6252,55 @@ Frames, windows, buffers, and subprocesses count as vectors
6251 return Flist (8, consed); 6252 return Flist (8, consed);
6252} 6253}
6253 6254
6255/* Find at most FIND_MAX symbols which have OBJ as their value or
6256 function. This is used in gdbinit's `xwhichsymbols' command. */
6257
6258Lisp_Object
6259which_symbols (Lisp_Object obj, EMACS_INT find_max)
6260{
6261 struct symbol_block *sblk;
6262 ptrdiff_t gc_count = inhibit_garbage_collection ();
6263 Lisp_Object found = Qnil;
6264
6265 if (!EQ (obj, Vdead))
6266 {
6267 for (sblk = symbol_block; sblk; sblk = sblk->next)
6268 {
6269 struct Lisp_Symbol *sym = sblk->symbols;
6270 int bn;
6271
6272 for (bn = 0; bn < SYMBOL_BLOCK_SIZE; bn++, sym++)
6273 {
6274 Lisp_Object val;
6275 Lisp_Object tem;
6276
6277 if (sblk == symbol_block && bn >= symbol_block_index)
6278 break;
6279
6280 XSETSYMBOL (tem, sym);
6281 val = find_symbol_value (tem);
6282 if (EQ (val, obj)
6283 || EQ (sym->function, obj)
6284 || (!NILP (sym->function)
6285 && COMPILEDP (sym->function)
6286 && EQ (AREF (sym->function, COMPILED_BYTECODE), obj))
6287 || (!NILP (val)
6288 && COMPILEDP (val)
6289 && EQ (AREF (val, COMPILED_BYTECODE), obj)))
6290 {
6291 found = Fcons (tem, found);
6292 if (--find_max == 0)
6293 goto out;
6294 }
6295 }
6296 }
6297 }
6298
6299 out:
6300 unbind_to (gc_count, Qnil);
6301 return found;
6302}
6303
6254#ifdef ENABLE_CHECKING 6304#ifdef ENABLE_CHECKING
6255int suppress_checking; 6305int suppress_checking;
6256 6306