@@ -282,15 +282,15 @@ void substituteBackreferences(StringBuilder& result, const String& replacement,
282282 substituteBackreferencesInline (result, replacement, source, ovector, reg);
283283}
284284
285- static ALWAYS_INLINE JSString* jsSpliceSubstrings (JSGlobalObject* globalObject, JSString* sourceVal, const String& source, const Range<int32_t >* substringRanges, int rangeCount )
285+ static ALWAYS_INLINE JSString* jsSpliceSubstrings (JSGlobalObject* globalObject, JSString* sourceVal, const String& source, std::span< const Range<int32_t >> substringRanges)
286286{
287287 VM & vm = globalObject->vm ();
288288 auto scope = DECLARE_THROW_SCOPE (vm);
289289
290- if (rangeCount == 1 ) {
290+ if (substringRanges. size () == 1 ) {
291291 int sourceSize = source.length ();
292- int position = substringRanges[ 0 ] .begin ();
293- int length = substringRanges[ 0 ] .distance ();
292+ int position = substringRanges. front () .begin ();
293+ int length = substringRanges. front () .distance ();
294294 if (position <= 0 && length >= sourceSize)
295295 return sourceVal;
296296 // We could call String::substringSharingImpl(), but this would result in redundant checks.
@@ -302,45 +302,45 @@ static ALWAYS_INLINE JSString* jsSpliceSubstrings(JSGlobalObject* globalObject,
302302 // in removeUsingRegExpSearch(). Hence, totalLength cannot exceed
303303 // String::MaxLength, and therefore, cannot overflow.
304304 Checked<int , AssertNoOverflow> totalLength = 0 ;
305- for (int i = 0 ; i < rangeCount; i++ )
306- totalLength += substringRanges[i] .distance ();
305+ for (auto & range : substringRanges )
306+ totalLength += range .distance ();
307307 ASSERT (totalLength <= static_cast <int >(String::MaxLength));
308308
309309 if (!totalLength)
310310 return jsEmptyString (vm);
311311
312312 if (source.is8Bit ()) {
313313 LChar* buffer;
314- const LChar* sourceData = source.characters8 ();
314+ auto sourceData = source.span8 ();
315315 auto impl = StringImpl::tryCreateUninitialized (totalLength, buffer);
316316 if (!impl) {
317317 throwOutOfMemoryError (globalObject, scope);
318318 return nullptr ;
319319 }
320320
321- Checked<int , AssertNoOverflow> bufferPos = 0 ;
322- for (int i = 0 ; i < rangeCount; i++ ) {
323- int srcLen = substringRanges[i] .distance ();
324- StringImpl::copyCharacters (buffer + bufferPos.value (), { sourceData + substringRanges[i]. begin (), static_cast < size_t >( srcLen) } );
321+ Checked<size_t , AssertNoOverflow> bufferPos = 0 ;
322+ for (auto range : substringRanges ) {
323+ size_t srcLen = range .distance ();
324+ StringImpl::copyCharacters (buffer + bufferPos.value (), sourceData. subspan (range. begin (), srcLen));
325325 bufferPos += srcLen;
326326 }
327327
328328 RELEASE_AND_RETURN (scope, jsString (vm, impl.releaseNonNull ()));
329329 }
330330
331331 UChar* buffer;
332- const UChar* sourceData = source.characters16 ();
332+ auto sourceData = source.span16 ();
333333
334334 auto impl = StringImpl::tryCreateUninitialized (totalLength, buffer);
335335 if (!impl) {
336336 throwOutOfMemoryError (globalObject, scope);
337337 return nullptr ;
338338 }
339339
340- Checked<int , AssertNoOverflow> bufferPos = 0 ;
341- for (int i = 0 ; i < rangeCount; i++ ) {
342- int srcLen = substringRanges[i] .distance ();
343- StringImpl::copyCharacters (buffer + bufferPos.value (), { sourceData + substringRanges[i]. begin (), static_cast < size_t >( srcLen) } );
340+ Checked<size_t , AssertNoOverflow> bufferPos = 0 ;
341+ for (auto & range : substringRanges ) {
342+ size_t srcLen = range .distance ();
343+ StringImpl::copyCharacters (buffer + bufferPos.value (), sourceData. subspan (range. begin (), srcLen));
344344 bufferPos += srcLen;
345345 }
346346
@@ -392,7 +392,7 @@ static ALWAYS_INLINE JSString* removeUsingRegExpSearch(VM& vm, JSGlobalObject* g
392392 if (UNLIKELY (!sourceRanges.tryConstructAndAppend (lastIndex, sourceLen)))
393393 OUT_OF_MEMORY (globalObject, scope);
394394 }
395- RELEASE_AND_RETURN (scope, jsSpliceSubstrings (globalObject, string, source, sourceRanges.data (), sourceRanges. size ()));
395+ RELEASE_AND_RETURN (scope, jsSpliceSubstrings (globalObject, string, source, sourceRanges.span ()));
396396}
397397
398398static ALWAYS_INLINE JSString* replaceUsingRegExpSearchWithCache (VM & vm, JSGlobalObject* globalObject, JSString* string, const String& source, RegExp* regExp, JSFunction* replaceFunction)
@@ -1028,9 +1028,10 @@ static inline char32_t codePointAt(const String& string, unsigned position, unsi
10281028{
10291029 RELEASE_ASSERT (position < length);
10301030 if (string.is8Bit ())
1031- return string.characters8 ()[position];
1031+ return string.span8 ()[position];
10321032 char32_t character;
1033- U16_NEXT (string.characters16 (), position, length, character);
1033+ auto characters = string.span16 ();
1034+ U16_NEXT (characters, position, length, character);
10341035 return character;
10351036}
10361037
0 commit comments