Give StringView a utf8() API.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 20 May 2015 05:57:55 +0000 (05:57 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 20 May 2015 05:57:55 +0000 (05:57 +0000)
<https://webkit.org/b/145201>

Source/JavaScriptCore:

Reviewed by Anders Carlsson.

Use JSString::view() in a few places where we couldn't before due to StringView
lacking a utf8() API. This is a minor speed-up on Kraken's crypto subtests,
which like to call encode() with substring JSStrings.

* jsc.cpp:
(functionPrint):
(functionDebug):
* runtime/JSGlobalObjectFunctions.cpp:
(JSC::encode):

Source/WTF:

Reviewed by Anders Carlsson

Added an LChar version of StringImpl::utf8ForCharacters() and use that to give
StringView a utf8() API just like String has.

* wtf/text/StringImpl.cpp:
(WTF::StringImpl::utf8ForCharacters):
* wtf/text/StringImpl.h:
* wtf/text/StringView.cpp:
(WTF::StringView::utf8):
* wtf/text/StringView.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@184617 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/jsc.cpp
Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp
Source/WTF/ChangeLog
Source/WTF/wtf/text/StringImpl.cpp
Source/WTF/wtf/text/StringImpl.h
Source/WTF/wtf/text/StringView.cpp
Source/WTF/wtf/text/StringView.h

index 4e2d961..cb19e97 100644 (file)
@@ -1,5 +1,22 @@
 2015-05-19  Andreas Kling  <akling@apple.com>
 
+        Give StringView a utf8() API.
+        <https://webkit.org/b/145201>
+
+        Reviewed by Anders Carlsson.
+
+        Use JSString::view() in a few places where we couldn't before due to StringView
+        lacking a utf8() API. This is a minor speed-up on Kraken's crypto subtests,
+        which like to call encode() with substring JSStrings.
+
+        * jsc.cpp:
+        (functionPrint):
+        (functionDebug):
+        * runtime/JSGlobalObjectFunctions.cpp:
+        (JSC::encode):
+
+2015-05-19  Andreas Kling  <akling@apple.com>
+
         [JSC] Speed up URL encode/decode by using bitmaps instead of strchr().
         <https://webkit.org/b/145115>
 
index a0ec770..20f1117 100644 (file)
@@ -690,7 +690,7 @@ EncodedJSValue JSC_HOST_CALL functionPrint(ExecState* exec)
         if (i)
             putchar(' ');
 
-        printf("%s", exec->uncheckedArgument(i).toString(exec)->value(exec).utf8().data());
+        printf("%s", exec->uncheckedArgument(i).toString(exec)->view(exec).utf8().data());
     }
 
     putchar('\n');
@@ -711,7 +711,7 @@ EncodedJSValue JSC_HOST_CALL functionDumpCallFrame(ExecState* exec)
 
 EncodedJSValue JSC_HOST_CALL functionDebug(ExecState* exec)
 {
-    fprintf(stderr, "--> %s\n", exec->argument(0).toString(exec)->value(exec).utf8().data());
+    fprintf(stderr, "--> %s\n", exec->argument(0).toString(exec)->view(exec).utf8().data());
     return JSValue::encode(jsUndefined());
 }
 
