| Index: src/string.js
|
| diff --git a/src/string.js b/src/string.js
|
| index dd5115d5bf311cb2bc827b33c240b381f480b004..8e4b896eae5492bab3c1efb5a7222a4c6b9be654 100644
|
| --- a/src/string.js
|
| +++ b/src/string.js
|
| @@ -61,10 +61,8 @@ function StringValueOf() {
|
|
|
| // ECMA-262, section 15.5.4.4
|
| function StringCharAt(pos) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.charAt"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.charAt");
|
| +
|
| var result = %_StringCharAt(this, pos);
|
| if (%_IsSmi(result)) {
|
| result = %_StringCharAt(TO_STRING_INLINE(this), TO_INTEGER(pos));
|
| @@ -75,10 +73,8 @@ function StringCharAt(pos) {
|
|
|
| // ECMA-262 section 15.5.4.5
|
| function StringCharCodeAt(pos) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.charCodeAt"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.charCodeAt");
|
| +
|
| var result = %_StringCharCodeAt(this, pos);
|
| if (!%_IsSmi(result)) {
|
| result = %_StringCharCodeAt(TO_STRING_INLINE(this), TO_INTEGER(pos));
|
| @@ -89,10 +85,8 @@ function StringCharCodeAt(pos) {
|
|
|
| // ECMA-262, section 15.5.4.6
|
| function StringConcat() {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.concat"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.concat");
|
| +
|
| var len = %_ArgumentsLength();
|
| var this_as_string = TO_STRING_INLINE(this);
|
| if (len === 1) {
|
| @@ -113,10 +107,8 @@ function StringConcat() {
|
|
|
| // ECMA-262 section 15.5.4.7
|
| function StringIndexOf(pattern /* position */) { // length == 1
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.indexOf"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.indexOf");
|
| +
|
| var subject = TO_STRING_INLINE(this);
|
| pattern = TO_STRING_INLINE(pattern);
|
| var index = 0;
|
| @@ -132,10 +124,8 @@ function StringIndexOf(pattern /* position */) { // length == 1
|
|
|
| // ECMA-262 section 15.5.4.8
|
| function StringLastIndexOf(pat /* position */) { // length == 1
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.lastIndexOf"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.lastIndexOf");
|
| +
|
| var sub = TO_STRING_INLINE(this);
|
| var subLength = sub.length;
|
| var pat = TO_STRING_INLINE(pat);
|
| @@ -165,10 +155,8 @@ function StringLastIndexOf(pat /* position */) { // length == 1
|
| // This function is implementation specific. For now, we do not
|
| // do anything locale specific.
|
| function StringLocaleCompare(other) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.localeCompare"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.localeCompare");
|
| +
|
| return %StringLocaleCompare(TO_STRING_INLINE(this),
|
| TO_STRING_INLINE(other));
|
| }
|
| @@ -176,10 +164,8 @@ function StringLocaleCompare(other) {
|
|
|
| // ECMA-262 section 15.5.4.10
|
| function StringMatch(regexp) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.match"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.match");
|
| +
|
| var subject = TO_STRING_INLINE(this);
|
| if (IS_REGEXP(regexp)) {
|
| // Emulate RegExp.prototype.exec's side effect in step 5, even though
|
| @@ -210,10 +196,8 @@ var reusableMatchInfo = [2, "", "", -1, -1];
|
|
|
| // ECMA-262, section 15.5.4.11
|
| function StringReplace(search, replace) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.replace"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.replace");
|
| +
|
| var subject = TO_STRING_INLINE(this);
|
|
|
| // Decision tree for dispatch
|
| @@ -543,10 +527,8 @@ function StringReplaceNonGlobalRegExpWithFunction(subject, regexp, replace) {
|
|
|
| // ECMA-262 section 15.5.4.12
|
| function StringSearch(re) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.search"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.search");
|
| +
|
| var regexp;
|
| if (IS_STRING(re)) {
|
| regexp = %_GetFromCache(STRING_TO_REGEXP_CACHE_ID, re);
|
| @@ -565,10 +547,8 @@ function StringSearch(re) {
|
|
|
| // ECMA-262 section 15.5.4.13
|
| function StringSlice(start, end) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.slice"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.slice");
|
| +
|
| var s = TO_STRING_INLINE(this);
|
| var s_len = s.length;
|
| var start_i = TO_INTEGER(start);
|
| @@ -609,10 +589,8 @@ function StringSlice(start, end) {
|
|
|
| // ECMA-262 section 15.5.4.14
|
| function StringSplit(separator, limit) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.split"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.split");
|
| +
|
| var subject = TO_STRING_INLINE(this);
|
| limit = (IS_UNDEFINED(limit)) ? 0xffffffff : TO_UINT32(limit);
|
|
|
| @@ -709,10 +687,8 @@ function StringSplitOnRegExp(subject, separator, limit, length) {
|
|
|
| // ECMA-262 section 15.5.4.15
|
| function StringSubstring(start, end) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.subString"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.subString");
|
| +
|
| var s = TO_STRING_INLINE(this);
|
| var s_len = s.length;
|
|
|
| @@ -744,10 +720,8 @@ function StringSubstring(start, end) {
|
|
|
| // This is not a part of ECMA-262.
|
| function StringSubstr(start, n) {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.substr"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.substr");
|
| +
|
| var s = TO_STRING_INLINE(this);
|
| var len;
|
|
|
| @@ -786,65 +760,51 @@ function StringSubstr(start, n) {
|
|
|
| // ECMA-262, 15.5.4.16
|
| function StringToLowerCase() {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.toLowerCase"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.toLowerCase");
|
| +
|
| return %StringToLowerCase(TO_STRING_INLINE(this));
|
| }
|
|
|
|
|
| // ECMA-262, 15.5.4.17
|
| function StringToLocaleLowerCase() {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.toLocaleLowerCase"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.toLocaleLowerCase");
|
| +
|
| return %StringToLowerCase(TO_STRING_INLINE(this));
|
| }
|
|
|
|
|
| // ECMA-262, 15.5.4.18
|
| function StringToUpperCase() {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.toUpperCase"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.toUpperCase");
|
| +
|
| return %StringToUpperCase(TO_STRING_INLINE(this));
|
| }
|
|
|
|
|
| // ECMA-262, 15.5.4.19
|
| function StringToLocaleUpperCase() {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.toLocaleUpperCase"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.toLocaleUpperCase");
|
| +
|
| return %StringToUpperCase(TO_STRING_INLINE(this));
|
| }
|
|
|
| // ES5, 15.5.4.20
|
| function StringTrim() {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.trim"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.trim");
|
| +
|
| return %StringTrim(TO_STRING_INLINE(this), true, true);
|
| }
|
|
|
| function StringTrimLeft() {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.trimLeft"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.trimLeft");
|
| +
|
| return %StringTrim(TO_STRING_INLINE(this), true, false);
|
| }
|
|
|
| function StringTrimRight() {
|
| - if (IS_NULL_OR_UNDEFINED(this) && !IS_UNDETECTABLE(this)) {
|
| - throw MakeTypeError("called_on_null_or_undefined",
|
| - ["String.prototype.trimRight"]);
|
| - }
|
| + CHECK_OBJECT_COERCIBLE(this, "String.prototype.trimRight");
|
| +
|
| return %StringTrim(TO_STRING_INLINE(this), false, true);
|
| }
|
|
|
|
|