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); |
} |