]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - API/JSStringRef.cpp
JavaScriptCore-1097.13.tar.gz
[apple/javascriptcore.git] / API / JSStringRef.cpp
index 9a307d045b36665df9c0e0a0377fedc3f411da66..ea31da66bb940d7edf5639fb21c22ad4bd55c0bd 100644 (file)
@@ -1,4 +1,3 @@
-// -*- mode: c++; c-basic-offset: 4 -*-
 /*
  * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
  *
 #include "config.h"
 #include "JSStringRef.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;
-
-    return toRef(UString(reinterpret_cast<KJS::UChar*>(buffer.data()), p - buffer.data()).rep()->ref());
+    initializeThreading();
+    if (string) {
+        size_t length = strlen(string);
+        Vector<UChar, 1024> buffer(length);
+        UChar* p = buffer.data();
+        if (conversionOK == convertUTF8ToUTF16(&string, string + length, &p, p + length))
+            return OpaqueJSString::create(buffer.data(), p - buffer.data()).leakRef();
+    }
+
+    // Null string.
+    return OpaqueJSString::create().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();
+    return string->length();
 }
 
 const JSChar* JSStringGetCharactersPtr(JSStringRef string)
 {
-    UString::Rep* rep = toJS(string);
-    return reinterpret_cast<const JSChar*>(rep->data());
+    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 (!bufferSize)
+        return 0;
+
+    char* p = buffer;
+    const UChar* d = string->characters();
+    ConversionResult result = convertUTF16ToUTF8(&d, d + string->length(), &p, p + bufferSize - 1, true);
+    *p++ = '\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 p - buffer;
 }
 
 bool JSStringIsEqual(JSStringRef a, JSStringRef b)
 {
-    JSLock lock;
-
-    UString::Rep* aRep = toJS(a);
-    UString::Rep* bRep = toJS(b);
-    
-    return UString(aRep) == UString(bRep);
+    unsigned len = a->length();
+    return len == b->length() && 0 == memcmp(a->characters(), b->characters(), len * sizeof(UChar));
 }
 
 bool JSStringIsEqualToUTF8CString(JSStringRef a, const char* b)