diff options
Diffstat (limited to 'src/print.c')
| -rw-r--r-- | src/print.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/src/print.c b/src/print.c index 71efb61e732..2ffe7def396 100644 --- a/src/print.c +++ b/src/print.c @@ -1,7 +1,7 @@ /* Lisp object printing and output streams. -Copyright (C) 1985-1986, 1988, 1993-1995, 1997-2012 - Free Software Foundation, Inc. +Copyright (C) 1985-1986, 1988, 1993-1995, 1997-2013 Free Software +Foundation, Inc. This file is part of GNU Emacs. @@ -2070,14 +2070,44 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag break; case Lisp_Misc_Save_Value: - strout ("#<save_value ", -1, -1, printcharfun); { - int len = sprintf (buf, "ptr=%p int=%"pD"d", - XSAVE_VALUE (obj)->pointer, - XSAVE_VALUE (obj)->integer); - strout (buf, len, len, printcharfun); + int i; + struct Lisp_Save_Value *v = XSAVE_VALUE (obj); + + strout ("#<save-value ", -1, -1, printcharfun); + if (v->dogc) + { + int lim = min (v->integer, 8); + + /* Try to print up to 8 objects we have saved. Although + valid_lisp_object_p is slow, this shouldn't be a real + bottleneck because such a saved values are quite rare. */ + + i = sprintf (buf, "with %"pD"d objects", v->integer); + strout (buf, i, i, printcharfun); + + for (i = 0; i < lim; i++) + { + Lisp_Object maybe = ((Lisp_Object *) v->pointer)[i]; + + if (valid_lisp_object_p (maybe) > 0) + { + PRINTCHAR (' '); + print_object (maybe, printcharfun, escapeflag); + } + else + strout (" <invalid>", -1, -1, printcharfun); + } + if (i == lim && i < v->integer) + strout (" ...", 4, 4, printcharfun); + } + else + { + i = sprintf (buf, "ptr=%p int=%"pD"d", v->pointer, v->integer); + strout (buf, i, i, printcharfun); + } + PRINTCHAR ('>'); } - PRINTCHAR ('>'); break; default: |
