diff -urN guile-1.6.8-pristine/libguile/strings.c guile-1.6.8/libguile/strings.c
--- guile-1.6.8-pristine/libguile/strings.c	2005-06-09 18:42:55.000000000 -0400
+++ guile-1.6.8/libguile/strings.c	2006-11-12 17:10:31.000000000 -0500
@@ -131,7 +131,11 @@
   mem = (char *) scm_must_malloc (len + 1, FUNC_NAME);
   mem[len] = 0;
 
+#ifdef SMALLSTRINGS
   SCM_NEWCELL (s);
+#else
+  SCM_NEWCELL2 (s);
+#endif
   SCM_SET_STRING_CHARS (s, mem);
   SCM_SET_STRING_LENGTH (s, len);
 
@@ -173,7 +177,11 @@
 
   SCM_ASSERT_RANGE (2, scm_ulong2num (len), len <= SCM_STRING_MAX_LENGTH);
 
+#ifdef SMALLSTRINGS
   SCM_NEWCELL (answer);
+#else
+  SCM_NEWCELL2 (answer);
+#endif
   SCM_SET_STRING_CHARS (answer, s);
   SCM_SET_STRING_LENGTH (answer, len);
   scm_done_malloc (len + 1);
@@ -241,7 +249,11 @@
   mem = (char *) scm_must_malloc (len + 1, FUNC_NAME);
   mem[len] = 0;
 
+#ifdef SMALLSTRINGS
   SCM_NEWCELL (s);
+#else
+  SCM_NEWCELL2 (s);
+#endif
   SCM_SET_STRING_CHARS (s, mem);
   SCM_SET_STRING_LENGTH (s, len);
 
@@ -415,13 +427,18 @@
 
   SCM_VALIDATE_ROSTRING (1,str);
   SCM_VALIDATE_INUM_DEF_COPY (2,start,0,f);
-  SCM_VALIDATE_INUM_DEF_COPY (3,end,SCM_ROLENGTH(str),t);
+  SCM_VALIDATE_INUM_DEF_COPY (3,end,SCM_STRING_LENGTH(str),t);
 
   SCM_ASSERT_RANGE (2,start,(f >= 0));
-  SCM_ASSERT_RANGE (3,end, (f <= t) && (t <= SCM_ROLENGTH (str)));
+  SCM_ASSERT_RANGE (3,end, (f <= t) && (t <= SCM_STRING_LENGTH (str)));
 
+#ifdef SMALLSTRINGS
   SCM_NEWCELL (answer);
   SCM_NEWCELL (len_str);
+#else
+  SCM_NEWCELL2 (answer);
+  SCM_NEWCELL2 (len_str);
+#endif
 
   SCM_DEFER_INTS;
   if (SCM_SUBSTRP (str))
@@ -433,14 +450,14 @@
       SCM_SETCAR (len_str, SCM_MAKINUM (f));
       SCM_SETCDR (len_str, SCM_SUBSTR_STR (str));
       SCM_SETCDR (answer, len_str);
-      SCM_SETLENGTH (answer, t - f, scm_tc7_substring);
+      SCM_SET_SUBSTRING_LENGTH (answer, t - f);
     }
   else
     {
       SCM_SETCAR (len_str, SCM_MAKINUM (f));
       SCM_SETCDR (len_str, str);
       SCM_SETCDR (answer, len_str);
-      SCM_SETLENGTH (answer, t - f, scm_tc7_substring);
+      SCM_SET_SUBSTRING_LENGTH (answer, t - f);
     }
   SCM_ALLOW_INTS;
   return answer;
diff -urN guile-1.6.8-pristine/libguile/strings.h guile-1.6.8/libguile/strings.h
--- guile-1.6.8-pristine/libguile/strings.h	2005-06-09 18:42:55.000000000 -0400
+++ guile-1.6.8/libguile/strings.h	2006-11-12 17:16:53.000000000 -0500
@@ -55,9 +55,17 @@
 #define SCM_STRING_CHARS(x) ((char *) (SCM_CELL_WORD_1 (x)))
 #endif
 #define SCM_SET_STRING_CHARS(s, c) (SCM_SET_CELL_WORD_1 ((s), (c)))
+#ifdef SMALLSTRINGS
 #define SCM_STRING_MAX_LENGTH ((1UL << 24) - 1UL)
 #define SCM_STRING_LENGTH(x) ((size_t) (SCM_CELL_WORD_0 (x) >> 8))
 #define SCM_SET_STRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), (((long) (l)) << 8) + scm_tc7_string))
+#define SCM_SET_STRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), (((long) (l)) << 8) + scm_tc7_substring))
+#else
+#define SCM_STRING_MAX_LENGTH ((1UL << (SCM_C_BVEC_LIMB_BITS)) - 1UL)
+#define SCM_STRING_LENGTH(x) ((size_t) (SCM_CELL_WORD_2 (x)))
+#define SCM_SET_STRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), scm_tc7_string), SCM_SET_CELL_WORD_2 ((s), (((long) (l)))))
+#define SCM_SET_SUBSTRING_LENGTH(s, l) (SCM_SET_CELL_WORD_0 ((s), scm_tc7_substring), SCM_SET_CELL_WORD_2 ((s), (((long) (l)))))
+#endif
 
 #define SCM_STRING_COERCE_0TERMINATION_X(x) \
   { if (!SCM_IMP (x) && (SCM_TYP7 (x) == scm_tc7_substring)) \
