1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 14:00:21 +02:00

Make scm_t_port private

* libguile/ports-internal.h (enum scm_port_encoding_mode): Remove unused
  enum.
  (scm_t_port_internal, scm_t_port): Make encoding and
  conversion_strategy private. Instead of scm_t_port_internal containing
  scm_t_port, now that all members are private, we can store the user's
  "stream" in a word in the port object itself and make the whole of
  scm_t_port private.  The next commit will remove scm_t_port_internal.
  (SCM_PTAB_ENTRY, SCM_PORT_DESCRIPTOR): Make private.
* libguile/ports.c (scm_c_make_port_with_encoding): Adapt to new port
  layout.
  (scm_port_print): Use SCM_PTAB_ENTRY when printing.
* libguile/ports.h: Remove scm_t_port definition.
* libguile/ioext.c (get_matching_port): Simplify.
* libguile/fports.c (scm_i_evict_port): Simplify.
This commit is contained in:
Andy Wingo 2016-05-13 11:21:41 +02:00
parent 9a9e0cceae
commit e5d2f4e566
5 changed files with 32 additions and 63 deletions

View file

@ -83,16 +83,9 @@ scm_i_evict_port (void *closure, SCM port)
{
int fd = * (int*) closure;
if (SCM_FPORTP (port))
if (SCM_OPFPORTP (port))
{
scm_t_port *p;
scm_t_fport *fp;
/* XXX: In some cases, we can encounter a port with no associated ptab
entry. */
p = SCM_PTAB_ENTRY (port);
fp = (p != NULL) ? (scm_t_fport *) p->stream : NULL;
scm_t_fport *fp = SCM_FSTREAM (port);
if ((fp != NULL) && (fp->fdes == fd))
{
fp->fdes = dup (fd);

View file

@ -276,10 +276,8 @@ static SCM
get_matching_port (void *closure, SCM port, SCM result)
{
int fd = * (int *) closure;
scm_t_port *entry = SCM_PTAB_ENTRY (port);
if (SCM_OPFPORTP (port)
&& ((scm_t_fport *) entry->stream)->fdes == fd)
if (SCM_OPFPORTP (port) && SCM_FSTREAM (port)->fdes == fd)
result = scm_cons (port, result);
return result;

View file

@ -231,14 +231,6 @@ scm_port_buffer_putback (SCM buf, const scm_t_uint8 *src, size_t count)
src, count);
}
enum scm_port_encoding_mode {
SCM_PORT_ENCODING_MODE_UTF8,
SCM_PORT_ENCODING_MODE_LATIN1,
SCM_PORT_ENCODING_MODE_ICONV
};
typedef enum scm_port_encoding_mode scm_t_port_encoding_mode;
/* This is a separate object so that only those ports that use iconv
cause finalizers to be registered. */
struct scm_iconv_descriptors
@ -257,10 +249,8 @@ struct scm_iconv_descriptors
typedef struct scm_iconv_descriptors scm_t_iconv_descriptors;
struct scm_port_internal
struct scm_port
{
scm_t_port pt;
/* Source location information. */
SCM file_name;
long line_number;
@ -284,13 +274,21 @@ struct scm_port_internal
and so on. */
int rw_random;
/* Character encoding support. */
SCM encoding; /* A symbol of upper-case ASCII. */
SCM conversion_strategy; /* A symbol; either substitute, error, or escape. */
unsigned at_stream_start_for_bom_read : 1;
unsigned at_stream_start_for_bom_write : 1;
scm_t_iconv_descriptors *iconv_descriptors;
SCM alist;
};
typedef struct scm_port_internal scm_t_port_internal;
typedef struct scm_port scm_t_port;
typedef scm_t_port scm_t_port_internal;
#define SCM_PTAB_ENTRY(x) ((scm_t_port *) SCM_CELL_WORD_2 (x))
#define SCM_PORT_DESCRIPTOR(port) ((scm_t_ptob_descriptor *) SCM_CELL_WORD_3 (port))
#define SCM_UNICODE_BOM 0xFEFFUL /* Unicode byte-order mark */

View file

@ -55,7 +55,7 @@
#include "libguile/strings.h"
#include "libguile/mallocs.h"
#include "libguile/validate.h"
#include "libguile/ports.h"
//#include "libguile/ports.h"
#include "libguile/ports-internal.h"
#include "libguile/vectors.h"
#include "libguile/weak-set.h"
@ -716,28 +716,26 @@ scm_c_make_port_with_encoding (scm_t_bits tag, unsigned long mode_bits,
scm_t_bits stream)
{
SCM ret;
scm_t_port *entry;
scm_t_port_internal *pti;
scm_t_port *pt;
scm_t_ptob_descriptor *ptob;
pti = scm_gc_typed_calloc (scm_t_port_internal);
entry = &pti->pt;
pt = scm_gc_typed_calloc (scm_t_port);
ptob = scm_c_port_type_ref (SCM_TC2PTOBNUM (tag));
ret = scm_words (tag | mode_bits, 3);
SCM_SET_CELL_WORD_1 (ret, (scm_t_bits) entry);
SCM_SET_CELL_WORD_2 (ret, (scm_t_bits) ptob);
ret = scm_words (tag | mode_bits, 4);
SCM_SET_CELL_WORD_1 (ret, stream);
SCM_SET_CELL_WORD_2 (ret, (scm_t_bits) pt);
SCM_SET_CELL_WORD_3 (ret, (scm_t_bits) ptob);
entry->stream = stream;
entry->encoding = encoding;
entry->conversion_strategy = conversion_strategy;
pti->file_name = SCM_BOOL_F;
pti->iconv_descriptors = NULL;
pt->encoding = encoding;
pt->conversion_strategy = conversion_strategy;
pt->file_name = SCM_BOOL_F;
pt->iconv_descriptors = NULL;
pti->at_stream_start_for_bom_read = 1;
pti->at_stream_start_for_bom_write = 1;
pt->at_stream_start_for_bom_read = 1;
pt->at_stream_start_for_bom_write = 1;
pti->alist = SCM_EOL;
pt->alist = SCM_EOL;
if (SCM_PORT_DESCRIPTOR (ret)->flags & SCM_PORT_TYPE_NEEDS_CLOSE_ON_GC)
{
@ -747,7 +745,7 @@ scm_c_make_port_with_encoding (scm_t_bits tag, unsigned long mode_bits,
initialize_port_buffers (ret);
pti->rw_random = ptob->random_access_p (ret);
pt->rw_random = ptob->random_access_p (ret);
return ret;
}
@ -3098,7 +3096,7 @@ scm_port_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED)
scm_print_port_mode (exp, port);
scm_puts (type, port);
scm_putc (' ', port);
scm_uintprint (SCM_CELL_WORD_1 (exp), 16, port);
scm_uintprint ((scm_t_bits) SCM_PTAB_ENTRY (exp), 16, port);
scm_putc ('>', port);
return 1;
}

View file

@ -41,22 +41,6 @@
/* An internal-only structure defined in ports-internal.h. */
struct scm_port_internal;
/* C representation of a Scheme port. */
typedef struct
{
/* Data for the underlying port implementation as a raw C value. */
scm_t_bits stream;
/* Character encoding support. */
SCM encoding; /* A symbol of upper-case ASCII. */
SCM conversion_strategy; /* A symbol; either substitute, error, or escape. */
} scm_t_port;
SCM_INTERNAL SCM scm_i_port_weak_set;
@ -86,11 +70,9 @@ SCM_INTERNAL SCM scm_i_port_weak_set;
#define SCM_CLR_PORT_OPEN_FLAG(p) \
SCM_SET_CELL_WORD_0 ((p), SCM_CELL_WORD_0 (p) & ~SCM_OPN)
#define SCM_PTAB_ENTRY(x) ((scm_t_port *) SCM_CELL_WORD_1 (x))
#define SCM_PORT_DESCRIPTOR(port) ((scm_t_ptob_descriptor *) SCM_CELL_WORD_2 (port))
#define SCM_SETPTAB_ENTRY(x, ent) (SCM_SET_CELL_WORD_1 ((x), (scm_t_bits) (ent)))
#define SCM_STREAM(x) (SCM_PTAB_ENTRY(x)->stream)
#define SCM_SETSTREAM(x, s) (SCM_PTAB_ENTRY(x)->stream = (scm_t_bits) (s))
#define SCM_STREAM(port) (SCM_CELL_WORD_1 (port))
#define SCM_SETSTREAM(port, stream) (SCM_SET_CELL_WORD_1 (port, stream))
/* Maximum number of port types. */
#define SCM_I_MAX_PORT_TYPE_COUNT 256