Ignore:
Timestamp:
May 19, 2015, 12:51:46 PM (10 years ago)
Author:
Yusuke Suzuki
Message:

Array.prototype methods must use ToLength
https://bugs.webkit.org/show_bug.cgi?id=144128

Reviewed by Oliver Hunt.

Source/JavaScriptCore:

Per https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength

This patch introduces ToLength and ToInteger JS implementation to encourage the DFG/FTL's inlining.
These implementations are located in GlobalObject.js.
And set to the JSGlobalObject with the private symbols @ToLength and @ToInteger manually.

  • builtins/Array.prototype.js:

(every):
(forEach):
(filter):
(map):
(some):
(fill):
(find):
(findIndex):
(includes):

  • builtins/ArrayConstructor.js:

(from):

  • builtins/GlobalObject.js: Copied from Source/JavaScriptCore/builtins/StringConstructor.js.

(ToInteger):
(ToLength):

  • builtins/StringConstructor.js:

(raw):

  • runtime/JSGlobalObject.cpp:

(JSC::JSGlobalObject::init):

  • runtime/JSGlobalObjectFunctions.h:

LayoutTests:

  • fast/profiler/built-in-function-calls-anonymous-expected.txt:
  • fast/profiler/built-in-function-calls-user-defined-function-expected.txt:
  • js/array-every-expected.txt:
  • js/array-fill-expected.txt:
  • js/array-filter-expected.txt:
  • js/array-find-expected.txt:
  • js/array-findIndex-expected.txt:
  • js/array-functions-non-arrays-expected.txt:
  • js/array-includes-expected.txt:
  • js/script-tests/array-every.js:

(throwError):

  • js/script-tests/array-fill.js:

(throwError):

  • js/script-tests/array-filter.js:

(throwError):

  • js/script-tests/array-find.js:

(throwError):

  • js/script-tests/array-findIndex.js:

(toObject):
(throwError):

  • js/script-tests/array-functions-non-arrays.js:

(throwError):

  • js/script-tests/array-includes.js:
File:
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/builtins/GlobalObject.js

    r184581 r184582  
    2424 */
    2525
    26 function raw(template) {
     26function ToInteger(target) {
    2727    "use strict";
    2828
    29     if (template === null || template === undefined)
    30         throw new @TypeError("String.raw requires template not be null or undefined");
    31     var cookedSegments = @Object(template);
     29    var numberValue = @Number(target);
    3230
    33     var rawValue = cookedSegments.raw;
    34     if (rawValue === null || rawValue === undefined)
    35         throw new @TypeError("String.raw requires template.raw not be null or undefined");
    36     var rawSegments = @Object(rawValue);
     31    // isNaN(numberValue)
     32    if (numberValue !== numberValue)
     33        return 0;
    3734
    38     var numberOfSubstitutions = arguments.length - 1;
     35    if (numberValue === 0 || !@isFinite(numberValue))
     36        return numberValue;
     37
     38    return (numberValue > 0 ? 1 : -1) * @floor(@abs(numberValue));
     39}
     40
     41function ToLength(target) {
     42    "use strict";
    3943
    4044    var maxSafeInteger = 0x1FFFFFFFFFFFFF;
    41     var numberValue = @Number(rawSegments.length);
    42     var lengthValue;
    43     if (numberValue !== numberValue)  // isNaN(numberValue)
    44         lengthValue = 0;
    45     else if (numberValue === 0 || !@isFinite(numberValue))
    46         lengthValue = numberValue;
    47     else
    48         lengthValue = (numberValue > 0 ? 1 : -1) * @floor(@abs(numberValue));
     45    var length = @ToInteger(target);
    4946    // originally Math.min(Math.max(length, 0), maxSafeInteger));
    50     var segmentCount = lengthValue > 0 ? (lengthValue < maxSafeInteger ? lengthValue : maxSafeInteger) : 0;
    51 
    52     if (segmentCount <= 0)
    53         return '';
    54 
    55     var stringElements = '';
    56     for (var i = 0; ; ++i) {
    57         var segment = @toString(rawSegments[i]);
    58         stringElements += segment;
    59 
    60         if ((i + 1) === segmentCount)
    61             return stringElements;
    62 
    63         if (i < numberOfSubstitutions) {
    64             var substitutionIndexInArguments = i + 1;
    65             var next = @toString(arguments[substitutionIndexInArguments]);
    66             stringElements += next;
    67         }
    68     }
     47    return length > 0 ? (length < maxSafeInteger ? length : maxSafeInteger) : 0;
    6948}
Note: See TracChangeset for help on using the changeset viewer.