Recognize structs with both "pr" and "pw" flags as simple.
authorLudovic Courtès <ludo@gnu.org>
Mon, 25 Jan 2010 23:00:58 +0000 (00:00 +0100)
committerLudovic Courtès <ludo@gnu.org>
Mon, 25 Jan 2010 23:00:58 +0000 (00:00 +0100)
* 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
libguile/struct.h

index 4a94555..c28a76d 100644 (file)
@@ -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
     {
index 374a5ce..d2a05af 100644 (file)
 #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)