Index: src/js/string.js |
diff --git a/src/js/string.js b/src/js/string.js |
index b1e175585c3f9952c3174b4fe1672db5c653533f..ef5928ebc2777183a907936532f3dcc3e0ebbcc1 100644 |
--- a/src/js/string.js |
+++ b/src/js/string.js |
@@ -81,41 +81,34 @@ function StringCharCodeAtJS(pos) { |
// ECMA-262, section 15.5.4.6 |
function StringConcat(other /* and more */) { // length == 1 |
+ "use strict"; |
CHECK_OBJECT_COERCIBLE(this, "String.prototype.concat"); |
- var len = %_ArgumentsLength(); |
- var this_as_string = TO_STRING(this); |
- if (len === 1) { |
- return this_as_string + TO_STRING(other); |
- } |
- var parts = new InternalArray(len + 1); |
- parts[0] = this_as_string; |
- for (var i = 0; i < len; i++) { |
- var part = %_Arguments(i); |
- parts[i + 1] = TO_STRING(part); |
+ var s = TO_STRING(this); |
+ var len = arguments.length; |
+ for (var i = 0; i < len; ++i) { |
+ s = s + TO_STRING(arguments[i]); |
} |
- return %StringBuilderConcat(parts, len + 1, ""); |
+ return s; |
} |
// ECMA-262 section 15.5.4.7 |
-function StringIndexOfJS(pattern /* position */) { // length == 1 |
+function StringIndexOf(pattern, position) { // length == 1 |
CHECK_OBJECT_COERCIBLE(this, "String.prototype.indexOf"); |
var subject = TO_STRING(this); |
pattern = TO_STRING(pattern); |
- var index = 0; |
- if (%_ArgumentsLength() > 1) { |
- index = %_Arguments(1); // position |
- index = TO_INTEGER(index); |
- if (index < 0) index = 0; |
- if (index > subject.length) index = subject.length; |
- } |
+ var index = TO_INTEGER(position); |
+ if (index < 0) index = 0; |
+ if (index > subject.length) index = subject.length; |
return %StringIndexOf(subject, pattern, index); |
} |
+%FunctionSetLength(StringIndexOf, 1); |
+ |
// ECMA-262 section 15.5.4.8 |
-function StringLastIndexOfJS(pat /* position */) { // length == 1 |
+function StringLastIndexOf(pat, pos) { // length == 1 |
CHECK_OBJECT_COERCIBLE(this, "String.prototype.lastIndexOf"); |
var sub = TO_STRING(this); |
@@ -123,16 +116,14 @@ function StringLastIndexOfJS(pat /* position */) { // length == 1 |
var pat = TO_STRING(pat); |
var patLength = pat.length; |
var index = subLength - patLength; |
- if (%_ArgumentsLength() > 1) { |
- var position = TO_NUMBER(%_Arguments(1)); |
- if (!NUMBER_IS_NAN(position)) { |
- position = TO_INTEGER(position); |
- if (position < 0) { |
- position = 0; |
- } |
- if (position + patLength < subLength) { |
- index = position; |
- } |
+ var position = TO_NUMBER(pos); |
+ if (!NUMBER_IS_NAN(position)) { |
+ position = TO_INTEGER(position); |
+ if (position < 0) { |
+ position = 0; |
+ } |
+ if (position + patLength < subLength) { |
+ index = position; |
} |
} |
if (index < 0) { |
@@ -141,6 +132,8 @@ function StringLastIndexOfJS(pat /* position */) { // length == 1 |
return %StringLastIndexOf(sub, pat, index); |
} |
+%FunctionSetLength(StringLastIndexOf, 1); |
+ |
// ECMA-262 section 15.5.4.9 |
// |
@@ -177,11 +170,10 @@ function StringMatchJS(pattern) { |
// For now we do nothing, as proper normalization requires big tables. |
// If Intl is enabled, then i18n.js will override it and provide the the |
// proper functionality. |
-function StringNormalizeJS() { |
+function StringNormalize(formArg) { // length == 0 |
CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); |
var s = TO_STRING(this); |
- var formArg = %_Arguments(0); |
var form = IS_UNDEFINED(formArg) ? 'NFC' : TO_STRING(formArg); |
var NORMALIZATION_FORMS = ['NFC', 'NFD', 'NFKC', 'NFKD']; |
@@ -194,6 +186,8 @@ function StringNormalizeJS() { |
return s; |
} |
+%FunctionSetLength(StringNormalize, 0); |
+ |
// This has the same size as the RegExpLastMatchInfo array, and can be used |
// for functions that expect that structure to be returned. It is used when |
@@ -567,7 +561,7 @@ function StringTrimRight() { |
// ECMA-262, section 15.5.3.2 |
function StringFromCharCode(code) { |
var n = %_ArgumentsLength(); |
- if (n == 1) return %_StringCharFromCode(code & 0xffff); |
+ if (n === 1) return %_StringCharFromCode(code & 0xffff); |
var one_byte = %NewString(n, NEW_ONE_BYTE_STRING); |
var i; |
@@ -716,7 +710,7 @@ function StringRepeat(count) { |
// ES6 draft 04-05-14, section 21.1.3.18 |
-function StringStartsWith(searchString /* position */) { // length == 1 |
+function StringStartsWith(searchString, position) { // length == 1 |
CHECK_OBJECT_COERCIBLE(this, "String.prototype.startsWith"); |
var s = TO_STRING(this); |
@@ -726,13 +720,7 @@ function StringStartsWith(searchString /* position */) { // length == 1 |
} |
var ss = TO_STRING(searchString); |
- var pos = 0; |
- if (%_ArgumentsLength() > 1) { |
- var arg = %_Arguments(1); // position |
- if (!IS_UNDEFINED(arg)) { |
- pos = TO_INTEGER(arg); |
- } |
- } |
+ var pos = TO_INTEGER(position); |
var s_len = s.length; |
var start = MinSimple(MaxSimple(pos, 0), s_len); |
@@ -744,9 +732,11 @@ function StringStartsWith(searchString /* position */) { // length == 1 |
return %_SubString(s, start, start + ss_len) === ss; |
} |
+%FunctionSetLength(StringStartsWith, 1); |
+ |
// ES6 draft 04-05-14, section 21.1.3.7 |
-function StringEndsWith(searchString /* position */) { // length == 1 |
+function StringEndsWith(searchString, position) { // length == 1 |
CHECK_OBJECT_COERCIBLE(this, "String.prototype.endsWith"); |
var s = TO_STRING(this); |
@@ -757,13 +747,7 @@ function StringEndsWith(searchString /* position */) { // length == 1 |
var ss = TO_STRING(searchString); |
var s_len = s.length; |
- var pos = s_len; |
- if (%_ArgumentsLength() > 1) { |
- var arg = %_Arguments(1); // position |
- if (!IS_UNDEFINED(arg)) { |
- pos = TO_INTEGER(arg); |
- } |
- } |
+ var pos = !IS_UNDEFINED(position) ? TO_INTEGER(position) : s_len |
var end = MinSimple(MaxSimple(pos, 0), s_len); |
var ss_len = ss.length; |
@@ -775,9 +759,11 @@ function StringEndsWith(searchString /* position */) { // length == 1 |
return %_SubString(s, start, start + ss_len) === ss; |
} |
+%FunctionSetLength(StringEndsWith, 1); |
+ |
// ES6 draft 04-05-14, section 21.1.3.6 |
-function StringIncludes(searchString /* position */) { // length == 1 |
+function StringIncludes(searchString, position) { // length == 1 |
CHECK_OBJECT_COERCIBLE(this, "String.prototype.includes"); |
var string = TO_STRING(this); |
@@ -787,11 +773,7 @@ function StringIncludes(searchString /* position */) { // length == 1 |
} |
searchString = TO_STRING(searchString); |
- var pos = 0; |
- if (%_ArgumentsLength() > 1) { |
- pos = %_Arguments(1); // position |
- pos = TO_INTEGER(pos); |
- } |
+ var pos = TO_INTEGER(position); |
var stringLength = string.length; |
if (pos < 0) pos = 0; |
@@ -805,6 +787,8 @@ function StringIncludes(searchString /* position */) { // length == 1 |
return %StringIndexOf(string, searchString, pos) !== -1; |
} |
+%FunctionSetLength(StringIncludes, 1); |
+ |
// ES6 Draft 05-22-2014, section 21.1.3.3 |
function StringCodePointAt(pos) { |
@@ -830,12 +814,13 @@ function StringCodePointAt(pos) { |
// ES6 Draft 05-22-2014, section 21.1.2.2 |
function StringFromCodePoint(_) { // length = 1 |
+ "use strict"; |
var code; |
- var length = %_ArgumentsLength(); |
+ var length = arguments.length; |
var index; |
var result = ""; |
for (index = 0; index < length; index++) { |
- code = %_Arguments(index); |
+ code = arguments[index]; |
if (!%_IsSmi(code)) { |
code = TO_NUMBER(code); |
} |
@@ -859,8 +844,8 @@ function StringFromCodePoint(_) { // length = 1 |
// ES6 Draft 03-17-2015, section 21.1.2.4 |
function StringRaw(callSite) { |
- // TODO(caitp): Use rest parameters when implemented |
- var numberOfSubstitutions = %_ArgumentsLength(); |
+ "use strict"; |
+ var numberOfSubstitutions = arguments.length; |
var cooked = TO_OBJECT(callSite); |
var raw = TO_OBJECT(cooked.raw); |
var literalSegments = TO_LENGTH(raw.length); |
@@ -870,7 +855,7 @@ function StringRaw(callSite) { |
for (var i = 1; i < literalSegments; ++i) { |
if (i < numberOfSubstitutions) { |
- result += TO_STRING(%_Arguments(i)); |
+ result += TO_STRING(arguments[i]); |
} |
result += TO_STRING(raw[i]); |
} |
@@ -904,11 +889,11 @@ utils.InstallFunctions(GlobalString.prototype, DONT_ENUM, [ |
"concat", StringConcat, |
"endsWith", StringEndsWith, |
"includes", StringIncludes, |
- "indexOf", StringIndexOfJS, |
- "lastIndexOf", StringLastIndexOfJS, |
+ "indexOf", StringIndexOf, |
+ "lastIndexOf", StringLastIndexOf, |
"localeCompare", StringLocaleCompareJS, |
"match", StringMatchJS, |
- "normalize", StringNormalizeJS, |
+ "normalize", StringNormalize, |
"repeat", StringRepeat, |
"replace", StringReplace, |
"search", StringSearch, |
@@ -946,8 +931,8 @@ utils.InstallFunctions(GlobalString.prototype, DONT_ENUM, [ |
utils.Export(function(to) { |
to.ExpandReplacement = ExpandReplacement; |
to.StringCharAt = StringCharAtJS; |
- to.StringIndexOf = StringIndexOfJS; |
- to.StringLastIndexOf = StringLastIndexOfJS; |
+ to.StringIndexOf = StringIndexOf; |
+ to.StringLastIndexOf = StringLastIndexOf; |
to.StringMatch = StringMatchJS; |
to.StringReplace = StringReplace; |
to.StringSlice = StringSlice; |