JSValue JSStringJoiner::join(ExecState* exec) { if (!m_isValid) return throwOutOfMemoryError(exec); if (!m_strings.size()) return jsEmptyString(exec); Checked<size_t, RecordOverflow> separatorLength = m_separator.length(); // FIXME: add special cases of joinStrings() for (separatorLength == 0) and (separatorLength == 1). ASSERT(m_strings.size() > 0); Checked<size_t, RecordOverflow> totalSeparactorsLength = separatorLength * (m_strings.size() - 1); Checked<size_t, RecordOverflow> outputStringSize = totalSeparactorsLength + m_accumulatedStringsLength; size_t 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, finalSize); else outputStringImpl = joinStrings<UChar>(m_strings, m_separator, finalSize); if (!outputStringImpl) return throwOutOfMemoryError(exec); return JSString::create(exec->vm(), outputStringImpl.release()); }
void HTMLCanvasElement::updateExternallyAllocatedMemory() const { int bufferCount = 0; if (m_imageBuffer) bufferCount++; if (is3D()) bufferCount += 2; if (m_copiedImage) bufferCount++; if (m_presentedImage) bufferCount++; Checked<intptr_t, RecordOverflow> checkedExternallyAllocatedMemory = 4 * bufferCount; checkedExternallyAllocatedMemory *= width(); checkedExternallyAllocatedMemory *= height(); intptr_t externallyAllocatedMemory; if (checkedExternallyAllocatedMemory.safeGet(externallyAllocatedMemory) == CheckedState::DidOverflow) externallyAllocatedMemory = std::numeric_limits<intptr_t>::max(); // Subtracting two intptr_t that are known to be positive will never underflow. v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(externallyAllocatedMemory - m_externallyAllocatedMemory); m_externallyAllocatedMemory = externallyAllocatedMemory; }