Changeset 181084 in webkit


Ignore:
Timestamp:
Mar 5, 2015 10:27:27 AM (9 years ago)
Author:
Yusuke Suzuki
Message:

Implement ES6 StringIterator
https://bugs.webkit.org/show_bug.cgi?id=142080

Reviewed by Filip Pizlo.

This patch introduces ES6 String Iterator.
It enumerates code points instead of elements in String.
So surrogate pairs should be handled correctly.

  • CMakeLists.txt:
  • DerivedSources.make:
  • JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
  • JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • builtins/StringIterator.prototype.js: Added.

(next):

  • runtime/CommonIdentifiers.h:
  • runtime/JSGlobalObject.cpp:
  • runtime/JSGlobalObject.h:
  • runtime/JSStringIterator.cpp: Added.

(JSC::JSStringIterator::finishCreation):

  • runtime/JSStringIterator.h: Added.

(JSC::JSStringIterator::createStructure):
(JSC::JSStringIterator::create):
(JSC::JSStringIterator::JSStringIterator):

  • runtime/StringIteratorConstructor.cpp: Added.

(JSC::StringIteratorConstructor::finishCreation):

  • runtime/StringIteratorConstructor.h: Added.

(JSC::StringIteratorConstructor::create):
(JSC::StringIteratorConstructor::createStructure):
(JSC::StringIteratorConstructor::StringIteratorConstructor):

  • runtime/StringIteratorPrototype.cpp: Added.

(JSC::StringIteratorPrototype::finishCreation):
(JSC::StringIteratorPrototype::getOwnPropertySlot):
(JSC::stringIteratorPrototypeIterator):

  • runtime/StringIteratorPrototype.h: Added.

(JSC::StringIteratorPrototype::create):
(JSC::StringIteratorPrototype::createStructure):
(JSC::StringIteratorPrototype::StringIteratorPrototype):

  • runtime/StringPrototype.cpp:

(JSC::StringPrototype::finishCreation):
(JSC::stringProtoFuncIterator):

  • tests/stress/string-iterators.js: Added.

(testSurrogatePair):
(increment):
(for):

