summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-05-13 10:24:32 +0200
committerAndy Wingo <wingo@pobox.com>2016-05-13 10:24:32 +0200
commit209d50c7d8c1f8e5e365eb7d88d53c297d71621e (patch)
tree6c4ea17a241d9881316e36016dd47818d0cd246c
parentfe7ceff9691e20723d466542b3ff4132d78f2a3b (diff)
downloadguile-209d50c7d8c1f8e5e365eb7d88d53c297d71621e.tar.gz
Embed scm_t_port in scm_t_port_internal
* libguile/ports-internal.h (scm_t_port_internal) * libguile/ports.h (scm_t_port): Embed scm_t_port in scm_t_port_internal so that we have just one allocation. * libguile/ports-internal.h (SCM_PORT_GET_INTERNAL): Adapt. * libguile/ports.c (scm_i_port_property, scm_i_set_port_property_x) (scm_c_make_port_with_encoding): Adapt.
-rw-r--r--libguile/ports-internal.h3
-rw-r--r--libguile/ports.c17
-rw-r--r--libguile/ports.h3
3 files changed, 7 insertions, 16 deletions
diff --git a/libguile/ports-internal.h b/libguile/ports-internal.h
index 689e61c17..a7d61d405 100644
--- a/libguile/ports-internal.h
+++ b/libguile/ports-internal.h
@@ -226,6 +226,7 @@ typedef struct scm_iconv_descriptors scm_t_iconv_descriptors;
struct scm_port_internal
{
+ scm_t_port pt;
unsigned at_stream_start_for_bom_read : 1;
unsigned at_stream_start_for_bom_write : 1;
scm_t_iconv_descriptors *iconv_descriptors;
@@ -236,7 +237,7 @@ typedef struct scm_port_internal scm_t_port_internal;
#define SCM_UNICODE_BOM 0xFEFFUL /* Unicode byte-order mark */
-#define SCM_PORT_GET_INTERNAL(x) (SCM_PTAB_ENTRY(x)->internal)
+#define SCM_PORT_GET_INTERNAL(x) ((scm_t_port_internal*) SCM_PTAB_ENTRY(x))
typedef enum scm_t_port_rw_active {
SCM_PORT_NEITHER = 0,
diff --git a/libguile/ports.c b/libguile/ports.c
index 6003129e2..c3d5f5ee1 100644
--- a/libguile/ports.c
+++ b/libguile/ports.c
@@ -366,15 +366,9 @@ SCM_DEFINE (scm_i_port_property, "%port-property", 2, 0, 0,
"Return the property of @var{port} associated with @var{key}.")
#define FUNC_NAME s_scm_i_port_property
{
- SCM result;
- scm_t_port *pt;
-
SCM_VALIDATE_OPPORT (1, port);
- pt = SCM_PTAB_ENTRY (port);
- result = scm_assq_ref (pt->internal->alist, key);
-
- return result;
+ return scm_assq_ref (SCM_PORT_GET_INTERNAL (port)->alist, key);
}
#undef FUNC_NAME
@@ -383,12 +377,12 @@ SCM_DEFINE (scm_i_set_port_property_x, "%set-port-property!", 3, 0, 0,
"Set the property of @var{port} associated with @var{key} to @var{value}.")
#define FUNC_NAME s_scm_i_set_port_property_x
{
- scm_t_port *pt;
+ scm_t_port_internal *pti;
SCM_VALIDATE_OPPORT (1, port);
- pt = SCM_PTAB_ENTRY (port);
- pt->internal->alist = scm_assq_set_x (pt->internal->alist, key, value);
+ pti = SCM_PORT_GET_INTERNAL (port);
+ pti->alist = scm_assq_set_x (pti->alist, key, value);
return SCM_UNSPECIFIED;
}
@@ -725,15 +719,14 @@ scm_c_make_port_with_encoding (scm_t_bits tag, unsigned long mode_bits,
scm_t_port_internal *pti;
scm_t_ptob_descriptor *ptob;
- entry = scm_gc_typed_calloc (scm_t_port);
pti = scm_gc_typed_calloc (scm_t_port_internal);
+ entry = &pti->pt;
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);
- entry->internal = pti;
entry->file_name = SCM_BOOL_F;
entry->stream = stream;
entry->encoding = encoding;
diff --git a/libguile/ports.h b/libguile/ports.h
index 84f4e0183..793523b71 100644
--- a/libguile/ports.h
+++ b/libguile/ports.h
@@ -81,9 +81,6 @@ enum scm_port_buffer_field {
typedef struct
{
- /* Pointer to internal-only port structure. */
- struct scm_port_internal *internal;
-
/* Data for the underlying port implementation as a raw C value. */
scm_t_bits stream;