]>
git.saurik.com Git - apple/javascriptcore.git/blob - API/OpaqueJSString.h
2 * Copyright (C) 2008 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef OpaqueJSString_h
27 #define OpaqueJSString_h
30 #include <wtf/ThreadSafeRefCounted.h>
31 #include <wtf/text/WTFString.h>
38 struct OpaqueJSString
: public ThreadSafeRefCounted
<OpaqueJSString
> {
39 static PassRefPtr
<OpaqueJSString
> create()
41 return adoptRef(new OpaqueJSString
);
44 static PassRefPtr
<OpaqueJSString
> create(const LChar
* characters
, unsigned length
)
46 return adoptRef(new OpaqueJSString(characters
, length
));
49 static PassRefPtr
<OpaqueJSString
> create(const UChar
* characters
, unsigned length
)
51 return adoptRef(new OpaqueJSString(characters
, length
));
54 JS_EXPORT_PRIVATE
static PassRefPtr
<OpaqueJSString
> create(const String
&);
56 JS_EXPORT_PRIVATE
~OpaqueJSString();
58 bool is8Bit() { return this ? m_string
.is8Bit() : false; }
59 const LChar
* characters8() { return this ? m_string
.characters8() : nullptr; }
60 const UChar
* characters16() { return this ? m_string
.characters16() : nullptr; }
61 unsigned length() { return this ? m_string
.length() : 0; }
63 const UChar
* characters();
65 JS_EXPORT_PRIVATE String
string() const;
66 JSC::Identifier
identifier(JSC::VM
*) const;
68 static bool equal(const OpaqueJSString
*, const OpaqueJSString
*);
71 friend class WTF::ThreadSafeRefCounted
<OpaqueJSString
>;
74 : m_characters(nullptr)
78 OpaqueJSString(const String
& string
)
79 : m_string(string
.isolatedCopy())
80 , m_characters(m_string
.impl() && m_string
.is8Bit() ? nullptr : const_cast<UChar
*>(m_string
.characters16()))
84 OpaqueJSString(const LChar
* characters
, unsigned length
)
85 : m_string(characters
, length
)
86 , m_characters(nullptr)
90 OpaqueJSString(const UChar
* characters
, unsigned length
)
91 : m_string(characters
, length
)
92 , m_characters(m_string
.impl() && m_string
.is8Bit() ? nullptr : const_cast<UChar
*>(m_string
.characters16()))
98 // This will be initialized on demand when characters() is called if the string needs up-conversion.
99 std::atomic
<UChar
*> m_characters
;