[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