index 11e009f..04fd603 100644 (file)
@@ -64,7 +64,7 @@ static Bitmap<256> makeCharacterBitmap(const char (&characters)[charactersCount]
 
 static JSValue encode(ExecState* exec, const Bitmap<256>& doNotEscape)
 {
-    CString cstr = exec->argument(0).toString(exec)->value(exec).utf8(StrictConversion);
+    CString cstr = exec->argument(0).toString(exec)->view(exec).utf8(StrictConversion);
     if (!cstr.data())
         return exec->vm().throwException(exec, createURIError(exec, ASCIILiteral("String contained an illegal UTF-16 sequence.")));
 
index 2156ef4..58ad188 100644 (file)
@@ -1,3 +1,20 @@
+2015-05-19  Andreas Kling  <akling@apple.com>
+
+        Give StringView a utf8() API.
+        <https://webkit.org/b/145201>
+
+        Reviewed by Anders Carlsson
+
+        Added an LChar version of StringImpl::utf8ForCharacters() and use that to give
+        StringView a utf8() API just like String has.
+
+        * wtf/text/StringImpl.cpp:
+        (WTF::StringImpl::utf8ForCharacters):
+        * wtf/text/StringImpl.h:
+        * wtf/text/StringView.cpp:
+        (WTF::StringView::utf8):
+        * wtf/text/StringView.h:
+
 2015-05-19  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Move AtomicStringImpl table related operations from AtomicString to AtomicStringImpl
index 8ff3f8b..3fb9471 100644 (file)
@@ -2198,6 +2198,20 @@ bool StringImpl::utf8Impl(const UChar* characters, unsigned length, char*& buffe
     return true;
 }
 
+CString StringImpl::utf8ForCharacters(const LChar* characters, unsigned length)
+{
+    if (!length)
+        return CString("", 0);
+    if (length > std::numeric_limits<unsigned>::max() / 3)
+        return CString();
+    Vector<char, 1024> bufferVector(length * 3);
+    char* buffer = bufferVector.data();
+    const LChar* source = characters;
+    ConversionResult result = convertLatin1ToUTF8(&source, source + length, &buffer, buffer + bufferVector.size());
+    ASSERT_UNUSED(result, result != targetExhausted); // (length * 3) should be sufficient for any conversion
+    return CString(bufferVector.data(), buffer - bufferVector.data());
+}
+
 CString StringImpl::utf8ForCharacters(const UChar* characters, unsigned length, ConversionMode mode)
 {
     if (!length)
index 1a1a1c8..f1a667b 100644 (file)
@@ -512,6 +512,7 @@ public:
     bool isSubString() const { return bufferOwnership() == BufferSubstring; }
 #endif
 
+    static WTF_EXPORT_STRING_API CString utf8ForCharacters(const LChar* characters, unsigned length);
     static WTF_EXPORT_STRING_API CString utf8ForCharacters(const UChar* characters, unsigned length, ConversionMode = LenientConversion);
     WTF_EXPORT_STRING_API CString utf8ForRange(unsigned offset, unsigned length, ConversionMode = LenientConversion) const;
     WTF_EXPORT_STRING_API CString utf8(ConversionMode = LenientConversion) const;
index f38d577..41b73a6 100644 (file)
@@ -30,9 +30,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <mutex>
 #include <wtf/HashMap.h>
 #include <wtf/NeverDestroyed.h>
+#include <wtf/unicode/UTF8.h>
 
 namespace WTF {
 
+using namespace Unicode;
+
 bool StringView::containsIgnoringASCIICase(const StringView& matchString) const
 {
     return findIgnoringASCIICase(matchString) != notFound;
@@ -84,6 +87,15 @@ bool equalIgnoringASCIICase(StringView a, const char* b, unsigned bLength)
     return equalIgnoringASCIICase(a.characters16(), b, bLength);
 }
 
+CString StringView::utf8(ConversionMode mode) const
+{
+    if (isNull())
+        return CString("", 0);
+    if (is8Bit())
+        return StringImpl::utf8ForCharacters(characters8(), length());
+    return StringImpl::utf8ForCharacters(characters16(), length(), mode);
+}
+
 #if CHECK_STRINGVIEW_LIFETIME
 
 // Manage reference count manually so UnderlyingString does not need to be defined in the header.
index 2b12e1b..343de14 100644 (file)
@@ -30,6 +30,8 @@
 #include <wtf/Forward.h>
 #include <wtf/RetainPtr.h>
 #include <wtf/Vector.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/ConversionMode.h>
 #include <wtf/text/LChar.h>
 #include <wtf/text/StringCommon.h>
 
@@ -96,6 +98,8 @@ public:
     WTF_EXPORT_STRING_API RetainPtr<NSString> createNSStringWithoutCopying() const;
 #endif
 
+    WTF_EXPORT_STRING_API CString utf8(ConversionMode = LenientConversion) const;
+
     class UpconvertedCharacters;
     UpconvertedCharacters upconvertedCharacters() const;