]> git.saurik.com Git - apple/javascriptcore.git/blame - API/OpaqueJSString.cpp
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / API / OpaqueJSString.cpp
CommitLineData
b37bf2e1 1/*
9dae56ea 2 * Copyright (C) 2008 Apple Inc. All rights reserved.
b37bf2e1
A
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
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.
12 *
81345200 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
b37bf2e1
A
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
81345200 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
b37bf2e1
A
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.
24 */
25
9dae56ea
A
26#include "config.h"
27#include "OpaqueJSString.h"
b37bf2e1 28
81345200
A
29#include "CallFrame.h"
30#include "Identifier.h"
ed1e77d3 31#include "IdentifierInlines.h"
81345200
A
32#include "JSGlobalObject.h"
33#include <wtf/text/StringView.h>
b37bf2e1 34
9dae56ea 35using namespace JSC;
b37bf2e1 36
ed1e77d3 37RefPtr<OpaqueJSString> OpaqueJSString::create(const String& string)
9dae56ea 38{
81345200
A
39 if (string.isNull())
40 return nullptr;
41
42 return adoptRef(new OpaqueJSString(string));
43}
44
45OpaqueJSString::~OpaqueJSString()
46{
47 // m_characters is put in a local here to avoid an extra atomic load.
48 UChar* characters = m_characters;
49 if (!characters)
50 return;
51
52 if (!m_string.is8Bit() && m_string.characters16() == characters)
53 return;
54
55 fastFree(characters);
b37bf2e1
A
56}
57
93a37866 58String OpaqueJSString::string() const
b37bf2e1 59{
93a37866
A
60 // Return a copy of the wrapped string, because the caller may make it an Identifier.
61 return m_string.isolatedCopy();
9dae56ea 62}
b37bf2e1 63
93a37866 64Identifier OpaqueJSString::identifier(VM* vm) const
9dae56ea 65{
ed1e77d3 66 if (m_string.isNull())
93a37866
A
67 return Identifier();
68
69 if (m_string.isEmpty())
70 return Identifier(Identifier::EmptyIdentifier);
71
72 if (m_string.is8Bit())
ed1e77d3 73 return Identifier::fromString(vm, m_string.characters8(), m_string.length());
b37bf2e1 74
ed1e77d3 75 return Identifier::fromString(vm, m_string.characters16(), m_string.length());
9dae56ea 76}
81345200
A
77
78const UChar* OpaqueJSString::characters()
79{
81345200
A
80 // m_characters is put in a local here to avoid an extra atomic load.
81 UChar* characters = m_characters;
82 if (characters)
83 return characters;
84
85 if (m_string.isNull())
86 return nullptr;
87
88 unsigned length = m_string.length();
89 UChar* newCharacters = static_cast<UChar*>(fastMalloc(length * sizeof(UChar)));
90 StringView(m_string).getCharactersWithUpconvert(newCharacters);
91
92 if (!m_characters.compare_exchange_strong(characters, newCharacters)) {
93 fastFree(newCharacters);
94 return characters;
95 }
96
97 return newCharacters;
98}
99
100bool OpaqueJSString::equal(const OpaqueJSString* a, const OpaqueJSString* b)
101{
102 if (a == b)
103 return true;
104
105 if (!a || !b)
106 return false;
107
108 return a->m_string == b->m_string;
109}