summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/JSStringJoiner.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
commit41386e9cb918eed93b3f13648cbef387e371e451 (patch)
treea97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/JavaScriptCore/runtime/JSStringJoiner.h
parente15dd966d523731101f70ccf768bba12435a0208 (diff)
downloadWebKitGtk-tarball-41386e9cb918eed93b3f13648cbef387e371e451.tar.gz
webkitgtk-2.4.9webkitgtk-2.4.9
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSStringJoiner.h')
-rw-r--r--Source/JavaScriptCore/runtime/JSStringJoiner.h110
1 files changed, 24 insertions, 86 deletions
diff --git a/Source/JavaScriptCore/runtime/JSStringJoiner.h b/Source/JavaScriptCore/runtime/JSStringJoiner.h
index 224784493..73950c6d7 100644
--- a/Source/JavaScriptCore/runtime/JSStringJoiner.h
+++ b/Source/JavaScriptCore/runtime/JSStringJoiner.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012-2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -26,112 +26,50 @@
#ifndef JSStringJoiner_h
#define JSStringJoiner_h
-#include "ExceptionHelpers.h"
#include "JSCJSValue.h"
+#include <wtf/Vector.h>
+#include <wtf/text/WTFString.h>
namespace JSC {
+class ExecState;
+
+
class JSStringJoiner {
public:
- JSStringJoiner(ExecState&, LChar separator, unsigned stringCount);
- JSStringJoiner(ExecState&, StringView separator, unsigned stringCount);
+ JSStringJoiner(const String& separator, size_t stringCount);
- void append(ExecState&, JSValue);
- void appendEmptyString();
-
- JSValue join(ExecState&);
+ void append(const String&);
+ JSValue join(ExecState*);
private:
- void append(StringViewWithUnderlyingString&&);
- void append8Bit(const String&);
- void appendLiteral(const Identifier&);
- unsigned joinedLength(ExecState&) const;
+ String m_separator;
+ Vector<String> m_strings;
- LChar m_singleCharacterSeparator;
- StringView m_separator;
- Vector<StringViewWithUnderlyingString> m_strings;
Checked<unsigned, RecordOverflow> m_accumulatedStringsLength;
- bool m_isAll8Bit { true };
+ bool m_isValid;
+ bool m_is8Bits;
};
-inline JSStringJoiner::JSStringJoiner(ExecState& state, StringView separator, unsigned stringCount)
+inline JSStringJoiner::JSStringJoiner(const String& separator, size_t stringCount)
: m_separator(separator)
- , m_isAll8Bit(m_separator.is8Bit())
-{
- if (!m_strings.tryReserveCapacity(stringCount))
- throwOutOfMemoryError(&state);
-}
-
-inline JSStringJoiner::JSStringJoiner(ExecState& state, LChar separator, unsigned stringCount)
- : m_singleCharacterSeparator(separator)
- , m_separator { &m_singleCharacterSeparator, 1 }
-{
- if (!m_strings.tryReserveCapacity(stringCount))
- throwOutOfMemoryError(&state);
-}
-
-ALWAYS_INLINE void JSStringJoiner::append(StringViewWithUnderlyingString&& string)
+ , m_isValid(true)
+ , m_is8Bits(m_separator.is8Bit())
{
- m_accumulatedStringsLength += string.view.length();
- m_isAll8Bit = m_isAll8Bit && string.view.is8Bit();
- m_strings.uncheckedAppend(WTF::move(string));
+ ASSERT(!m_separator.isNull());
+ m_isValid = m_strings.tryReserveCapacity(stringCount);
}
-ALWAYS_INLINE void JSStringJoiner::append8Bit(const String& string)
+inline void JSStringJoiner::append(const String& str)
{
- ASSERT(string.is8Bit());
- m_accumulatedStringsLength += string.length();
- m_strings.uncheckedAppend({ string, string });
-}
-
-ALWAYS_INLINE void JSStringJoiner::appendLiteral(const Identifier& literal)
-{
- m_accumulatedStringsLength += literal.length();
- ASSERT(literal.string().is8Bit());
- m_strings.uncheckedAppend({ literal.string(), { } });
-}
-
-ALWAYS_INLINE void JSStringJoiner::appendEmptyString()
-{
- m_strings.uncheckedAppend({ { }, { } });
-}
-
-ALWAYS_INLINE void JSStringJoiner::append(ExecState& state, JSValue value)
-{
- // The following code differs from using the result of JSValue::toString in the following ways:
- // 1) It's inlined more than JSValue::toString is.
- // 2) It includes conversion to WTF::String in a way that avoids allocating copies of substrings.
- // 3) It doesn't create a JSString for numbers, true, or false.
- // 4) It turns undefined and null into the empty string instead of "undefined" and "null".
- // 5) It uses optimized code paths for all the cases known to be 8-bit and for the empty string.
-
- if (value.isCell()) {
- if (value.asCell()->isString()) {
- append(asString(value)->viewWithUnderlyingString(state));
- return;
- }
- append(value.toString(&state)->viewWithUnderlyingString(state));
+ if (!m_isValid)
return;
- }
- if (value.isInt32()) {
- append8Bit(state.vm().numericStrings.add(value.asInt32()));
- return;
- }
- if (value.isDouble()) {
- append8Bit(state.vm().numericStrings.add(value.asDouble()));
- return;
- }
- if (value.isTrue()) {
- append8Bit(state.vm().propertyNames->trueKeyword.string());
- return;
- }
- if (value.isFalse()) {
- append8Bit(state.vm().propertyNames->falseKeyword.string());
- return;
+ m_strings.append(str);
+ if (!str.isNull()) {
+ m_accumulatedStringsLength += str.length();
+ m_is8Bits = m_is8Bits && str.is8Bit();
}
- ASSERT(value.isUndefinedOrNull());
- appendEmptyString();
}
}