Location:
trunk/Source/JavaScriptCore
Files:
8 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r181077 r181084  
    496496    runtime/JSSetIterator.cpp
    497497    runtime/JSString.cpp
     498    runtime/JSStringIterator.cpp
    498499    runtime/JSStringJoiner.cpp
    499500    runtime/JSSymbolTableObject.cpp
     
    547548    runtime/StrictEvalActivation.cpp
    548549    runtime/StringConstructor.cpp
     550    runtime/StringIteratorConstructor.cpp
     551    runtime/StringIteratorPrototype.cpp
    549552    runtime/StringObject.cpp
    550553    runtime/StringPrototype.cpp
     
    599602    runtime/RegExpPrototype.cpp
    600603    runtime/StringConstructor.cpp
     604    runtime/StringIteratorPrototype.cpp
    601605    runtime/SymbolPrototype.cpp
    602606)
  • trunk/Source/JavaScriptCore/ChangeLog

    r181083 r181084  
     12015-03-05  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        Implement ES6 StringIterator
     4        https://bugs.webkit.org/show_bug.cgi?id=142080
     5
     6        Reviewed by Filip Pizlo.
     7
     8        This patch introduces ES6 String Iterator.
     9        It enumerates code points instead of elements in String.
     10        So surrogate pairs should be handled correctly.
     11
     12        * CMakeLists.txt:
     13        * DerivedSources.make:
     14        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
     15        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
     16        * JavaScriptCore.xcodeproj/project.pbxproj:
     17        * builtins/StringIterator.prototype.js: Added.
     18        (next):
     19        * runtime/CommonIdentifiers.h:
     20        * runtime/JSGlobalObject.cpp:
     21        * runtime/JSGlobalObject.h:
     22        * runtime/JSStringIterator.cpp: Added.
     23        (JSC::JSStringIterator::finishCreation):
     24        * runtime/JSStringIterator.h: Added.
     25        (JSC::JSStringIterator::createStructure):
     26        (JSC::JSStringIterator::create):
     27        (JSC::JSStringIterator::JSStringIterator):
     28        * runtime/StringIteratorConstructor.cpp: Added.
     29        (JSC::StringIteratorConstructor::finishCreation):
     30        * runtime/StringIteratorConstructor.h: Added.
     31        (JSC::StringIteratorConstructor::create):
     32        (JSC::StringIteratorConstructor::createStructure):
     33        (JSC::StringIteratorConstructor::StringIteratorConstructor):
     34        * runtime/StringIteratorPrototype.cpp: Added.
     35        (JSC::StringIteratorPrototype::finishCreation):
     36        (JSC::StringIteratorPrototype::getOwnPropertySlot):
     37        (JSC::stringIteratorPrototypeIterator):
     38        * runtime/StringIteratorPrototype.h: Added.
     39        (JSC::StringIteratorPrototype::create):
     40        (JSC::StringIteratorPrototype::createStructure):
     41        (JSC::StringIteratorPrototype::StringIteratorPrototype):
     42        * runtime/StringPrototype.cpp:
     43        (JSC::StringPrototype::finishCreation):
     44        (JSC::stringProtoFuncIterator):
     45        * tests/stress/string-iterators.js: Added.
     46        (testSurrogatePair):
     47        (increment):
     48        (for):
     49
    1502015-03-05  Csaba Osztrogonác  <ossy@webkit.org>
    251
  • trunk/Source/JavaScriptCore/DerivedSources.make

    r181077 r181084  
    5858    RegExpObject.lut.h \
    5959    StringConstructor.lut.h \
     60    StringIteratorPrototype.lut.h \
    6061    SymbolPrototype.lut.h \
    6162    udis86_itab.h \
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj

    r181077 r181084  
    762762    <ClCompile Include="..\runtime\JSSetIterator.cpp" />
    763763    <ClCompile Include="..\runtime\JSString.cpp" />
     764    <ClCompile Include="..\runtime\JSStringIterator.cpp" />
    764765    <ClCompile Include="..\runtime\JSStringJoiner.cpp" />
    765766    <ClCompile Include="..\runtime\JSSymbolTableObject.cpp" />
     
    815816    <ClCompile Include="..\runtime\StringConstructor.cpp" />
    816817    <ClCompile Include="..\runtime\StringObject.cpp" />
     818    <ClCompile Include="..\runtime\StringIteratorConstructor.cpp" />
     819    <ClCompile Include="..\runtime\StringIteratorPrototype.cpp" />
    817820    <ClCompile Include="..\runtime\StringPrototype.cpp" />
    818821    <ClCompile Include="..\runtime\StringRecursionChecker.cpp" />
     
    15551558    <ClInclude Include="..\runtime\JSString.h" />
    15561559    <ClInclude Include="..\runtime\JSStringBuilder.h" />
     1560    <ClInclude Include="..\runtime\JSStringIterator.h" />
    15571561    <ClInclude Include="..\runtime\JSStringJoiner.h" />
    15581562    <ClInclude Include="..\runtime\JSSymbolTableObject.h" />
     
    16271631    <ClInclude Include="..\runtime\StrictEvalActivation.h" />
    16281632    <ClInclude Include="..\runtime\StringConstructor.h" />
     1633    <ClInclude Include="..\runtime\StringIteratorConstructor.h" />
     1634    <ClInclude Include="..\runtime\StringIteratorPrototype.h" />
    16291635    <ClInclude Include="..\runtime\StringObject.h" />
    16301636    <ClInclude Include="..\runtime\StringPrototype.h" />
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters

    r181077 r181084  
    706706      <Filter>runtime</Filter>
    707707    </ClCompile>
     708    <ClCompile Include="..\runtime\JSStringIterator.cpp">
     709      <Filter>runtime</Filter>
     710    </ClCompile>
    708711    <ClCompile Include="..\runtime\JSStringJoiner.cpp">
    709712      <Filter>runtime</Filter>
     
    836839    </ClCompile>
    837840    <ClCompile Include="..\runtime\StringConstructor.cpp">
     841      <Filter>runtime</Filter>
     842    </ClCompile>
     843    <ClCompile Include="..\runtime\StringIteratorConstructor.cpp">
     844      <Filter>runtime</Filter>
     845    </ClCompile>
     846    <ClCompile Include="..\runtime\StringIteratorPrototype.cpp">
    838847      <Filter>runtime</Filter>
    839848    </ClCompile>
     
    27402749      <Filter>runtime</Filter>
    27412750    </ClInclude>
     2751    <ClInclude Include="..\runtime\JSStringIterator.h">
     2752      <Filter>runtime</Filter>
     2753    </ClInclude>
    27422754    <ClInclude Include="..\runtime\JSStringJoiner.h">
    27432755      <Filter>runtime</Filter>
     
    28852897    </ClInclude>
    28862898    <ClInclude Include="..\runtime\StringConstructor.h">
     2899      <Filter>runtime</Filter>
     2900    </ClInclude>
     2901    <ClInclude Include="..\runtime\StringIteratorConstructor.h">
     2902      <Filter>runtime</Filter>
     2903    </ClInclude>
     2904    <ClInclude Include="..\runtime\StringIteratorPrototype.h">
    28872905      <Filter>runtime</Filter>
    28882906    </ClInclude>
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r181077 r181084  
    956956                705B41B21A6E501E00716757 /* SymbolPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = 705B41AA1A6E501E00716757 /* SymbolPrototype.h */; settings = {ATTRIBUTES = (Private, ); }; };
    957957                70B0A9D11A9B66460001306A /* RuntimeFlags.h in Headers */ = {isa = PBXBuildFile; fileRef = 70B0A9D01A9B66200001306A /* RuntimeFlags.h */; settings = {ATTRIBUTES = (Private, ); }; };
     958                70EC0EC21AA0D7DA00B6AAFA /* JSStringIterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 70EC0EBC1AA0D7DA00B6AAFA /* JSStringIterator.cpp */; };
     959                70EC0EC31AA0D7DA00B6AAFA /* JSStringIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = 70EC0EBD1AA0D7DA00B6AAFA /* JSStringIterator.h */; settings = {ATTRIBUTES = (Private, ); }; };
     960                70EC0EC41AA0D7DA00B6AAFA /* StringIteratorConstructor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 70EC0EBE1AA0D7DA00B6AAFA /* StringIteratorConstructor.cpp */; };
     961                70EC0EC51AA0D7DA00B6AAFA /* StringIteratorConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = 70EC0EBF1AA0D7DA00B6AAFA /* StringIteratorConstructor.h */; settings = {ATTRIBUTES = (Private, ); }; };
     962                70EC0EC61AA0D7DA00B6AAFA /* StringIteratorPrototype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 70EC0EC01AA0D7DA00B6AAFA /* StringIteratorPrototype.cpp */; };
     963                70EC0EC71AA0D7DA00B6AAFA /* StringIteratorPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = 70EC0EC11AA0D7DA00B6AAFA /* StringIteratorPrototype.h */; settings = {ATTRIBUTES = (Private, ); }; };
    958964                7C008CD2186F8A9300955C24 /* JSPromiseFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C008CD0186F8A9300955C24 /* JSPromiseFunctions.cpp */; };
    959965                7C008CD3186F8A9300955C24 /* JSPromiseFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C008CD1186F8A9300955C24 /* JSPromiseFunctions.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    26412647                705B41AA1A6E501E00716757 /* SymbolPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SymbolPrototype.h; sourceTree = "<group>"; };
    26422648                70B0A9D01A9B66200001306A /* RuntimeFlags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuntimeFlags.h; sourceTree = "<group>"; };
     2649                70EC0EBC1AA0D7DA00B6AAFA /* JSStringIterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSStringIterator.cpp; sourceTree = "<group>"; };
     2650                70EC0EBD1AA0D7DA00B6AAFA /* JSStringIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSStringIterator.h; sourceTree = "<group>"; };
     2651                70EC0EBE1AA0D7DA00B6AAFA /* StringIteratorConstructor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringIteratorConstructor.cpp; sourceTree = "<group>"; };
     2652                70EC0EBF1AA0D7DA00B6AAFA /* StringIteratorConstructor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringIteratorConstructor.h; sourceTree = "<group>"; };
     2653                70EC0EC01AA0D7DA00B6AAFA /* StringIteratorPrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringIteratorPrototype.cpp; sourceTree = "<group>"; };
     2654                70EC0EC11AA0D7DA00B6AAFA /* StringIteratorPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringIteratorPrototype.h; sourceTree = "<group>"; };
    26432655                7C008CD0186F8A9300955C24 /* JSPromiseFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = JSPromiseFunctions.cpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
    26442656                7C008CD1186F8A9300955C24 /* JSPromiseFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseFunctions.h; sourceTree = "<group>"; };
     
    44504462                                F692A8620255597D01FF60F7 /* JSString.h */,
    44514463                                86E85538111B9968001AF51E /* JSStringBuilder.h */,
     4464                                70EC0EBC1AA0D7DA00B6AAFA /* JSStringIterator.cpp */,
     4465                                70EC0EBD1AA0D7DA00B6AAFA /* JSStringIterator.h */,
    44524466                                2600B5A4152BAAA70091EE5F /* JSStringJoiner.cpp */,
    44534467                                2600B5A5152BAAA70091EE5F /* JSStringJoiner.h */,
     
    45744588                                BC18C3C00E16EE3300B34460 /* StringConstructor.cpp */,
    45754589                                BC18C3C10E16EE3300B34460 /* StringConstructor.h */,
     4590                                70EC0EBE1AA0D7DA00B6AAFA /* StringIteratorConstructor.cpp */,
     4591                                70EC0EBF1AA0D7DA00B6AAFA /* StringIteratorConstructor.h */,
     4592                                70EC0EC01AA0D7DA00B6AAFA /* StringIteratorPrototype.cpp */,
     4593                                70EC0EC11AA0D7DA00B6AAFA /* StringIteratorPrototype.h */,
    45764594                                BC18C3C20E16EE3300B34460 /* StringObject.cpp */,
    45774595                                BC18C3C30E16EE3300B34460 /* StringObject.h */,
     
    58225840                                BCBE2CAE14E985AA000593AD /* GCAssertions.h in Headers */,
    58235841                                0F766D3015A8DCE2008F363E /* GCAwareJITStubRoutine.h in Headers */,
     5842                                70EC0EC71AA0D7DA00B6AAFA /* StringIteratorPrototype.h in Headers */,
    58245843                                0F2B66AC17B6B53F00A7AE3F /* GCIncomingRefCounted.h in Headers */,
    58255844                                0F2B66AD17B6B54500A7AE3F /* GCIncomingRefCountedInlines.h in Headers */,
     
    62436262                                BC18C4640E16F5CD00B34460 /* SourceCode.h in Headers */,
    62446263                                BC18C4630E16F5CD00B34460 /* SourceProvider.h in Headers */,
     6264                                70EC0EC31AA0D7DA00B6AAFA /* JSStringIterator.h in Headers */,
    62456265                                E49DC16C12EF294E00184A1F /* SourceProviderCache.h in Headers */,
    62466266                                E49DC16D12EF295300184A1F /* SourceProviderCacheItem.h in Headers */,
     
    62646284                                C2FE18A416BAEC4000AF3061 /* StructureRareData.h in Headers */,
    62656285                                C20BA92D16BB1C1500B3AEA2 /* StructureRareDataInlines.h in Headers */,
     6286                                70EC0EC51AA0D7DA00B6AAFA /* StringIteratorConstructor.h in Headers */,
    62666287                                0F2B9CEB19D0BA7D00B1D1B5 /* DFGPhiChildren.h in Headers */,
    62676288                                0F9332A514CA7DDD0085F3C6 /* StructureSet.h in Headers */,
     
    69526973                                0FC09776146943B000CF2442 /* DFGOSRExitCompiler32_64.cpp in Sources */,
    69536974                                0FC0977214693AF900CF2442 /* DFGOSRExitCompiler64.cpp in Sources */,
     6975                                70EC0EC41AA0D7DA00B6AAFA /* StringIteratorConstructor.cpp in Sources */,
     6976                                70EC0EC21AA0D7DA00B6AAFA /* JSStringIterator.cpp in Sources */,
    69546977                                0F7025A91714B0FA00382C0E /* DFGOSRExitCompilerCommon.cpp in Sources */,
    69556978                                0FEFC9AA1681A3B300567F53 /* DFGOSRExitJumpPlaceholder.cpp in Sources */,
     
    73157338                                0F7700921402FF3C0078EB39 /* SamplingCounter.cpp in Sources */,
    73167339                                1429D8850ED21C3D00B89619 /* SamplingTool.cpp in Sources */,
     7340                                70EC0EC61AA0D7DA00B6AAFA /* StringIteratorPrototype.cpp in Sources */,
    73177341                                A5FD0067189AFE9C00633231 /* ScriptArguments.cpp in Sources */,
    73187342                                A5FD006D189B00AA00633231 /* ScriptCallFrame.cpp in Sources */,
  • trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h

    r181077 r181084  
    242242    macro(arrayIterationKindValue) \
    243243    macro(arrayIterationKindKeyValue) \
     244    macro(charCodeAt) \
     245    macro(iteratedString) \
     246    macro(stringIteratorNextIndex) \
    244247    macro(resolve) \
    245248    macro(reject) \
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp

    r181077 r181084  
    8383#include "JSSet.h"
    8484#include "JSSetIterator.h"
     85#include "JSStringIterator.h"
    8586#include "JSTypedArrayConstructors.h"
    8687#include "JSTypedArrayPrototypes.h"
     
    116117#include "StrictEvalActivation.h"
    117118#include "StringConstructor.h"
     119#include "StringIteratorConstructor.h"
     120#include "StringIteratorPrototype.h"
    118121#include "StringPrototype.h"
    119122#include "Symbol.h"
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h

    r181064 r181084  
    110110    DEFINE_STANDARD_BUILTIN(macro, MapIterator, mapIterator) \
    111111    DEFINE_STANDARD_BUILTIN(macro, SetIterator, setIterator) \
     112    DEFINE_STANDARD_BUILTIN(macro, StringIterator, stringIterator) \
    112113
    113114
  • trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp

    r178860 r181084  
    3535#include "ObjectPrototype.h"
    3636#include "JSCInlines.h"
     37#include "JSStringIterator.h"
    3738#include "PropertyNameArray.h"
    3839#include "RegExpCache.h"
     
    8889EncodedJSValue JSC_HOST_CALL stringProtoFuncEndsWith(ExecState*);
    8990EncodedJSValue JSC_HOST_CALL stringProtoFuncIncludes(ExecState*);
     91EncodedJSValue JSC_HOST_CALL stringProtoFuncIterator(ExecState*);
    9092
    9193const ClassInfo StringPrototype::s_info = { "String", &StringObject::s_info, 0, CREATE_METHOD_TABLE(StringPrototype) };
     
    141143    JSC_NATIVE_FUNCTION("endsWith", stringProtoFuncEndsWith, DontEnum, 0);
    142144    JSC_NATIVE_FUNCTION("includes", stringProtoFuncIncludes, DontEnum, 0);
     145    JSC_NATIVE_FUNCTION(vm.propertyNames->iteratorPrivateName, stringProtoFuncIterator, DontEnum, 0);
     146
     147    JSC_NATIVE_INTRINSIC_FUNCTION(vm.propertyNames->charCodeAtPrivateName, stringProtoFuncCharCodeAt, DontEnum, 1, CharCodeAtIntrinsic);
    143148
    144149    // The constructor will be added later, after StringConstructor has been built
     
    17031708    return JSValue::encode(jsBoolean(stringToSearchIn.contains(searchString, true, start)));
    17041709}
    1705    
     1710
     1711EncodedJSValue JSC_HOST_CALL stringProtoFuncIterator(ExecState* exec)
     1712{
     1713    JSValue thisValue = exec->thisValue();
     1714    if (!checkObjectCoercible(thisValue))
     1715        return throwVMTypeError(exec);
     1716    JSString* string = thisValue.toString(exec);
     1717    return JSValue::encode(JSStringIterator::create(exec, exec->callee()->globalObject()->stringIteratorStructure(), string));
     1718}
     1719
    17061720} // namespace JSC
Note: See TracChangeset for help on using the changeset viewer.