From e03b7f73e2927178f2d9485320435edb6260c311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Tue, 26 Jan 2010 00:00:58 +0100 Subject: [PATCH] Recognize structs with both "pr" and "pw" flags as simple. * libguile/struct.c (set_vtable_layout_flags): Keep the `SCM_VTABLE_FLAG_SIMPLE' flag when VTABLE has a mixture of `r' and `w' fields. * libguile/struct.h (SCM_VTABLE_FLAG_SIMPLE): Adjust comment. --- libguile/struct.c | 17 +++++------------ libguile/struct.h | 2 +- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/libguile/struct.c b/libguile/struct.c index 4a9455517..c28a76d48 100644 --- a/libguile/struct.c +++ b/libguile/struct.c @@ -180,18 +180,13 @@ set_vtable_layout_flags (SCM vtable) { case 'w': case 'W': - if (!(flags & SCM_VTABLE_FLAG_SIMPLE_RW) && field > 0) - /* There's a mixture of `w' and `r' flags. */ - flags = 0; - else + if (field == 0) flags |= SCM_VTABLE_FLAG_SIMPLE_RW; break; case 'r': case 'R': - if (flags & SCM_VTABLE_FLAG_SIMPLE_RW) - /* There's a mixture of `w' and `r' flags. */ - flags = 0; + flags &= ~SCM_VTABLE_FLAG_SIMPLE_RW; break; default: @@ -711,10 +706,8 @@ SCM_DEFINE (scm_struct_ref, "struct-ref", 2, 0, 0, if (SCM_LIKELY (SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_SIMPLE) && p < SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size))) - { - /* The fast path: HANDLE is a struct with only "p" fields. */ - answer = SCM_PACK (data[p]); - } + /* The fast path: HANDLE is a struct with only "p" fields. */ + answer = SCM_PACK (data[p]); else { SCM layout; @@ -801,7 +794,7 @@ SCM_DEFINE (scm_struct_set_x, "struct-set!", 3, 0, 0, if (SCM_LIKELY (SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_SIMPLE) && SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_SIMPLE_RW) && p < SCM_STRUCT_DATA_REF (vtable, scm_vtable_index_size))) - /* The fast path: HANDLE is a struct with only "p" fields. */ + /* The fast path: HANDLE is a struct with only "pw" fields. */ data[p] = SCM_UNPACK (val); else { diff --git a/libguile/struct.h b/libguile/struct.h index 374a5ce74..d2a05af2a 100644 --- a/libguile/struct.h +++ b/libguile/struct.h @@ -107,7 +107,7 @@ #define SCM_VTABLE_FLAG_APPLICABLE (1L << 2) /* instances of this vtable are applicable? */ #define SCM_VTABLE_FLAG_SETTER_VTABLE (1L << 3) /* instances of this vtable are applicable-with-setter vtables? */ #define SCM_VTABLE_FLAG_SETTER (1L << 4) /* instances of this vtable are applicable-with-setters? */ -#define SCM_VTABLE_FLAG_SIMPLE (1L << 5) /* instances of this vtable have only "pr" fields */ +#define SCM_VTABLE_FLAG_SIMPLE (1L << 5) /* instances of this vtable have only "p" fields */ #define SCM_VTABLE_FLAG_SIMPLE_RW (1L << 6) /* instances of this vtable have only "pw" fields */ #define SCM_VTABLE_FLAG_SMOB_0 (1L << 7) #define SCM_VTABLE_FLAG_GOOPS_0 (1L << 8)