Changeset 196498 in webkit


Ignore:
Timestamp:
Feb 12, 2016 12:46:30 PM (8 years ago)
Author:
Yusuke Suzuki
Message:

[ES6] Implement @@search
https://bugs.webkit.org/show_bug.cgi?id=143889

Reviewed by Darin Adler.

Source/JavaScriptCore:

Implement RegExp.prototype[@@search].
In ES6, String.prototype.search delegates the actual matching to it
instead of executing RegExp matching inside String.prototype.search method itself.
By customizing @@search method, we can change the behavior of String.prototype.search for
derived / customized RegExp object.

  • CMakeLists.txt:
  • DerivedSources.make:
  • builtins/BuiltinNames.h:

(JSC::BuiltinNames::BuiltinNames): Deleted.

  • builtins/BuiltinUtils.h:
  • builtins/StringPrototype.js:

(search):

  • bytecode/BytecodeIntrinsicRegistry.cpp:

(JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):

  • bytecode/BytecodeIntrinsicRegistry.h:
  • runtime/CommonIdentifiers.h:
  • runtime/JSGlobalObject.cpp:

(JSC::JSGlobalObject::init):

  • runtime/RegExpPrototype.cpp:

(JSC::RegExpPrototype::finishCreation):
(JSC::regExpProtoFuncSearch):

  • runtime/RegExpPrototype.h:

(JSC::RegExpPrototype::create):

  • runtime/StringPrototype.cpp:

(JSC::StringPrototype::getOwnPropertySlot):
(JSC::StringPrototype::finishCreation): Deleted.
(JSC::stringProtoFuncSearch): Deleted.

  • runtime/StringPrototype.h:
  • tests/es6.yaml:
  • tests/stress/regexp-search.js: Added.

(shouldBe):
(shouldThrow):
(errorKey.toString):
(primitive.of.primitives.shouldThrow):
(testRegExpSearch):
(testSearch):
(testBoth):
(alwaysUnmatch):

LayoutTests:

  • js/Object-getOwnPropertyNames-expected.txt:
  • js/dom/string-prototype-properties-expected.txt:
  • js/regress/script-tests/v8-regexp-search.js: Added.

(runRegExpBenchmark.runBlock0):
(runRegExpBenchmark.runBlock1):
(runRegExpBenchmark):
(runRegExpBenchmark.runBlock3):
(runRegExpBenchmark.runBlock4):

  • js/regress/v8-regexp-search-expected.txt: Added.
  • js/regress/v8-regexp-search.html: Added.
  • js/script-tests/Object-getOwnPropertyNames.js:
  • sputnik/Conformance/15_Native_Objects/15.5_String/15.5.4/15.5.4.12_String.prototype.search/S15.5.4.12_A1_T3-expected.txt:
