]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - API/OpaqueJSString.h
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / API / OpaqueJSString.h
index 69c0962a66703b57b3384e5b1ead7bc467364caf..208131b3b4158e7c6fcfde91e46c3577897adc66 100644 (file)
  *    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
 #ifndef OpaqueJSString_h
 #define OpaqueJSString_h
 
-#include <runtime/UString.h>
+#include <atomic>
+#include <wtf/ThreadSafeRefCounted.h>
+#include <wtf/text/WTFString.h>
 
 namespace JSC {
     class Identifier;
-    class JSGlobalData;
+    class VM;
 }
 
 struct OpaqueJSString : public ThreadSafeRefCounted<OpaqueJSString> {
+    static Ref<OpaqueJSString> create()
+    {
+        return adoptRef(*new OpaqueJSString);
+    }
 
-    static PassRefPtr<OpaqueJSString> create() // null
+    static Ref<OpaqueJSString> create(const LChar* characters, unsigned length)
     {
-        return adoptRef(new OpaqueJSString);
+        return adoptRef(*new OpaqueJSString(characters, length));
     }
 
-    static PassRefPtr<OpaqueJSString> create(const UChar* characters, unsigned length)
+    static Ref<OpaqueJSString> create(const UChar* characters, unsigned length)
     {
-        return adoptRef(new OpaqueJSString(characters, length));
+        return adoptRef(*new OpaqueJSString(characters, length));
     }
 
-    static PassRefPtr<OpaqueJSString> create(const JSC::UString&);
+    JS_EXPORT_PRIVATE static RefPtr<OpaqueJSString> create(const String&);
+
+    JS_EXPORT_PRIVATE ~OpaqueJSString();
 
-    UChar* characters() { return this ? m_characters : 0; }
-    unsigned length() { return this ? m_length : 0; }
+    bool is8Bit() { return m_string.is8Bit(); }
+    const LChar* characters8() { return m_string.characters8(); }
+    const UChar* characters16() { return m_string.characters16(); }
+    unsigned length() { return m_string.length(); }
 
-    JSC::UString ustring() const;
-    JSC::Identifier identifier(JSC::JSGlobalData*) const;
+    const UChar* characters();
+
+    JS_EXPORT_PRIVATE String string() const;
+    JSC::Identifier identifier(JSC::VM*) const;
+
+    static bool equal(const OpaqueJSString*, const OpaqueJSString*);
 
 private:
     friend class WTF::ThreadSafeRefCounted<OpaqueJSString>;
 
     OpaqueJSString()
-        : m_characters(0)
-        , m_length(0)
+        : m_characters(nullptr)
     {
     }
 
-    OpaqueJSString(const UChar* characters, unsigned length)
-        : m_length(length)
+    OpaqueJSString(const String& string)
+        : m_string(string.isolatedCopy())
+        , m_characters(m_string.impl() && m_string.is8Bit() ? nullptr : const_cast<UChar*>(m_string.characters16()))
     {
-        m_characters = new UChar[length];
-        memcpy(m_characters, characters, length * sizeof(UChar));
     }
 
-    ~OpaqueJSString()
+    OpaqueJSString(const LChar* characters, unsigned length)
+        : m_string(characters, length)
+        , m_characters(nullptr)
     {
-        delete[] m_characters;
     }
 
-    UChar* m_characters;
-    unsigned m_length;
+    OpaqueJSString(const UChar* characters, unsigned length)
+        : m_string(characters, length)
+        , m_characters(m_string.impl() && m_string.is8Bit() ? nullptr : const_cast<UChar*>(m_string.characters16()))
+    {
+    }
+
+    String m_string;
+
+    // This will be initialized on demand when characters() is called if the string needs up-conversion.
+    std::atomic<UChar*> m_characters;
 };
 
 #endif