/*
- * Copyright (C) 2012 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
#include "JSStringJoiner.h"
#include "ExceptionHelpers.h"
+#include "JSScope.h"
#include "JSString.h"
-#include "ScopeChain.h"
+#include "JSCInlines.h"
#include <wtf/text/StringImpl.h>
-
namespace JSC {
// The destination is 16bits, at least one string is 16 bits.
-static inline void appendStringToData(UChar*& data, const UString& string)
+static inline void appendStringToData(UChar*& data, const String& string)
{
if (string.isNull())
return;
}
// If the destination is 8bits, we know every string has to be 8bit.
-static inline void appendStringToData(LChar*& data, const UString& string)
+static inline void appendStringToData(LChar*& data, const String& string)
{
if (string.isNull())
return;
}
template<typename CharacterType>
-static inline PassRefPtr<StringImpl> joinStrings(const Vector<UString>& strings, const UString& separator, unsigned outputLength)
+static inline PassRefPtr<StringImpl> joinStrings(const Vector<String>& strings, const String& separator, unsigned outputLength)
{
ASSERT(outputLength);
CharacterType* data;
RefPtr<StringImpl> outputStringImpl = StringImpl::tryCreateUninitialized(outputLength, data);
if (!outputStringImpl)
- return PassRefPtr<StringImpl>();
+ return nullptr;
- const UString firstString = strings.first();
+ const String firstString = strings.first();
appendStringToData(data, firstString);
for (size_t i = 1; i < strings.size(); ++i) {
appendStringToData(data, strings[i]);
}
- ASSERT(data == (outputStringImpl->getCharacters<CharacterType>() + outputStringImpl->length()));
+ ASSERT(data == (outputStringImpl->characters<CharacterType>() + outputStringImpl->length()));
return outputStringImpl.release();
}
-JSValue JSStringJoiner::build(ExecState* exec)
+JSValue JSStringJoiner::join(ExecState* exec)
{
if (!m_isValid)
return throwOutOfMemoryError(exec);
if (!m_strings.size())
return jsEmptyString(exec);
- size_t separatorLength = m_separator.length();
+ Checked<unsigned, RecordOverflow> separatorLength = m_separator.length();
// FIXME: add special cases of joinStrings() for (separatorLength == 0) and (separatorLength == 1).
ASSERT(m_strings.size() > 0);
- size_t totalSeparactorsLength = separatorLength * (m_strings.size() - 1);
- size_t outputStringSize = totalSeparactorsLength + m_cumulatedStringsLength;
+ Checked<unsigned, RecordOverflow> totalSeparactorsLength = separatorLength * (m_strings.size() - 1);
+ Checked<unsigned, RecordOverflow> outputStringSize = totalSeparactorsLength + m_accumulatedStringsLength;
+ unsigned finalSize;
+ if (outputStringSize.safeGet(finalSize) == CheckedState::DidOverflow)
+ return throwOutOfMemoryError(exec);
+
if (!outputStringSize)
return jsEmptyString(exec);
RefPtr<StringImpl> outputStringImpl;
if (m_is8Bits)
- outputStringImpl = joinStrings<LChar>(m_strings, m_separator, outputStringSize);
+ outputStringImpl = joinStrings<LChar>(m_strings, m_separator, finalSize);
else
- outputStringImpl = joinStrings<UChar>(m_strings, m_separator, outputStringSize);
+ outputStringImpl = joinStrings<UChar>(m_strings, m_separator, finalSize);
if (!outputStringImpl)
return throwOutOfMemoryError(exec);
- return JSString::create(exec->globalData(), outputStringImpl.release());
+ return JSString::create(exec->vm(), outputStringImpl.release());
}
}