]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - API/JSStringRef.cpp
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / API / JSStringRef.cpp
index 9a307d045b36665df9c0e0a0377fedc3f411da66..c9b380ce654159d3cd11ebe259046bc691ed0ffa 100644 (file)
@@ -1,4 +1,3 @@
-// -*- mode: c++; c-basic-offset: 4 -*-
 /*
  * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
  *
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
  *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 
 #include "config.h"
 #include "JSStringRef.h"
+#include "JSStringRefPrivate.h"
 
-#include <wtf/Platform.h>
-
-#include "APICast.h"
-#include <kjs/JSLock.h>
-#include <kjs/JSType.h>
-#include <kjs/internal.h>
-#include <kjs/operations.h>
-#include <kjs/ustring.h>
-#include <kjs/value.h>
+#include "InitializeThreading.h"
+#include "OpaqueJSString.h"
 #include <wtf/unicode/UTF8.h>
 
-using namespace KJS;
+using namespace JSC;
 using namespace WTF::Unicode;
 
 JSStringRef JSStringCreateWithCharacters(const JSChar* chars, size_t numChars)
 {
-    JSLock lock;
-    return toRef(UString(reinterpret_cast<const KJS::UChar*>(chars), static_cast<int>(numChars)).rep()->ref());
+    initializeThreading();
+    return &OpaqueJSString::create(chars, numChars).leakRef();
 }
 
 JSStringRef JSStringCreateWithUTF8CString(const char* string)
 {
-    JSLock lock;
-
-    size_t length = strlen(string);
-    Vector< ::UChar, 1024> buffer(length);
-    ::UChar* p = buffer.data();
-    if (conversionOK != convertUTF8ToUTF16(&string, string + length, &p, p + length))
-        return 0;
+    initializeThreading();
+    if (string) {
+        size_t length = strlen(string);
+        Vector<UChar, 1024> buffer(length);
+        UChar* p = buffer.data();
+        bool sourceIsAllASCII;
+        const LChar* stringStart = reinterpret_cast<const LChar*>(string);
+        if (conversionOK == convertUTF8ToUTF16(&string, string + length, &p, p + length, &sourceIsAllASCII)) {
+            if (sourceIsAllASCII)
+                return &OpaqueJSString::create(stringStart, length).leakRef();
+            return &OpaqueJSString::create(buffer.data(), p - buffer.data()).leakRef();
+        }
+    }
+
+    return &OpaqueJSString::create().leakRef();
+}
 
-    return toRef(UString(reinterpret_cast<KJS::UChar*>(buffer.data()), p - buffer.data()).rep()->ref());
+JSStringRef JSStringCreateWithCharactersNoCopy(const JSChar* chars, size_t numChars)
+{
+    initializeThreading();
+    return OpaqueJSString::create(StringImpl::createWithoutCopying(chars, numChars)).leakRef();
 }
 
 JSStringRef JSStringRetain(JSStringRef string)
 {
-    JSLock lock;
-    UString::Rep* rep = toJS(string);
-    return toRef(rep->ref());
+    string->ref();
+    return string;
 }
 
 void JSStringRelease(JSStringRef string)
 {
-    JSLock lock;
-    UString::Rep* rep = toJS(string);
-    rep->deref();
+    string->deref();
 }
 
 size_t JSStringGetLength(JSStringRef string)
 {
-    UString::Rep* rep = toJS(string);
-    return rep->size();
+    if (!string)
+        return 0;
+    return string->length();
 }
 
 const JSChar* JSStringGetCharactersPtr(JSStringRef string)
 {
-    UString::Rep* rep = toJS(string);
-    return reinterpret_cast<const JSChar*>(rep->data());
+    if (!string)
+        return nullptr;
+    return string->characters();
 }
 
 size_t JSStringGetMaximumUTF8CStringSize(JSStringRef string)
 {
-    UString::Rep* rep = toJS(string);
-    
     // Any UTF8 character > 3 bytes encodes as a UTF16 surrogate pair.
-    return rep->size() * 3 + 1; // + 1 for terminating '\0'
+    return string->length() * 3 + 1; // + 1 for terminating '\0'
 }
 
 size_t JSStringGetUTF8CString(JSStringRef string, char* buffer, size_t bufferSize)
 {
-    JSLock lock;
-    UString::Rep* rep = toJS(string);
-    CString cString = UString(rep).UTF8String();
+    if (!string || !buffer || !bufferSize)
+        return 0;
+
+    char* destination = buffer;
+    ConversionResult result;
+    if (string->is8Bit()) {
+        const LChar* source = string->characters8();
+        result = convertLatin1ToUTF8(&source, source + string->length(), &destination, destination + bufferSize - 1);
+    } else {
+        const UChar* source = string->characters16();
+        result = convertUTF16ToUTF8(&source, source + string->length(), &destination, destination + bufferSize - 1, true);
+    }
+
+    *destination++ = '\0';
+    if (result != conversionOK && result != targetExhausted)
+        return 0;
 
-    size_t length = std::min(bufferSize, cString.size() + 1); // + 1 for terminating '\0'
-    memcpy(buffer, cString.c_str(), length);
-    return length;
+    return destination - buffer;
 }
 
 bool JSStringIsEqual(JSStringRef a, JSStringRef b)
 {
-    JSLock lock;
-
-    UString::Rep* aRep = toJS(a);
-    UString::Rep* bRep = toJS(b);
-    
-    return UString(aRep) == UString(bRep);
+    return OpaqueJSString::equal(a, b);
 }
 
 bool JSStringIsEqualToUTF8CString(JSStringRef a, const char* b)