Changeset 252721 in webkit


Ignore:
Timestamp:
Nov 20, 2019 5:16:22 PM (4 years ago)
Author:
Ross Kirsling
Message:

Unreviewed, address Darin's feedback on r252683.

JSTests:

  • stress/string-replaceall.js:

Source/JavaScriptCore:

  • runtime/StringPrototype.cpp:

(JSC::replaceUsingStringSearch):
(JSC::replace):
(JSC::stringProtoFuncReplaceUsingStringSearch):
(JSC::stringProtoFuncReplaceAllUsingStringSearch):

Source/WTF:

  • wtf/text/StringCommon.h:

(WTF::findCommon):

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r252713 r252721  
     12019-11-20  Ross Kirsling  <ross.kirsling@sony.com>
     2
     3        Unreviewed, address Darin's feedback on r252683.
     4
     5        * stress/string-replaceall.js:
     6
    172019-11-20  Caio Lima  <ticaiolima@gmail.com>
    28
  • trunk/JSTests/stress/string-replaceall.js

    r252683 r252721  
    3535search[Symbol.replace] = RegExp.prototype[Symbol.replace].bind(search);
    3636shouldBe('abcdefabcdefabc'.replaceAll(search, 'xyz'), 'abcxyzabcxyzabc');
     37
     38shouldBe('abc'.replaceAll('', 'z'), 'zazbzcz');
     39shouldBe(''.replaceAll('', 'z'), 'z');
     40shouldBe('abc'.replaceAll('', ''), 'abc');
     41shouldBe(''.replaceAll('', ''), '');
  • trunk/Source/JavaScriptCore/ChangeLog

    r252713 r252721  
     12019-11-20  Ross Kirsling  <ross.kirsling@sony.com>
     2
     3        Unreviewed, address Darin's feedback on r252683.
     4
     5        * runtime/StringPrototype.cpp:
     6        (JSC::replaceUsingStringSearch):
     7        (JSC::replace):
     8        (JSC::stringProtoFuncReplaceUsingStringSearch):
     9        (JSC::stringProtoFuncReplaceAllUsingStringSearch):
     10
    1112019-11-20  Caio Lima  <ticaiolima@gmail.com>
    212
  • trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp

    r252683 r252721  
    777777}
    778778
    779 static ALWAYS_INLINE JSString* replaceUsingStringSearch(VM& vm, JSGlobalObject* globalObject, CallFrame* callFrame, JSString* jsString, JSValue searchValue, JSValue replaceValue, bool isGlobal)
     779enum class ReplaceMode : bool { Single, Global };
     780
     781static ALWAYS_INLINE JSString* replaceUsingStringSearch(VM& vm, JSGlobalObject* globalObject, CallFrame* callFrame, JSString* jsString, JSValue searchValue, JSValue replaceValue, ReplaceMode mode)
    780782{
    781783    auto scope = DECLARE_THROW_SCOPE(vm);
     
    814816            cachedCall->appendArgument(jsNumber(matchStart));
    815817            cachedCall->appendArgument(jsString);
    816             if (UNLIKELY(cachedCall->hasOverflowedArguments()))
    817                 OUT_OF_MEMORY(globalObject, scope);
     818            ASSERT(!cachedCall->hasOverflowedArguments());
    818819            JSValue replacement = cachedCall->call();
    819820            RETURN_IF_EXCEPTION(scope, nullptr);
     
    826827
    827828        size_t matchEnd = matchStart + searchStringLength;
    828         int ovector[2] = { static_cast<int>(matchStart),  static_cast<int>(matchEnd)};
    829         if (cachedCall) {
     829        if (cachedCall)
    830830            replacements.append(replaceString);
    831             RETURN_IF_EXCEPTION(scope, nullptr);
    832         } else {
     831        else {
    833832            StringBuilder replacement(StringBuilder::OverflowHandler::RecordOverflow);
     833            int ovector[2] = { static_cast<int>(matchStart),  static_cast<int>(matchEnd) };
    834834            substituteBackreferences(replacement, replaceString, string, ovector, nullptr);
    835835            if (UNLIKELY(replacement.hasOverflowed()))
     
    839839
    840840        endOfLastMatch = matchEnd;
    841         if (!isGlobal)
     841        if (mode == ReplaceMode::Single)
    842842            break;
    843         matchStart = string.find(searchString, UNLIKELY(!searchStringLength) ? endOfLastMatch + 1 : endOfLastMatch);
     843        matchStart = string.find(searchString, !searchStringLength ? endOfLastMatch + 1 : endOfLastMatch);
    844844    } while (matchStart != notFound);
    845845
     
    902902    if (searchValue.inherits<RegExpObject>(vm))
    903903        return replaceUsingRegExpSearch(vm, globalObject, callFrame, string, searchValue, replaceValue);
    904     constexpr bool isGlobal = false;
    905     return replaceUsingStringSearch(vm, globalObject, callFrame, string, searchValue, replaceValue, isGlobal);
     904    return replaceUsingStringSearch(vm, globalObject, callFrame, string, searchValue, replaceValue, ReplaceMode::Single);
    906905}
    907906
     
    943942    RETURN_IF_EXCEPTION(scope, encodedJSValue());
    944943
    945     constexpr bool isGlobal = false;
    946     RELEASE_AND_RETURN(scope, JSValue::encode(replaceUsingStringSearch(vm, globalObject, callFrame, string, callFrame->argument(0), callFrame->argument(1), isGlobal)));
     944    RELEASE_AND_RETURN(scope, JSValue::encode(replaceUsingStringSearch(vm, globalObject, callFrame, string, callFrame->argument(0), callFrame->argument(1), ReplaceMode::Single)));
    947945}
    948946
     
    955953    RETURN_IF_EXCEPTION(scope, encodedJSValue());
    956954
    957     constexpr bool isGlobal = true;
    958     RELEASE_AND_RETURN(scope, JSValue::encode(replaceUsingStringSearch(vm, globalObject, callFrame, string, callFrame->argument(0), callFrame->argument(1), isGlobal)));
     955    RELEASE_AND_RETURN(scope, JSValue::encode(replaceUsingStringSearch(vm, globalObject, callFrame, string, callFrame->argument(0), callFrame->argument(1), ReplaceMode::Global)));
    959956}
    960957
  • trunk/Source/WTF/ChangeLog

    r252717 r252721  
     12019-11-20  Ross Kirsling  <ross.kirsling@sony.com>
     2
     3        Unreviewed, address Darin's feedback on r252683.
     4
     5        * wtf/text/StringCommon.h:
     6        (WTF::findCommon):
     7
    182019-11-20  ChangSeok Oh  <changseok@webkit.org>
    29
  • trunk/Source/WTF/wtf/text/StringCommon.h

    r252683 r252721  
    575575
    576576    if (!needleLength)
    577         return std::min(start, haystack.length());
     577        return start;
    578578
    579579    unsigned searchLength = haystack.length() - start;
Note: See TracChangeset for help on using the changeset viewer.