| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 (function(global, utils) { | 5 (function(global, utils) { |
| 6 | 6 |
| 7 %CheckIsBootstrapping(); | 7 %CheckIsBootstrapping(); |
| 8 | 8 |
| 9 // ------------------------------------------------------------------- | 9 // ------------------------------------------------------------------- |
| 10 // Imports | 10 // Imports |
| 11 | 11 |
| 12 var ArrayIndexOf; | 12 var ArrayIndexOf; |
| 13 var ArrayJoin; | 13 var ArrayJoin; |
| 14 var GlobalRegExp = global.RegExp; | 14 var GlobalRegExp = global.RegExp; |
| 15 var GlobalString = global.String; | 15 var GlobalString = global.String; |
| 16 var IsRegExp; | 16 var IsRegExp; |
| 17 var MakeRangeError; | |
| 18 var MakeTypeError; | |
| 19 var MaxSimple; | 17 var MaxSimple; |
| 20 var MinSimple; | 18 var MinSimple; |
| 21 var RegExpInitialize; | 19 var RegExpInitialize; |
| 22 var matchSymbol = utils.ImportNow("match_symbol"); | 20 var matchSymbol = utils.ImportNow("match_symbol"); |
| 23 var replaceSymbol = utils.ImportNow("replace_symbol"); | 21 var replaceSymbol = utils.ImportNow("replace_symbol"); |
| 24 var searchSymbol = utils.ImportNow("search_symbol"); | 22 var searchSymbol = utils.ImportNow("search_symbol"); |
| 25 var splitSymbol = utils.ImportNow("split_symbol"); | 23 var splitSymbol = utils.ImportNow("split_symbol"); |
| 26 | 24 |
| 27 utils.Import(function(from) { | 25 utils.Import(function(from) { |
| 28 ArrayIndexOf = from.ArrayIndexOf; | 26 ArrayIndexOf = from.ArrayIndexOf; |
| 29 ArrayJoin = from.ArrayJoin; | 27 ArrayJoin = from.ArrayJoin; |
| 30 IsRegExp = from.IsRegExp; | 28 IsRegExp = from.IsRegExp; |
| 31 MakeRangeError = from.MakeRangeError; | |
| 32 MakeTypeError = from.MakeTypeError; | |
| 33 MaxSimple = from.MaxSimple; | 29 MaxSimple = from.MaxSimple; |
| 34 MinSimple = from.MinSimple; | 30 MinSimple = from.MinSimple; |
| 35 RegExpInitialize = from.RegExpInitialize; | 31 RegExpInitialize = from.RegExpInitialize; |
| 36 }); | 32 }); |
| 37 | 33 |
| 38 //------------------------------------------------------------------- | 34 //------------------------------------------------------------------- |
| 39 | 35 |
| 40 // ECMA-262, section 15.5.4.6 | 36 // ECMA-262, section 15.5.4.6 |
| 41 function StringConcat(other /* and more */) { // length == 1 | 37 function StringConcat(other /* and more */) { // length == 1 |
| 42 "use strict"; | 38 "use strict"; |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 // proper functionality. | 127 // proper functionality. |
| 132 function StringNormalize(formArg) { // length == 0 | 128 function StringNormalize(formArg) { // length == 0 |
| 133 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); | 129 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); |
| 134 var s = TO_STRING(this); | 130 var s = TO_STRING(this); |
| 135 | 131 |
| 136 var form = IS_UNDEFINED(formArg) ? 'NFC' : TO_STRING(formArg); | 132 var form = IS_UNDEFINED(formArg) ? 'NFC' : TO_STRING(formArg); |
| 137 | 133 |
| 138 var NORMALIZATION_FORMS = ['NFC', 'NFD', 'NFKC', 'NFKD']; | 134 var NORMALIZATION_FORMS = ['NFC', 'NFD', 'NFKC', 'NFKD']; |
| 139 var normalizationForm = %_Call(ArrayIndexOf, NORMALIZATION_FORMS, form); | 135 var normalizationForm = %_Call(ArrayIndexOf, NORMALIZATION_FORMS, form); |
| 140 if (normalizationForm === -1) { | 136 if (normalizationForm === -1) { |
| 141 throw MakeRangeError(kNormalizationForm, | 137 throw %make_range_error(kNormalizationForm, |
| 142 %_Call(ArrayJoin, NORMALIZATION_FORMS, ', ')); | 138 %_Call(ArrayJoin, NORMALIZATION_FORMS, ', ')); |
| 143 } | 139 } |
| 144 | 140 |
| 145 return s; | 141 return s; |
| 146 } | 142 } |
| 147 | 143 |
| 148 %FunctionSetLength(StringNormalize, 0); | 144 %FunctionSetLength(StringNormalize, 0); |
| 149 | 145 |
| 150 | 146 |
| 151 // This has the same size as the RegExpLastMatchInfo array, and can be used | 147 // This has the same size as the RegExpLastMatchInfo array, and can be used |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 return "<sup>" + TO_STRING(this) + "</sup>"; | 572 return "<sup>" + TO_STRING(this) + "</sup>"; |
| 577 } | 573 } |
| 578 | 574 |
| 579 // ES6, section 21.1.3.13 | 575 // ES6, section 21.1.3.13 |
| 580 function StringRepeat(count) { | 576 function StringRepeat(count) { |
| 581 CHECK_OBJECT_COERCIBLE(this, "String.prototype.repeat"); | 577 CHECK_OBJECT_COERCIBLE(this, "String.prototype.repeat"); |
| 582 | 578 |
| 583 var s = TO_STRING(this); | 579 var s = TO_STRING(this); |
| 584 var n = TO_INTEGER(count); | 580 var n = TO_INTEGER(count); |
| 585 | 581 |
| 586 if (n < 0 || n === INFINITY) throw MakeRangeError(kInvalidCountValue); | 582 if (n < 0 || n === INFINITY) throw %make_range_error(kInvalidCountValue); |
| 587 | 583 |
| 588 // Early return to allow an arbitrarily-large repeat of the empty string. | 584 // Early return to allow an arbitrarily-large repeat of the empty string. |
| 589 if (s.length === 0) return ""; | 585 if (s.length === 0) return ""; |
| 590 | 586 |
| 591 // The maximum string length is stored in a smi, so a longer repeat | 587 // The maximum string length is stored in a smi, so a longer repeat |
| 592 // must result in a range error. | 588 // must result in a range error. |
| 593 if (n > %_MaxSmi()) throw MakeRangeError(kInvalidCountValue); | 589 if (n > %_MaxSmi()) throw %make_range_error(kInvalidCountValue); |
| 594 | 590 |
| 595 var r = ""; | 591 var r = ""; |
| 596 while (true) { | 592 while (true) { |
| 597 if (n & 1) r += s; | 593 if (n & 1) r += s; |
| 598 n >>= 1; | 594 n >>= 1; |
| 599 if (n === 0) return r; | 595 if (n === 0) return r; |
| 600 s += s; | 596 s += s; |
| 601 } | 597 } |
| 602 } | 598 } |
| 603 | 599 |
| 604 | 600 |
| 605 // ES6 draft 04-05-14, section 21.1.3.18 | 601 // ES6 draft 04-05-14, section 21.1.3.18 |
| 606 function StringStartsWith(searchString, position) { // length == 1 | 602 function StringStartsWith(searchString, position) { // length == 1 |
| 607 CHECK_OBJECT_COERCIBLE(this, "String.prototype.startsWith"); | 603 CHECK_OBJECT_COERCIBLE(this, "String.prototype.startsWith"); |
| 608 | 604 |
| 609 var s = TO_STRING(this); | 605 var s = TO_STRING(this); |
| 610 | 606 |
| 611 if (IsRegExp(searchString)) { | 607 if (IsRegExp(searchString)) { |
| 612 throw MakeTypeError(kFirstArgumentNotRegExp, "String.prototype.startsWith"); | 608 throw %make_type_error(kFirstArgumentNotRegExp, "String.prototype.startsWith
"); |
| 613 } | 609 } |
| 614 | 610 |
| 615 var ss = TO_STRING(searchString); | 611 var ss = TO_STRING(searchString); |
| 616 var pos = TO_INTEGER(position); | 612 var pos = TO_INTEGER(position); |
| 617 | 613 |
| 618 var s_len = s.length; | 614 var s_len = s.length; |
| 619 var start = MinSimple(MaxSimple(pos, 0), s_len); | 615 var start = MinSimple(MaxSimple(pos, 0), s_len); |
| 620 var ss_len = ss.length; | 616 var ss_len = ss.length; |
| 621 if (ss_len + start > s_len) { | 617 if (ss_len + start > s_len) { |
| 622 return false; | 618 return false; |
| 623 } | 619 } |
| 624 | 620 |
| 625 return %_SubString(s, start, start + ss_len) === ss; | 621 return %_SubString(s, start, start + ss_len) === ss; |
| 626 } | 622 } |
| 627 | 623 |
| 628 %FunctionSetLength(StringStartsWith, 1); | 624 %FunctionSetLength(StringStartsWith, 1); |
| 629 | 625 |
| 630 | 626 |
| 631 // ES6 draft 04-05-14, section 21.1.3.7 | 627 // ES6 draft 04-05-14, section 21.1.3.7 |
| 632 function StringEndsWith(searchString, position) { // length == 1 | 628 function StringEndsWith(searchString, position) { // length == 1 |
| 633 CHECK_OBJECT_COERCIBLE(this, "String.prototype.endsWith"); | 629 CHECK_OBJECT_COERCIBLE(this, "String.prototype.endsWith"); |
| 634 | 630 |
| 635 var s = TO_STRING(this); | 631 var s = TO_STRING(this); |
| 636 | 632 |
| 637 if (IsRegExp(searchString)) { | 633 if (IsRegExp(searchString)) { |
| 638 throw MakeTypeError(kFirstArgumentNotRegExp, "String.prototype.endsWith"); | 634 throw %make_type_error(kFirstArgumentNotRegExp, "String.prototype.endsWith")
; |
| 639 } | 635 } |
| 640 | 636 |
| 641 var ss = TO_STRING(searchString); | 637 var ss = TO_STRING(searchString); |
| 642 var s_len = s.length; | 638 var s_len = s.length; |
| 643 var pos = !IS_UNDEFINED(position) ? TO_INTEGER(position) : s_len | 639 var pos = !IS_UNDEFINED(position) ? TO_INTEGER(position) : s_len |
| 644 | 640 |
| 645 var end = MinSimple(MaxSimple(pos, 0), s_len); | 641 var end = MinSimple(MaxSimple(pos, 0), s_len); |
| 646 var ss_len = ss.length; | 642 var ss_len = ss.length; |
| 647 var start = end - ss_len; | 643 var start = end - ss_len; |
| 648 if (start < 0) { | 644 if (start < 0) { |
| 649 return false; | 645 return false; |
| 650 } | 646 } |
| 651 | 647 |
| 652 return %_SubString(s, start, start + ss_len) === ss; | 648 return %_SubString(s, start, start + ss_len) === ss; |
| 653 } | 649 } |
| 654 | 650 |
| 655 %FunctionSetLength(StringEndsWith, 1); | 651 %FunctionSetLength(StringEndsWith, 1); |
| 656 | 652 |
| 657 | 653 |
| 658 // ES6 draft 04-05-14, section 21.1.3.6 | 654 // ES6 draft 04-05-14, section 21.1.3.6 |
| 659 function StringIncludes(searchString, position) { // length == 1 | 655 function StringIncludes(searchString, position) { // length == 1 |
| 660 CHECK_OBJECT_COERCIBLE(this, "String.prototype.includes"); | 656 CHECK_OBJECT_COERCIBLE(this, "String.prototype.includes"); |
| 661 | 657 |
| 662 var string = TO_STRING(this); | 658 var string = TO_STRING(this); |
| 663 | 659 |
| 664 if (IsRegExp(searchString)) { | 660 if (IsRegExp(searchString)) { |
| 665 throw MakeTypeError(kFirstArgumentNotRegExp, "String.prototype.includes"); | 661 throw %make_type_error(kFirstArgumentNotRegExp, "String.prototype.includes")
; |
| 666 } | 662 } |
| 667 | 663 |
| 668 searchString = TO_STRING(searchString); | 664 searchString = TO_STRING(searchString); |
| 669 var pos = TO_INTEGER(position); | 665 var pos = TO_INTEGER(position); |
| 670 | 666 |
| 671 var stringLength = string.length; | 667 var stringLength = string.length; |
| 672 if (pos < 0) pos = 0; | 668 if (pos < 0) pos = 0; |
| 673 if (pos > stringLength) pos = stringLength; | 669 if (pos > stringLength) pos = stringLength; |
| 674 var searchStringLength = searchString.length; | 670 var searchStringLength = searchString.length; |
| 675 | 671 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 784 to.StringLastIndexOf = StringLastIndexOf; | 780 to.StringLastIndexOf = StringLastIndexOf; |
| 785 to.StringMatch = StringMatchJS; | 781 to.StringMatch = StringMatchJS; |
| 786 to.StringReplace = StringReplace; | 782 to.StringReplace = StringReplace; |
| 787 to.StringSlice = StringSlice; | 783 to.StringSlice = StringSlice; |
| 788 to.StringSplit = StringSplitJS; | 784 to.StringSplit = StringSplitJS; |
| 789 to.StringSubstr = StringSubstr; | 785 to.StringSubstr = StringSubstr; |
| 790 to.StringSubstring = StringSubstring; | 786 to.StringSubstring = StringSubstring; |
| 791 }); | 787 }); |
| 792 | 788 |
| 793 }) | 789 }) |
| OLD | NEW |