| Index: src/string.js
|
| ===================================================================
|
| --- src/string.js (revision 7676)
|
| +++ src/string.js (working copy)
|
| @@ -62,6 +62,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var result = %_StringCharAt(this, pos);
|
| if (%_IsSmi(result)) {
|
| result = %_StringCharAt(TO_STRING_INLINE(this), TO_INTEGER(pos));
|
| @@ -72,6 +76,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var result = %_StringCharCodeAt(this, pos);
|
| if (!%_IsSmi(result)) {
|
| result = %_StringCharCodeAt(TO_STRING_INLINE(this), TO_INTEGER(pos));
|
| @@ -82,6 +90,9 @@
|
|
|
| // 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"]);
|
| + }
|
| var len = %_ArgumentsLength();
|
| var this_as_string = TO_STRING_INLINE(this);
|
| if (len === 1) {
|
| @@ -102,6 +113,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var subject = TO_STRING_INLINE(this);
|
| pattern = TO_STRING_INLINE(pattern);
|
| var index = 0;
|
| @@ -117,6 +132,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var sub = TO_STRING_INLINE(this);
|
| var subLength = sub.length;
|
| var pat = TO_STRING_INLINE(pat);
|
| @@ -146,6 +165,10 @@
|
| // 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"]);
|
| + }
|
| if (%_ArgumentsLength() === 0) return 0;
|
| return %StringLocaleCompare(TO_STRING_INLINE(this),
|
| TO_STRING_INLINE(other));
|
| @@ -154,6 +177,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var subject = TO_STRING_INLINE(this);
|
| if (IS_REGEXP(regexp)) {
|
| if (!regexp.global) return RegExpExecNoTests(regexp, subject, 0);
|
| @@ -187,6 +214,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var subject = TO_STRING_INLINE(this);
|
|
|
| // Delegate to one of the regular expression variants if necessary.
|
| @@ -467,6 +498,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var regexp;
|
| if (IS_STRING(re)) {
|
| regexp = %_GetFromCache(STRING_TO_REGEXP_CACHE_ID, re);
|
| @@ -485,6 +520,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var s = TO_STRING_INLINE(this);
|
| var s_len = s.length;
|
| var start_i = TO_INTEGER(start);
|
| @@ -520,6 +559,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var subject = TO_STRING_INLINE(this);
|
| limit = (IS_UNDEFINED(limit)) ? 0xffffffff : TO_UINT32(limit);
|
| if (limit === 0) return [];
|
| @@ -613,6 +656,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var s = TO_STRING_INLINE(this);
|
| var s_len = s.length;
|
|
|
| @@ -646,6 +693,10 @@
|
|
|
| // 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"]);
|
| + }
|
| var s = TO_STRING_INLINE(this);
|
| var len;
|
|
|
| @@ -686,37 +737,65 @@
|
|
|
| // 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"]);
|
| + }
|
| 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"]);
|
| + }
|
| 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"]);
|
| + }
|
| 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"]);
|
| + }
|
| 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"]);
|
| + }
|
| 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"]);
|
| + }
|
| 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"]);
|
| + }
|
| return %StringTrim(TO_STRING_INLINE(this), false, true);
|
| }
|
|
|
|
|