mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-07-02 23:50:47 +02:00
Remove print state objects, and ports-with-print-state
The goal was that, as part of a print operation, all nested prints of contained data would be able to use the same parameters (e.g. write or not), and also detect cycles, highlight objects, etc. The mechanism was a heap-allocated data structure. However, given that: 1. Nobody accessed print states from Scheme 2. `write` and `display` should move to Scheme anyway, in order to be suspendable 3. The "fancyp" and "highlight" options were unused 4. A simple stack-allocated data structure with a per-thread key could do the trick just as well, without needing the weird freelist structure 5. Ports-with-print-states were a source of bugs In the end we switch print states to be something completely internal to print.c. There are no more SCM print-state objects, and no more ports-with-print-state. * libguile/print.h: Remove print state from API. * libguile/print.c (struct scm_print_state): Move definition here. (scm_print_opts): Remove "highlight-prefix" and "highlight-suffix" options, as they were not used. (ENTER_NESTED_DATA): Remove "fancyp" case. (init_print_state_key, get_print_state, push_print_state) (maybe_push_print_state, pop_print_state): New facility to manage stack of active print states. (scm_iprin1, print_vector): No more fancyp. (iprin1): Access "writingp" member directly. Don't make ports with print states. (scm_prin1): Manage print state stack. (scm_iprlist): No more fancyp. (scm_valid_oport_value_p): Remove; valid outports are SCM_OPOUTPORTP. * libguile/backtrace.c: * libguile/filesys.c: * libguile/fports.c: * libguile/goops.c: * libguile/ioext.c: * libguile/ports.c: * libguile/posix.c: * libguile/promises.c: * libguile/socket.c: * libguile/struct.c: Remove cases that dealt with ports-with-print-states. * libguile/private-options.h: Remove highlight options. * module/ice-9/ports.scm (inherit-print-state): Deprecate. * libguile/deprecated.c: * libguile/deprecated.h: Add deprecation shims for print states, as far as that is possible.
This commit is contained in:
parent
d1b548033c
commit
3cf4ca187c
16 changed files with 181 additions and 425 deletions
|
@ -1,7 +1,7 @@
|
|||
#ifndef SCM_PRINT_H
|
||||
#define SCM_PRINT_H
|
||||
|
||||
/* Copyright 1995-1996,1998,2000-2001,2003-2004,2006,2008,2010,2012,2017-2018
|
||||
/* Copyright 1995-1996,1998,2000-2001,2003-2004,2006,2008,2010,2012,2017-2018,2025
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Guile.
|
||||
|
@ -29,63 +29,10 @@
|
|||
|
||||
|
||||
|
||||
/* State information passed around during printing.
|
||||
*/
|
||||
#define SCM_PRINT_STATE_P(obj) (SCM_STRUCTP(obj) \
|
||||
&& (scm_is_eq (SCM_STRUCT_VTABLE(obj), \
|
||||
scm_print_state_vtable)))
|
||||
#define SCM_PRINT_STATE(obj) ((scm_print_state *) SCM_STRUCT_DATA (obj))
|
||||
|
||||
#define RESET_PRINT_STATE(pstate) \
|
||||
do { \
|
||||
pstate->list_offset = 0; \
|
||||
pstate->top = 0; \
|
||||
} while (0)
|
||||
|
||||
#define SCM_WRITINGP(pstate) ((pstate)->writingp)
|
||||
#define SCM_SET_WRITINGP(pstate, x) { (pstate)->writingp = (x); }
|
||||
|
||||
#define SCM_PORT_WITH_PS_P(p) SCM_TYP16_PREDICATE (scm_tc16_port_with_ps, p)
|
||||
#define SCM_PORT_WITH_PS_PORT(p) SCM_CELL_OBJECT_1 (p)
|
||||
#define SCM_PORT_WITH_PS_PS(p) SCM_CELL_OBJECT_2 (p)
|
||||
|
||||
#define SCM_COERCE_OUTPORT(p) \
|
||||
(SCM_PORT_WITH_PS_P (p) ? SCM_PORT_WITH_PS_PORT (p) : p)
|
||||
|
||||
#define SCM_VALIDATE_OPORT_VALUE(pos, port) \
|
||||
do { \
|
||||
SCM_ASSERT (scm_valid_oport_value_p (port), port, pos, FUNC_NAME); \
|
||||
} while (0)
|
||||
|
||||
#define SCM_VALIDATE_PRINTSTATE(pos, a) \
|
||||
SCM_MAKE_VALIDATE_MSG(pos, a, PRINT_STATE_P, "print-state")
|
||||
|
||||
#define SCM_PRINT_STATE_LAYOUT "pwuwuwuwuwuwpwuwuwuwpwpw"
|
||||
typedef struct scm_print_state {
|
||||
SCM handle; /* Struct handle */
|
||||
int revealed; /* Has the state escaped to Scheme? */
|
||||
unsigned long writingp; /* Writing? */
|
||||
unsigned long fancyp; /* Fancy printing? */
|
||||
unsigned long level; /* Max level */
|
||||
unsigned long length; /* Max number of objects per level */
|
||||
SCM hot_ref; /* Hot reference */
|
||||
unsigned long list_offset;
|
||||
unsigned long top; /* Top of reference stack */
|
||||
unsigned long ceiling; /* Max size of reference stack */
|
||||
SCM ref_vect; /* Stack of references used during
|
||||
circular reference detection;
|
||||
a vector. */
|
||||
SCM highlight_objects; /* List of objects to be highlighted */
|
||||
} scm_print_state;
|
||||
|
||||
SCM_API SCM scm_print_state_vtable;
|
||||
|
||||
SCM_API scm_t_bits scm_tc16_port_with_ps;
|
||||
struct scm_print_state;
|
||||
typedef struct scm_print_state scm_print_state;
|
||||
|
||||
SCM_API SCM scm_print_options (SCM setting);
|
||||
SCM_API SCM scm_make_print_state (void);
|
||||
SCM_API void scm_free_print_state (SCM print_state);
|
||||
SCM_INTERNAL SCM scm_i_port_with_print_state (SCM port, SCM print_state);
|
||||
SCM_API void scm_intprint (intmax_t n, int radix, SCM port);
|
||||
SCM_API void scm_uintprint (uintmax_t n, int radix, SCM port);
|
||||
SCM_API void scm_ipruk (char *hdr, SCM ptr, SCM port);
|
||||
|
@ -98,14 +45,6 @@ SCM_API SCM scm_display (SCM obj, SCM port);
|
|||
SCM_API SCM scm_simple_format (SCM port, SCM message, SCM args);
|
||||
SCM_API SCM scm_newline (SCM port);
|
||||
SCM_API SCM scm_write_char (SCM chr, SCM port);
|
||||
SCM_API SCM scm_printer_apply (SCM proc, SCM exp, SCM port, scm_print_state *);
|
||||
SCM_API SCM scm_port_with_print_state (SCM port, SCM pstate);
|
||||
SCM_API SCM scm_get_print_state (SCM port);
|
||||
SCM_API int scm_valid_oport_value_p (SCM val);
|
||||
SCM_INTERNAL void scm_init_print (void);
|
||||
|
||||
#ifdef GUILE_DEBUG
|
||||
SCM_API SCM scm_current_pstate (void);
|
||||
#endif
|
||||
|
||||
#endif /* SCM_PRINT_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue