diff options
| author | Alan Mackenzie | 2011-11-03 22:03:18 +0000 |
|---|---|---|
| committer | Alan Mackenzie | 2011-11-03 22:03:18 +0000 |
| commit | 85ba4cded3ef5a834c880edfdb6cf7ec3a747e9b (patch) | |
| tree | 2a207d6e9e906119087ad357c892414db01211cb /src/alloc.c | |
| parent | a6ba2ab9277496b66f6939766a3470c1f0a84287 (diff) | |
| parent | 14e1d9eab9f4b7341f92397a0a9a2706f7b26ee9 (diff) | |
| download | emacs-85ba4cded3ef5a834c880edfdb6cf7ec3a747e9b.tar.gz emacs-85ba4cded3ef5a834c880edfdb6cf7ec3a747e9b.zip | |
Merge.
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 50 |
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); | |||
| 279 | static void free_large_strings (void); | 279 | static void free_large_strings (void); |
| 280 | static void sweep_strings (void); | 280 | static void sweep_strings (void); |
| 281 | static void free_misc (Lisp_Object); | 281 | static void free_misc (Lisp_Object); |
| 282 | extern 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 | |||
| 6257 | Lisp_Object | ||
| 6258 | which_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 |
| 6254 | int suppress_checking; | 6304 | int suppress_checking; |
| 6255 | 6305 | ||