Location:
trunk
Files:
4 added
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r196479 r196498  
     12016-02-12  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        [ES6] Implement @@search
     4        https://bugs.webkit.org/show_bug.cgi?id=143889
     5
     6        Reviewed by Darin Adler.
     7
     8        * js/Object-getOwnPropertyNames-expected.txt:
     9        * js/dom/string-prototype-properties-expected.txt:
     10        * js/regress/script-tests/v8-regexp-search.js: Added.
     11        (runRegExpBenchmark.runBlock0):
     12        (runRegExpBenchmark.runBlock1):
     13        (runRegExpBenchmark):
     14        (runRegExpBenchmark.runBlock3):
     15        (runRegExpBenchmark.runBlock4):
     16        * js/regress/v8-regexp-search-expected.txt: Added.
     17        * js/regress/v8-regexp-search.html: Added.
     18        * js/script-tests/Object-getOwnPropertyNames.js:
     19        * sputnik/Conformance/15_Native_Objects/15.5_String/15.5.4/15.5.4.12_String.prototype.search/S15.5.4.12_A1_T3-expected.txt:
     20
    1212016-02-12  Ryan Haddad  <ryanhaddad@apple.com>
    222
  • trunk/LayoutTests/js/Object-getOwnPropertyNames-expected.txt

    r196274 r196498  
    6262PASS getSortedOwnPropertyNames(Math) is ['E','LN10','LN2','LOG10E','LOG2E','PI','SQRT1_2','SQRT2','abs','acos','acosh','asin','asinh','atan','atan2','atanh','cbrt','ceil','clz32','cos','cosh','exp','expm1','floor','fround','hypot','imul','log','log10','log1p','log2','max','min','pow','random','round','sign','sin','sinh','sqrt','tan','tanh','trunc']
    6363PASS getSortedOwnPropertyNames(JSON) is ['parse', 'stringify']
    64 PASS getSortedOwnPropertyNames(Symbol) is ['for', 'hasInstance', 'iterator', 'keyFor', 'length', 'name', 'prototype', 'species', 'toStringTag', 'unscopables']
     64PASS getSortedOwnPropertyNames(Symbol) is ['for', 'hasInstance', 'iterator', 'keyFor', 'length', 'name', 'prototype', 'search', 'species', 'toStringTag', 'unscopables']
    6565PASS getSortedOwnPropertyNames(Symbol.prototype) is ['constructor', 'toString', 'valueOf']
    6666PASS getSortedOwnPropertyNames(Map) is ['length', 'name', 'prototype']
  • trunk/LayoutTests/js/dom/string-prototype-properties-expected.txt

    r194394 r196498  
    1313PASS String.prototype.match.call(undefined, /2+/) threw exception TypeError: Type error.
    1414PASS String.prototype.replace.call(undefined, /2+/, '-') threw exception TypeError: Type error.
    15 PASS String.prototype.search.call(undefined, '4') threw exception TypeError: Type error.
     15PASS String.prototype.search.call(undefined, '4') threw exception TypeError: String.prototype.search requires that |this| not be undefined.
    1616PASS String.prototype.slice.call(undefined, 1, 3) threw exception TypeError: Type error.
    1717PASS String.prototype.split.call(undefined, '2') threw exception TypeError: Type error.
  • trunk/LayoutTests/js/script-tests/Object-getOwnPropertyNames.js

    r196274 r196498  
    7171    "Math": "['E','LN10','LN2','LOG10E','LOG2E','PI','SQRT1_2','SQRT2','abs','acos','acosh','asin','asinh','atan','atan2','atanh','cbrt','ceil','clz32','cos','cosh','exp','expm1','floor','fround','hypot','imul','log','log10','log1p','log2','max','min','pow','random','round','sign','sin','sinh','sqrt','tan','tanh','trunc']",
    7272    "JSON": "['parse', 'stringify']",
    73     "Symbol": "['for', 'hasInstance', 'iterator', 'keyFor', 'length', 'name', 'prototype', 'species', 'toStringTag', 'unscopables']",
     73    "Symbol": "['for', 'hasInstance', 'iterator', 'keyFor', 'length', 'name', 'prototype', 'search', 'species', 'toStringTag', 'unscopables']",
    7474    "Symbol.prototype": "['constructor', 'toString', 'valueOf']",
    7575    "Map": "['length', 'name', 'prototype']",
  • trunk/LayoutTests/sputnik/Conformance/15_Native_Objects/15.5_String/15.5.4/15.5.4.12_String.prototype.search/S15.5.4.12_A1_T3-expected.txt

    r153221 r196498  
    11S15.5.4.12_A1_T3
    22
    3 FAIL TypeError: Type error
     3FAIL TypeError: String.prototype.search requires that |this| not be undefined
    44
    55TEST COMPLETE
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r196077 r196498  
    828828    runtime/StringConstructor.cpp
    829829    runtime/StringIteratorPrototype.cpp
     830    runtime/StringPrototype.cpp
    830831    runtime/SymbolConstructor.cpp
    831832    runtime/SymbolPrototype.cpp
  • trunk/Source/JavaScriptCore/ChangeLog

    r196497 r196498  
     12016-02-12  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        [ES6] Implement @@search
     4        https://bugs.webkit.org/show_bug.cgi?id=143889
     5
     6        Reviewed by Darin Adler.
     7
     8        Implement RegExp.prototype[@@search].
     9        In ES6, String.prototype.search delegates the actual matching to it
     10        instead of executing RegExp matching inside String.prototype.search method itself.
     11        By customizing @@search method, we can change the behavior of String.prototype.search for
     12        derived / customized RegExp object.
     13
     14        * CMakeLists.txt:
     15        * DerivedSources.make:
     16        * builtins/BuiltinNames.h:
     17        (JSC::BuiltinNames::BuiltinNames): Deleted.
     18        * builtins/BuiltinUtils.h:
     19        * builtins/StringPrototype.js:
     20        (search):
     21        * bytecode/BytecodeIntrinsicRegistry.cpp:
     22        (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
     23        * bytecode/BytecodeIntrinsicRegistry.h:
     24        * runtime/CommonIdentifiers.h:
     25        * runtime/JSGlobalObject.cpp:
     26        (JSC::JSGlobalObject::init):
     27        * runtime/RegExpPrototype.cpp:
     28        (JSC::RegExpPrototype::finishCreation):
     29        (JSC::regExpProtoFuncSearch):
     30        * runtime/RegExpPrototype.h:
     31        (JSC::RegExpPrototype::create):
     32        * runtime/StringPrototype.cpp:
     33        (JSC::StringPrototype::getOwnPropertySlot):
     34        (JSC::StringPrototype::finishCreation): Deleted.
     35        (JSC::stringProtoFuncSearch): Deleted.
     36        * runtime/StringPrototype.h:
     37        * tests/es6.yaml:
     38        * tests/stress/regexp-search.js: Added.
     39        (shouldBe):
     40        (shouldThrow):
     41        (errorKey.toString):
     42        (primitive.of.primitives.shouldThrow):
     43        (testRegExpSearch):
     44        (testSearch):
     45        (testBoth):
     46        (alwaysUnmatch):
     47
    1482016-02-12  Keith Miller  <keith_miller@apple.com>
    249
  • trunk/Source/JavaScriptCore/DerivedSources.make

    r195999 r196498  
    151151    StringConstructor.lut.h \
    152152    StringIteratorPrototype.lut.h \
     153    StringPrototype.lut.h \
    153154    SymbolConstructor.lut.h \
    154155    SymbolPrototype.lut.h \
  • trunk/Source/JavaScriptCore/builtins/BuiltinNames.h

    r190401 r196498  
    4848        JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY)
    4949        JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY)
    50         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_PRIVATE_TO_PUBLIC_ENTRY)
    5150        JSC_FOREACH_BUILTIN_FUNCTION_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY)
    5251        JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY)
    53         JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_WELL_KNOWN_SYMBOL(INITIALIZE_PUBLIC_TO_PRIVATE_ENTRY)
    5452    }
    5553
  • trunk/Source/JavaScriptCore/builtins/BuiltinUtils.h

    r190155 r196498  
    3838    const JSC::Identifier& name##PrivateName() const { return m_##name##PrivateName; }
    3939
    40 #define INITIALIZE_BUILTIN_SYMBOLS(name) INITIALIZE_BUILTIN_NAMES(name), m_##name##Symbol(JSC::Identifier::fromUid(JSC::PrivateName(JSC::PrivateName::Description, ASCIILiteral("Symbol." #name))))
    41 #define DECLARE_BUILTIN_SYMBOLS(name) DECLARE_BUILTIN_NAMES(name) const JSC::Identifier m_##name##Symbol;
     40#define INITIALIZE_BUILTIN_SYMBOLS(name) , m_##name##Symbol(JSC::Identifier::fromUid(JSC::PrivateName(JSC::PrivateName::Description, ASCIILiteral("Symbol." #name))))
     41#define DECLARE_BUILTIN_SYMBOLS(name) const JSC::Identifier m_##name##Symbol;
    4242#define DECLARE_BUILTIN_SYMBOL_ACCESSOR(name) \
    43     DECLARE_BUILTIN_IDENTIFIER_ACCESSOR(name) \
    4443    const JSC::Identifier& name##Symbol() const { return m_##name##Symbol; }
    4544
  • trunk/Source/JavaScriptCore/builtins/StringPrototype.js

    r196022 r196498  
    11/*
    22 * Copyright (C) 2015 Andy VanWagoner <thetalecrafter@gmail.com>.
     3 * Copyright (C) 2016 Yusuke Suzuki <utatane.tea@gmail.com>
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    5960    return collator.compare(thisString, thatString);
    6061}
     62
     63function search(regexp)
     64{
     65    "use strict";
     66
     67    if (this == null) {
     68        if (this === null)
     69            throw new @TypeError("String.prototype.search requires that |this| not be null");
     70        throw new @TypeError("String.prototype.search requires that |this| not be undefined");
     71    }
     72
     73    if (regexp != null) {
     74         var searcher = regexp[@symbolSearch];
     75         if (searcher !== @undefined)
     76            return searcher.@call(regexp, this);
     77    }
     78
     79    var thisString = @toString(this);
     80    var createdRegExp = new @RegExp(regexp, @undefined);
     81    return createdRegExp[@symbolSearch](thisString);
     82}
  • trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp

    r196022 r196498  
    5252    m_promiseStateRejected.set(m_vm, jsNumber(static_cast<unsigned>(JSPromise::Status::Rejected)));
    5353    m_symbolIterator.set(m_vm, Symbol::create(m_vm, static_cast<SymbolImpl&>(*m_vm.propertyNames->iteratorSymbol.impl())));
     54    m_symbolSearch.set(m_vm, Symbol::create(m_vm, static_cast<SymbolImpl&>(*m_vm.propertyNames->searchSymbol.impl())));
    5455}
    5556
  • trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h

    r196276 r196498  
    5353    macro(promiseStateFulfilled) \
    5454    macro(promiseStateRejected) \
    55     macro(symbolIterator)
     55    macro(symbolIterator) \
     56    macro(symbolSearch)
    5657
    5758class BytecodeIntrinsicRegistry {
  • trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h

    r196494 r196498  
    274274    macro(match) \
    275275    macro(replace) \
    276     macro(search) \
    277276    macro(split) \
    278277    macro(toPrimitive)
     
    281280    macro(hasInstance) \
    282281    macro(iterator) \
     282    macro(search) \
    283283    macro(species) \
    284284    macro(toStringTag) \
     
    306306    macro(Array) \
    307307    macro(String) \
     308    macro(RegExp) \
    308309    macro(Map) \
    309310    macro(Promise) \
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp

    r196276 r196498  
    361361    RegExp* emptyRegex = RegExp::create(vm, "", NoFlags);
    362362   
    363     m_regExpPrototype.set(vm, this, RegExpPrototype::create(vm, RegExpPrototype::createStructure(vm, this, m_objectPrototype.get()), emptyRegex));
     363    m_regExpPrototype.set(vm, this, RegExpPrototype::create(vm, this, RegExpPrototype::createStructure(vm, this, m_objectPrototype.get()), emptyRegex));
    364364    m_regExpStructure.set(vm, this, RegExpObject::createStructure(vm, this, m_regExpPrototype.get()));
    365365    m_regExpMatchesArrayStructure.set(vm, this, createRegExpMatchesArrayStructure(vm, *this));
     
    545545        GlobalPropertyInfo(vm.propertyNames->ArrayPrivateName, arrayConstructor, DontEnum | DontDelete | ReadOnly),
    546546        GlobalPropertyInfo(vm.propertyNames->NumberPrivateName, numberConstructor, DontEnum | DontDelete | ReadOnly),
     547        GlobalPropertyInfo(vm.propertyNames->RegExpPrivateName, m_regExpConstructor.get(), DontEnum | DontDelete | ReadOnly),
    547548        GlobalPropertyInfo(vm.propertyNames->StringPrivateName, stringConstructor, DontEnum | DontDelete | ReadOnly),
    548549        GlobalPropertyInfo(vm.propertyNames->absPrivateName, privateFuncAbs, DontEnum | DontDelete | ReadOnly),
  • trunk/Source/JavaScriptCore/runtime/RegExpPrototype.cpp

    r185528 r196498  
    3636#include "RegExp.h"
    3737#include "RegExpCache.h"
     38#include "RegExpConstructor.h"
    3839#include "StringRecursionChecker.h"
    3940
     
    4445static EncodedJSValue JSC_HOST_CALL regExpProtoFuncCompile(ExecState*);
    4546static EncodedJSValue JSC_HOST_CALL regExpProtoFuncToString(ExecState*);
     47static EncodedJSValue JSC_HOST_CALL regExpProtoFuncSearch(ExecState*);
    4648static EncodedJSValue JSC_HOST_CALL regExpProtoGetterGlobal(ExecState*);
    4749static EncodedJSValue JSC_HOST_CALL regExpProtoGetterIgnoreCase(ExecState*);
     
    7577    : RegExpObject(vm, structure, regExp)
    7678{
     79}
     80
     81void RegExpPrototype::finishCreation(VM& vm, JSGlobalObject* globalObject)
     82{
     83    Base::finishCreation(vm);
     84    ASSERT(inherits(info()));
     85    JSC_NATIVE_FUNCTION(vm.propertyNames->searchSymbol, regExpProtoFuncSearch, DontEnum, 1);
    7786}
    7887
     
    348357}
    349358
     359EncodedJSValue JSC_HOST_CALL regExpProtoFuncSearch(ExecState* exec)
     360{
     361    JSValue thisValue = exec->thisValue();
     362    if (!thisValue.inherits(RegExpObject::info()))
     363        return throwVMTypeError(exec);
     364    RegExp* regExp = asRegExpObject(thisValue)->regExp();
     365
     366    JSString* string = exec->argument(0).toString(exec);
     367    String s = string->value(exec);
     368    if (exec->hadException())
     369        return JSValue::encode(jsUndefined());
     370
     371    RegExpConstructor* regExpConstructor = exec->lexicalGlobalObject()->regExpConstructor();
     372    MatchResult result = regExpConstructor->performMatch(exec->vm(), regExp, string, s, 0);
     373    return JSValue::encode(result ? jsNumber(result.start) : jsNumber(-1));
     374}
     375
    350376} // namespace JSC
  • trunk/Source/JavaScriptCore/runtime/RegExpPrototype.h

    r182747 r196498  
    3232    static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
    3333
    34     static RegExpPrototype* create(VM& vm, Structure* structure, RegExp* regExp)
     34    static RegExpPrototype* create(VM& vm, JSGlobalObject* globalObject, Structure* structure, RegExp* regExp)
    3535    {
    3636        RegExpPrototype* prototype = new (NotNull, allocateCell<RegExpPrototype>(vm.heap)) RegExpPrototype(vm, structure, regExp);
    37         prototype->finishCreation(vm);
     37        prototype->finishCreation(vm, globalObject);
    3838        return prototype;
    3939    }
     
    5050
    5151private:
     52    void finishCreation(VM&, JSGlobalObject*);
    5253    static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
    5354};
  • trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp

    r196240 r196498  
    101101EncodedJSValue JSC_HOST_CALL stringProtoFuncIterator(ExecState*);
    102102
    103 const ClassInfo StringPrototype::s_info = { "String", &StringObject::s_info, 0, CREATE_METHOD_TABLE(StringPrototype) };
     103}
     104
     105#include "StringPrototype.lut.h"
     106
     107namespace JSC {
     108
     109const ClassInfo StringPrototype::s_info = { "String", &StringObject::s_info, &stringPrototypeTable, CREATE_METHOD_TABLE(StringPrototype) };
     110
     111/* Source for StringConstructor.lut.h
     112@begin stringPrototypeTable
     113    search    JSBuiltin    DontEnum|Function 1
     114@end
     115*/
    104116
    105117// ECMA 15.5.4
     
    125137    JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION("repeat", stringProtoFuncRepeat, DontEnum, 1);
    126138    JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION("replace", stringProtoFuncReplace, DontEnum, 2);
    127     JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION("search", stringProtoFuncSearch, DontEnum, 1);
    128139    JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION("slice", stringProtoFuncSlice, DontEnum, 2);
    129140    JSC_NATIVE_FUNCTION_WITHOUT_TRANSITION("split", stringProtoFuncSplit, DontEnum, 2);
     
    177188}
    178189
     190bool StringPrototype::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot &slot)
     191{
     192    return getStaticFunctionSlot<Base>(exec, stringPrototypeTable, jsCast<StringPrototype*>(object), propertyName, slot);
     193}
     194
    179195// ------------------------------ Functions --------------------------
    180196
     
    10211037}
    10221038
    1023 EncodedJSValue JSC_HOST_CALL stringProtoFuncSearch(ExecState* exec)
    1024 {
    1025     JSValue thisValue = exec->thisValue();
    1026     if (!checkObjectCoercible(thisValue))
    1027         return throwVMTypeError(exec);
    1028     JSString* string = thisValue.toString(exec);
    1029     String s = string->value(exec);
    1030     VM* vm = &exec->vm();
    1031 
    1032     JSValue a0 = exec->argument(0);
    1033 
    1034     RegExp* reg;
    1035     if (a0.inherits(RegExpObject::info()))
    1036         reg = asRegExpObject(a0)->regExp();
    1037     else {
    1038         /*
    1039          *  ECMA 15.5.4.12 String.prototype.search (regexp)
    1040          *  If regexp is not an object whose [[Class]] property is "RegExp", it is
    1041          *  replaced with the result of the expression new RegExp(regexp).
    1042          *  Per ECMA 15.10.4.1, if a0 is undefined substitute the empty string.
    1043          */
    1044         reg = RegExp::create(exec->vm(), a0.isUndefined() ? emptyString() : a0.toString(exec)->value(exec), NoFlags);
    1045         if (!reg->isValid())
    1046             return throwVMError(exec, createSyntaxError(exec, reg->errorMessage()));
    1047     }
    1048     RegExpConstructor* regExpConstructor = exec->lexicalGlobalObject()->regExpConstructor();
    1049     MatchResult result = regExpConstructor->performMatch(*vm, reg, string, s, 0);
    1050     return JSValue::encode(result ? jsNumber(result.start) : jsNumber(-1));
    1051 }
    1052 
    10531039EncodedJSValue JSC_HOST_CALL stringProtoFuncSlice(ExecState* exec)
    10541040{
  • trunk/Source/JavaScriptCore/runtime/StringPrototype.h

    r182747 r196498  
    3434public:
    3535    typedef StringObject Base;
    36     static const unsigned StructureFlags = Base::StructureFlags;
     36    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | Base::StructureFlags;
    3737
    3838    static StringPrototype* create(VM&, JSGlobalObject*, Structure*);
     
    4747protected:
    4848    void finishCreation(VM&, JSGlobalObject*, JSString*);
     49
     50private:
     51    static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
    4952};
    5053
  • trunk/Source/JavaScriptCore/tests/es6.yaml

    r196040 r196498  
    10841084  cmd: runES6 :fail
    10851085- path: es6/RegExp.prototype_properties_RegExp.prototype[Symbol.search].js
    1086   cmd: runES6 :fail
     1086  cmd: runES6 :normal
    10871087- path: es6/RegExp.prototype_properties_RegExp.prototype[Symbol.split].js
    10881088  cmd: runES6 :fail
     
    11941194  cmd: runES6 :fail
    11951195- path: es6/well-known_symbols_Symbol.search.js
    1196   cmd: runES6 :fail
     1196  cmd: runES6 :normal
    11971197- path: es6/well-known_symbols_Symbol.species_Array.prototype.concat.js
    11981198  cmd: runES6 :normal
Note: See TracChangeset for help on using the changeset viewer.