[svn:parrot] r48938 - in trunk/src/string: . encoding

chromatic at svn.parrot.org chromatic at svn.parrot.org
Sat Sep 11 20:14:06 UTC 2010


Author: chromatic
Date: Sat Sep 11 20:14:06 2010
New Revision: 48938
URL: https://trac.parrot.org/parrot/changeset/48938

Log:
[string] Optimized Parrot_str_substr().

If the substring has no offset and the same length as the source, return the
source directly.  (Hooray for immutable STRINGs!)  This optimizes Rakudo
slightly by allocating fewer STRING headers.

Modified:
   trunk/src/string/api.c
   trunk/src/string/encoding/shared.c

Modified: trunk/src/string/api.c
==============================================================================
--- trunk/src/string/api.c	Sat Sep 11 18:25:37 2010	(r48937)
+++ trunk/src/string/api.c	Sat Sep 11 20:14:06 2010	(r48938)
@@ -964,8 +964,9 @@
 {
     ASSERT_ARGS(Parrot_str_substr)
 
-    UINTVAL true_length;
-    UINTVAL true_offset = (UINTVAL)offset;
+    UINTVAL       true_length;
+    UINTVAL       true_offset = (UINTVAL)offset;
+    const UINTVAL src_length  = Parrot_str_length(interp, src);
 
     if (STRING_IS_NULL(src))
         Parrot_ex_throw_from_c_args(interp, NULL,
@@ -974,24 +975,27 @@
     ASSERT_STRING_SANITY(src);
 
     /* Allow regexes to return $' easily for "aaa" =~ /aaa/ */
-    if (offset == (INTVAL)Parrot_str_length(interp, src) || length < 1)
+    if (offset == src_length || length < 1)
         return Parrot_str_new_noinit(interp, 0);
 
     if (offset < 0)
-        true_offset = (UINTVAL)(src->strlen + offset);
+        true_offset = src_length + offset;
 
     /* 0 based... */
-    if (src->strlen == 0 || true_offset > src->strlen - 1)
+    if (src_length == 0 || true_offset > src_length - 1)
         Parrot_ex_throw_from_c_args(interp, NULL,
             EXCEPTION_SUBSTR_OUT_OF_STRING,
             "Cannot take substr outside string");
 
     true_length = (UINTVAL)length;
 
-    if (true_length > (src->strlen - true_offset))
-        true_length = (UINTVAL)(src->strlen - true_offset);
+    if (true_length > (src_length - true_offset))
+        true_length = (UINTVAL)(src_length - true_offset);
 
-    return STRING_substr(interp, src, true_offset, true_length);
+    if (true_length == src_length && !offset)
+        return src;
+    else
+        return STRING_substr(interp, src, true_offset, true_length);
 }
 
 /*

Modified: trunk/src/string/encoding/shared.c
==============================================================================
--- trunk/src/string/encoding/shared.c	Sat Sep 11 18:25:37 2010	(r48937)
+++ trunk/src/string/encoding/shared.c	Sat Sep 11 20:14:06 2010	(r48938)
@@ -813,13 +813,11 @@
     ASSERT_ARGS(fixed8_substr)
     STRING * const return_string = Parrot_str_copy(interp, src);
 
-    return_string->encoding = src->encoding;
-
-    return_string->strstart = (char *)return_string->strstart + offset ;
-    return_string->bufused = count;
-
-    return_string->strlen = count;
-    return_string->hashval = 0;
+    return_string->encoding      = src->encoding;
+    return_string->strstart      = (char *)return_string->strstart + offset;
+    return_string->bufused       = count;
+    return_string->strlen        = count;
+    return_string->hashval       = 0;
 
     return return_string;
 }


More information about the parrot-commits mailing list