static MOZ_ALWAYS_INLINE bool AllocChars(ThreadSafeContext *maybecx, size_t length, CharT **chars, size_t *capacity) { /* * String length doesn't include the null char, so include it here before * doubling. Adding the null char after doubling would interact poorly with * round-up malloc schemes. */ size_t numChars = length + 1; /* * Grow by 12.5% if the buffer is very large. Otherwise, round up to the * next power of 2. This is similar to what we do with arrays; see * JSObject::ensureDenseArrayElements. */ static const size_t DOUBLING_MAX = 1024 * 1024; numChars = numChars > DOUBLING_MAX ? numChars + (numChars / 8) : RoundUpPow2(numChars); /* Like length, capacity does not include the null char, so take it out. */ *capacity = numChars - 1; JS_STATIC_ASSERT(JSString::MAX_LENGTH * sizeof(CharT) < UINT32_MAX); size_t bytes = numChars * sizeof(CharT); *chars = (CharT *)(maybecx ? maybecx->malloc_(bytes) : js_malloc(bytes)); return *chars != nullptr; }