Changeset 80743 in webkit for trunk/Source/JavaScriptCore/tests


Ignore:
Timestamp:
Mar 10, 2011, 12:31:21 PM (14 years ago)
Author:
[email protected]
Message:

Bug 56077 - ES5 conformance issues with RegExp.prototype

Reviewed by Oliver Hunt.

There are three issues causing test failures in sputnik.

(1) lastIndex should be converted at the point it is used, not the point it is set (this is visible if valueOf is overridden).
(2) The 'length' property of the test/exec functions should be 1.
(3) If no input is specified, the input to test()/exec() is "undefined" (i.e. ToString(undefined)) - not RegExp.input.

Source/JavaScriptCore:

  • runtime/RegExpObject.cpp:

(JSC::RegExpObject::markChildren):

  • Added to mark lastIndex

(JSC::regExpObjectLastIndex):
(JSC::setRegExpObjectLastIndex):

  • lastIndex is now stored as a JSValue.

(JSC::RegExpObject::match):

  • Use accessor methods to get/set lastIndex, add fast case for isUInt32 (don't convert to double).
  • runtime/RegExpObject.h:

(JSC::RegExpObject::setLastIndex):
(JSC::RegExpObject::setLastIndex):

  • Set lastIndex, either from a size_t or a JSValue.

(JSC::RegExpObject::getLastIndex):

  • Get lastIndex.

(JSC::RegExpObject::RegExpObjectData::RegExpObjectData):

  • Initialize as a JSValue.
  • runtime/RegExpPrototype.cpp:

(JSC::RegExpPrototype::RegExpPrototype):

  • Add test/exec properties with length 1.
  • runtime/StringPrototype.cpp:

(JSC::stringProtoFuncMatch):
(JSC::stringProtoFuncSearch):

  • Do not read RegExp.input if none is provided.
  • tests/mozilla/js1_2/regexp/RegExp_input.js:
  • tests/mozilla/js1_2/regexp/RegExp_input_as_array.js:
    • Update these tests (they relied on non-ES5 behaviour).

LayoutTests:

  • fast/js/kde/function_length-expected.txt:
  • fast/js/kde/script-tests/function_length.js:
    • 'length' of RexExp.test/RexExp.exec is 1
  • fast/js/regexp-caching-expected.txt:
  • fast/js/regexp-test-null-string-expected.txt:
  • fast/js/regexp-test-null-string.html:
    • test() is equivalent to test("undefined")
  • sputnik/Conformance/15_Native_Objects/15.10_RegExp/15.10.6/15.10.6.2_RegExp.prototype.exec/S15.10.6.2_A11-expected.txt:
  • sputnik/Conformance/15_Native_Objects/15.10_RegExp/15.10.6/15.10.6.2_RegExp.prototype.exec/S15.10.6.2_A1_T16-expected.txt:
  • sputnik/Conformance/15_Native_Objects/15.10_RegExp/15.10.6/15.10.6.2_RegExp.prototype.exec/S15.10.6.2_A4_T11-expected.txt:
  • sputnik/Conformance/15_Native_Objects/15.10_RegExp/15.10.6/15.10.6.3_RegExp.prototype.test/S15.10.6.3_A11-expected.txt:
  • sputnik/Conformance/15_Native_Objects/15.10_RegExp/15.10.6/15.10.6.3_RegExp.prototype.test/S15.10.6.3_A1_T16-expected.txt:
    • These tests now pass!
Location:
trunk/Source/JavaScriptCore/tests/mozilla/js1_2/regexp
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/tests/mozilla/js1_2/regexp/RegExp_input.js

    r53061 r80743  
    5151                                            String(["2345"]), String(/\d+/.exec('2345')));
    5252
    53     // RegExp.input = "abcd12357efg"; /\d+/.exec()
     53    // RegExp.input = "abcd12357efg"; /\d+/.exec(RegExp.input)
    5454    RegExp.input = "abcd12357efg";
    55         testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; /\\d+/.exec()",
    56                                             String(["12357"]), String(/\d+/.exec()));
     55        testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; /\\d+/.exec(RegExp.input)",
     56                                            String(["12357"]), String(/\d+/.exec(RegExp.input)));
    5757
    58     // RegExp.input = "abcd12357efg"; /[h-z]+/.exec()
     58    // RegExp.input = "abcd12357efg"; /[h-z]+/.exec(RegExp.input)
    5959    RegExp.input = "abcd12357efg";
    60         testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; /[h-z]+/.exec()",
    61                                             null, /[h-z]+/.exec());
     60        testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; /[h-z]+/.exec(RegExp.input)",
     61                                            null, /[h-z]+/.exec(RegExp.input));
    6262
    6363    // RegExp.input = "abcd12357efg"; /\d+/.test('2345')
     
    6666                                            true, /\d+/.test('2345'));
    6767
    68     // RegExp.input = "abcd12357efg"; /\d+/.test()
     68    // RegExp.input = "abcd12357efg"; /\d+/.test(RegExp.input)
    6969    RegExp.input = "abcd12357efg";
    70         testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; /\\d+/.test()",
    71                                             true, /\d+/.test());
     70        testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; /\\d+/.test(RegExp.input)",
     71                                            true, /\d+/.test(RegExp.input));
    7272
    73     // RegExp.input = "abcd12357efg"; (new RegExp('d+')).test()
     73    // RegExp.input = "abcd12357efg"; (new RegExp('d+')).test(RegExp.input)
    7474    RegExp.input = "abcd12357efg";
    75         testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; (new RegExp('d+')).test()",
    76                                             true, (new RegExp('d+')).test());
     75        testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; (new RegExp('d+')).test(RegExp.input)",
     76                                            true, (new RegExp('d+')).test(RegExp.input));
    7777
    78     // RegExp.input = "abcd12357efg"; /[h-z]+/.test()
     78    // RegExp.input = "abcd12357efg"; /[h-z]+/.test(RegExp.input)
    7979    RegExp.input = "abcd12357efg";
    80         testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; /[h-z]+/.test()",
    81                                             false, /[h-z]+/.test());
     80        testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; /[h-z]+/.test(RegExp.input)",
     81                                            false, /[h-z]+/.test(RegExp.input));
    8282
    83     // RegExp.input = "abcd12357efg"; (new RegExp('[h-z]+')).test()
     83    // RegExp.input = "abcd12357efg"; (new RegExp('[h-z]+')).test(RegExp.input)
    8484    RegExp.input = "abcd12357efg";
    85         testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; (new RegExp('[h-z]+')).test()",
    86                                             false, (new RegExp('[h-z]+')).test());
     85        testcases[count++] = new TestCase ( SECTION, "RegExp.input = 'abcd12357efg'; (new RegExp('[h-z]+')).test(RegExp.input)",
     86                                            false, (new RegExp('[h-z]+')).test(RegExp.input));
    8787
    8888        function test()
  • trunk/Source/JavaScriptCore/tests/mozilla/js1_2/regexp/RegExp_input_as_array.js

    r53061 r80743  
    5151                                            String(["2345"]), String(/\d+/.exec('2345')));
    5252
    53     // RegExp['$_'] = "abcd12357efg"; /\d+/.exec()
     53    // RegExp['$_'] = "abcd12357efg"; /\d+/.exec(RegExp.input)
    5454    RegExp['$_'] = "abcd12357efg";
    55         testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; /\\d+/.exec()",
    56                                             String(["12357"]), String(/\d+/.exec()));
     55        testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; /\\d+/.exec(RegExp.input)",
     56                                            String(["12357"]), String(/\d+/.exec(RegExp.input)));
    5757
    58     // RegExp['$_'] = "abcd12357efg"; /[h-z]+/.exec()
     58    // RegExp['$_'] = "abcd12357efg"; /[h-z]+/.exec(RegExp.input)
    5959    RegExp['$_'] = "abcd12357efg";
    60         testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; /[h-z]+/.exec()",
    61                                             null, /[h-z]+/.exec());
     60        testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; /[h-z]+/.exec(RegExp.input)",
     61                                            null, /[h-z]+/.exec(RegExp.input));
    6262
    6363    // RegExp['$_'] = "abcd12357efg"; /\d+/.test('2345')
     
    6666                                            true, /\d+/.test('2345'));
    6767
    68     // RegExp['$_'] = "abcd12357efg"; /\d+/.test()
     68    // RegExp['$_'] = "abcd12357efg"; /\d+/.test(RegExp.input)
    6969    RegExp['$_'] = "abcd12357efg";
    70         testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; /\\d+/.test()",
    71                                             true, /\d+/.test());
     70        testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; /\\d+/.test(RegExp.input)",
     71                                            true, /\d+/.test(RegExp.input));
    7272
    73     // RegExp['$_'] = "abcd12357efg"; /[h-z]+/.test()
     73    // RegExp['$_'] = "abcd12357efg"; /[h-z]+/.test(RegExp.input)
    7474    RegExp['$_'] = "abcd12357efg";
    75         testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; /[h-z]+/.test()",
    76                                             false, /[h-z]+/.test());
     75        testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; /[h-z]+/.test(RegExp.input)",
     76                                            false, /[h-z]+/.test(RegExp.input));
    7777
    78     // RegExp['$_'] = "abcd12357efg"; (new RegExp('\d+')).test()
     78    // RegExp['$_'] = "abcd12357efg"; (new RegExp('\d+')).test(RegExp.input)
    7979    RegExp['$_'] = "abcd12357efg";
    80         testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; (new RegExp('\d+')).test()",
    81                                             true, (new RegExp('\d+')).test());
     80        testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; (new RegExp('\d+')).test(RegExp.input)",
     81                                            true, (new RegExp('\d+')).test(RegExp.input));
    8282
    83     // RegExp['$_'] = "abcd12357efg"; (new RegExp('[h-z]+')).test()
     83    // RegExp['$_'] = "abcd12357efg"; (new RegExp('[h-z]+')).test(RegExp.input)
    8484    RegExp['$_'] = "abcd12357efg";
    85         testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; (new RegExp('[h-z]+')).test()",
    86                                             false, (new RegExp('[h-z]+')).test());
     85        testcases[count++] = new TestCase ( SECTION, "RegExp['$_'] = 'abcd12357efg'; (new RegExp('[h-z]+')).test(RegExp.input)",
     86                                            false, (new RegExp('[h-z]+')).test(RegExp.input));
    8787
    8888        function test()
Note: See TracChangeset for help on using the changeset viewer.