Chromium Code Reviews| 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 // This file relies on the fact that the following declaration has been made | 5 var $stringCharAt; |
| 6 // in runtime.js: | 6 var $stringIndexOf; |
| 7 // var $String = global.String; | 7 var $stringSubstring; |
| 8 | 8 |
| 9 // ------------------------------------------------------------------- | 9 (function() { |
| 10 | |
| 11 %CheckIsBootstrapping(); | |
| 12 | |
| 13 var GlobalRegExp = global.RegExp; | |
| 14 var GlobalString = global.String; | |
| 15 | |
| 16 //------------------------------------------------------------------- | |
| 10 | 17 |
| 11 function StringConstructor(x) { | 18 function StringConstructor(x) { |
| 12 if (%_ArgumentsLength() == 0) x = ''; | 19 if (%_ArgumentsLength() == 0) x = ''; |
| 13 if (%_IsConstructCall()) { | 20 if (%_IsConstructCall()) { |
| 14 %_SetValueOf(this, TO_STRING_INLINE(x)); | 21 %_SetValueOf(this, TO_STRING_INLINE(x)); |
| 15 } else { | 22 } else { |
| 16 return IS_SYMBOL(x) ? | 23 return IS_SYMBOL(x) ? |
| 17 %_CallFunction(x, SymbolToString) : TO_STRING_INLINE(x); | 24 %_CallFunction(x, SymbolToString) : TO_STRING_INLINE(x); |
| 18 } | 25 } |
| 19 } | 26 } |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 140 // ECMA-262 section 15.5.4.10 | 147 // ECMA-262 section 15.5.4.10 |
| 141 function StringMatchJS(regexp) { | 148 function StringMatchJS(regexp) { |
| 142 CHECK_OBJECT_COERCIBLE(this, "String.prototype.match"); | 149 CHECK_OBJECT_COERCIBLE(this, "String.prototype.match"); |
| 143 | 150 |
| 144 var subject = TO_STRING_INLINE(this); | 151 var subject = TO_STRING_INLINE(this); |
| 145 if (IS_REGEXP(regexp)) { | 152 if (IS_REGEXP(regexp)) { |
| 146 // Emulate RegExp.prototype.exec's side effect in step 5, even though | 153 // Emulate RegExp.prototype.exec's side effect in step 5, even though |
| 147 // value is discarded. | 154 // value is discarded. |
| 148 var lastIndex = regexp.lastIndex; | 155 var lastIndex = regexp.lastIndex; |
| 149 TO_INTEGER_FOR_SIDE_EFFECT(lastIndex); | 156 TO_INTEGER_FOR_SIDE_EFFECT(lastIndex); |
| 150 if (!regexp.global) return RegExpExecNoTests(regexp, subject, 0); | 157 if (!regexp.global) return $regexpExecNoTests(regexp, subject, 0); |
| 151 // lastMatchInfo is defined in regexp.js. | 158 var result = %StringMatch(subject, regexp, $regexpLastMatchInfo); |
| 152 var result = %StringMatch(subject, regexp, lastMatchInfo); | 159 if (result !== null) $regexpLastMatchInfoOverride = null; |
| 153 if (result !== null) lastMatchInfoOverride = null; | |
| 154 regexp.lastIndex = 0; | 160 regexp.lastIndex = 0; |
| 155 return result; | 161 return result; |
| 156 } | 162 } |
| 157 // Non-regexp argument. | 163 // Non-regexp argument. |
| 158 regexp = new $RegExp(regexp); | 164 regexp = new GlobalRegExp(regexp); |
| 159 return RegExpExecNoTests(regexp, subject, 0); | 165 return $regexpExecNoTests(regexp, subject, 0); |
| 160 } | 166 } |
| 161 | 167 |
| 162 | 168 |
| 163 var NORMALIZATION_FORMS = ['NFC', 'NFD', 'NFKC', 'NFKD']; | 169 var NORMALIZATION_FORMS = ['NFC', 'NFD', 'NFKC', 'NFKD']; |
| 164 | 170 |
| 165 | 171 |
| 166 // ECMA-262 v6, section 21.1.3.12 | 172 // ECMA-262 v6, section 21.1.3.12 |
| 167 // | 173 // |
| 168 // For now we do nothing, as proper normalization requires big tables. | 174 // For now we do nothing, as proper normalization requires big tables. |
| 169 // If Intl is enabled, then i18n.js will override it and provide the the | 175 // If Intl is enabled, then i18n.js will override it and provide the the |
| 170 // proper functionality. | 176 // proper functionality. |
| 171 function StringNormalizeJS(form) { | 177 function StringNormalizeJS(form) { |
| 172 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); | 178 CHECK_OBJECT_COERCIBLE(this, "String.prototype.normalize"); |
| 173 | 179 |
| 174 var form = form ? TO_STRING_INLINE(form) : 'NFC'; | 180 var form = form ? TO_STRING_INLINE(form) : 'NFC'; |
| 175 var normalizationForm = NORMALIZATION_FORMS.indexOf(form); | 181 var normalizationForm = NORMALIZATION_FORMS.indexOf(form); |
| 176 if (normalizationForm === -1) { | 182 if (normalizationForm === -1) { |
| 177 throw new $RangeError('The normalization form should be one of ' | 183 throw new $RangeError('The normalization form should be one of ' |
| 178 + NORMALIZATION_FORMS.join(', ') + '.'); | 184 + NORMALIZATION_FORMS.join(', ') + '.'); |
| 179 } | 185 } |
| 180 | 186 |
| 181 return %_ValueOf(this); | 187 return %_ValueOf(this); |
| 182 } | 188 } |
| 183 | 189 |
| 184 | 190 |
| 185 // This has the same size as the lastMatchInfo array, and can be used for | 191 // This has the same size as the $regexpLastMatchInfo array, and can be used |
| 186 // functions that expect that structure to be returned. It is used when the | 192 // for functions that expect that structure to be returned. It is used when |
| 187 // needle is a string rather than a regexp. In this case we can't update | 193 // the needle is a string rather than a regexp. In this case we can't update |
| 188 // lastMatchArray without erroneously affecting the properties on the global | 194 // lastMatchArray without erroneously affecting the properties on the global |
| 189 // RegExp object. | 195 // RegExp object. |
| 190 var reusableMatchInfo = [2, "", "", -1, -1]; | 196 var reusableMatchInfo = [2, "", "", -1, -1]; |
| 191 | 197 |
| 192 | 198 |
| 193 // ECMA-262, section 15.5.4.11 | 199 // ECMA-262, section 15.5.4.11 |
| 194 function StringReplace(search, replace) { | 200 function StringReplace(search, replace) { |
| 195 CHECK_OBJECT_COERCIBLE(this, "String.prototype.replace"); | 201 CHECK_OBJECT_COERCIBLE(this, "String.prototype.replace"); |
| 196 | 202 |
| 197 var subject = TO_STRING_INLINE(this); | 203 var subject = TO_STRING_INLINE(this); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 217 // Emulate RegExp.prototype.exec's side effect in step 5, even if | 223 // Emulate RegExp.prototype.exec's side effect in step 5, even if |
| 218 // value is discarded. | 224 // value is discarded. |
| 219 var lastIndex = search.lastIndex; | 225 var lastIndex = search.lastIndex; |
| 220 TO_INTEGER_FOR_SIDE_EFFECT(lastIndex); | 226 TO_INTEGER_FOR_SIDE_EFFECT(lastIndex); |
| 221 | 227 |
| 222 if (!IS_SPEC_FUNCTION(replace)) { | 228 if (!IS_SPEC_FUNCTION(replace)) { |
| 223 replace = TO_STRING_INLINE(replace); | 229 replace = TO_STRING_INLINE(replace); |
| 224 | 230 |
| 225 if (!search.global) { | 231 if (!search.global) { |
| 226 // Non-global regexp search, string replace. | 232 // Non-global regexp search, string replace. |
| 227 var match = DoRegExpExec(search, subject, 0); | 233 var match = $regexpExec(search, subject, 0); |
| 228 if (match == null) { | 234 if (match == null) { |
| 229 search.lastIndex = 0 | 235 search.lastIndex = 0 |
| 230 return subject; | 236 return subject; |
| 231 } | 237 } |
| 232 if (replace.length == 0) { | 238 if (replace.length == 0) { |
| 233 return %_SubString(subject, 0, match[CAPTURE0]) + | 239 return %_SubString(subject, 0, match[CAPTURE0]) + |
| 234 %_SubString(subject, match[CAPTURE1], subject.length) | 240 %_SubString(subject, match[CAPTURE1], subject.length) |
| 235 } | 241 } |
| 236 return ExpandReplacement(replace, subject, lastMatchInfo, | 242 return ExpandReplacement(replace, subject, $regexpLastMatchInfo, |
| 237 %_SubString(subject, 0, match[CAPTURE0])) + | 243 %_SubString(subject, 0, match[CAPTURE0])) + |
| 238 %_SubString(subject, match[CAPTURE1], subject.length); | 244 %_SubString(subject, match[CAPTURE1], subject.length); |
| 239 } | 245 } |
| 240 | 246 |
| 241 // Global regexp search, string replace. | 247 // Global regexp search, string replace. |
| 242 search.lastIndex = 0; | 248 search.lastIndex = 0; |
| 243 if (lastMatchInfoOverride == null) { | 249 if ($regexpLastMatchInfoOverride == null) { |
| 244 return %StringReplaceGlobalRegExpWithString( | 250 return %StringReplaceGlobalRegExpWithString( |
| 245 subject, search, replace, lastMatchInfo); | 251 subject, search, replace, $regexpLastMatchInfo); |
| 246 } else { | 252 } else { |
| 247 // We use this hack to detect whether StringReplaceRegExpWithString | 253 // We use this hack to detect whether StringReplaceRegExpWithString |
| 248 // found at least one hit. In that case we need to remove any | 254 // found at least one hit. In that case we need to remove any |
| 249 // override. | 255 // override. |
| 250 var saved_subject = lastMatchInfo[LAST_SUBJECT_INDEX]; | 256 var saved_subject = $regexpLastMatchInfo[LAST_SUBJECT_INDEX]; |
| 251 lastMatchInfo[LAST_SUBJECT_INDEX] = 0; | 257 $regexpLastMatchInfo[LAST_SUBJECT_INDEX] = 0; |
| 252 var answer = %StringReplaceGlobalRegExpWithString( | 258 var answer = %StringReplaceGlobalRegExpWithString( |
| 253 subject, search, replace, lastMatchInfo); | 259 subject, search, replace, $regexpLastMatchInfo); |
| 254 if (%_IsSmi(lastMatchInfo[LAST_SUBJECT_INDEX])) { | 260 if (%_IsSmi($regexpLastMatchInfo[LAST_SUBJECT_INDEX])) { |
| 255 lastMatchInfo[LAST_SUBJECT_INDEX] = saved_subject; | 261 $regexpLastMatchInfo[LAST_SUBJECT_INDEX] = saved_subject; |
| 256 } else { | 262 } else { |
| 257 lastMatchInfoOverride = null; | 263 $regexpLastMatchInfoOverride = null; |
| 258 } | 264 } |
| 259 return answer; | 265 return answer; |
| 260 } | 266 } |
| 261 } | 267 } |
| 262 | 268 |
| 263 if (search.global) { | 269 if (search.global) { |
| 264 // Global regexp search, function replace. | 270 // Global regexp search, function replace. |
| 265 return StringReplaceGlobalRegExpWithFunction(subject, search, replace); | 271 return StringReplaceGlobalRegExpWithFunction(subject, search, replace); |
| 266 } | 272 } |
| 267 // Non-global regexp search, function replace. | 273 // Non-global regexp search, function replace. |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 411 reusableReplaceArray = null; | 417 reusableReplaceArray = null; |
| 412 } else { | 418 } else { |
| 413 // Inside a nested replace (replace called from the replacement function | 419 // Inside a nested replace (replace called from the replacement function |
| 414 // of another replace) or we have failed to set the reusable array | 420 // of another replace) or we have failed to set the reusable array |
| 415 // back due to an exception in a replacement function. Create a new | 421 // back due to an exception in a replacement function. Create a new |
| 416 // array to use in the future, or until the original is written back. | 422 // array to use in the future, or until the original is written back. |
| 417 resultArray = new InternalArray(16); | 423 resultArray = new InternalArray(16); |
| 418 } | 424 } |
| 419 var res = %RegExpExecMultiple(regexp, | 425 var res = %RegExpExecMultiple(regexp, |
| 420 subject, | 426 subject, |
| 421 lastMatchInfo, | 427 $regexpLastMatchInfo, |
| 422 resultArray); | 428 resultArray); |
| 423 regexp.lastIndex = 0; | 429 regexp.lastIndex = 0; |
| 424 if (IS_NULL(res)) { | 430 if (IS_NULL(res)) { |
| 425 // No matches at all. | 431 // No matches at all. |
| 426 reusableReplaceArray = resultArray; | 432 reusableReplaceArray = resultArray; |
| 427 return subject; | 433 return subject; |
| 428 } | 434 } |
| 429 var len = res.length; | 435 var len = res.length; |
| 430 if (NUMBER_OF_CAPTURES(lastMatchInfo) == 2) { | 436 if (NUMBER_OF_CAPTURES($regexpLastMatchInfo) == 2) { |
| 431 // If the number of captures is two then there are no explicit captures in | 437 // If the number of captures is two then there are no explicit captures in |
| 432 // the regexp, just the implicit capture that captures the whole match. In | 438 // the regexp, just the implicit capture that captures the whole match. In |
| 433 // this case we can simplify quite a bit and end up with something faster. | 439 // this case we can simplify quite a bit and end up with something faster. |
| 434 // The builder will consist of some integers that indicate slices of the | 440 // The builder will consist of some integers that indicate slices of the |
| 435 // input string and some replacements that were returned from the replace | 441 // input string and some replacements that were returned from the replace |
| 436 // function. | 442 // function. |
| 437 var match_start = 0; | 443 var match_start = 0; |
| 438 var override = new InternalPackedArray(null, 0, subject); | 444 var override = new InternalPackedArray(null, 0, subject); |
| 439 var receiver = %GetDefaultReceiver(replace); | 445 var receiver = %GetDefaultReceiver(replace); |
| 440 for (var i = 0; i < len; i++) { | 446 for (var i = 0; i < len; i++) { |
| 441 var elem = res[i]; | 447 var elem = res[i]; |
| 442 if (%_IsSmi(elem)) { | 448 if (%_IsSmi(elem)) { |
| 443 // Integers represent slices of the original string. Use these to | 449 // Integers represent slices of the original string. Use these to |
| 444 // get the offsets we need for the override array (so things like | 450 // get the offsets we need for the override array (so things like |
| 445 // RegExp.leftContext work during the callback function. | 451 // RegExp.leftContext work during the callback function. |
| 446 if (elem > 0) { | 452 if (elem > 0) { |
| 447 match_start = (elem >> 11) + (elem & 0x7ff); | 453 match_start = (elem >> 11) + (elem & 0x7ff); |
| 448 } else { | 454 } else { |
| 449 match_start = res[++i] - elem; | 455 match_start = res[++i] - elem; |
| 450 } | 456 } |
| 451 } else { | 457 } else { |
| 452 override[0] = elem; | 458 override[0] = elem; |
| 453 override[1] = match_start; | 459 override[1] = match_start; |
| 454 lastMatchInfoOverride = override; | 460 $regexpLastMatchInfoOverride = override; |
| 455 var func_result = | 461 var func_result = |
| 456 %_CallFunction(receiver, elem, match_start, subject, replace); | 462 %_CallFunction(receiver, elem, match_start, subject, replace); |
| 457 // Overwrite the i'th element in the results with the string we got | 463 // Overwrite the i'th element in the results with the string we got |
| 458 // back from the callback function. | 464 // back from the callback function. |
| 459 res[i] = TO_STRING_INLINE(func_result); | 465 res[i] = TO_STRING_INLINE(func_result); |
| 460 match_start += elem.length; | 466 match_start += elem.length; |
| 461 } | 467 } |
| 462 } | 468 } |
| 463 } else { | 469 } else { |
| 464 var receiver = %GetDefaultReceiver(replace); | 470 var receiver = %GetDefaultReceiver(replace); |
| 465 for (var i = 0; i < len; i++) { | 471 for (var i = 0; i < len; i++) { |
| 466 var elem = res[i]; | 472 var elem = res[i]; |
| 467 if (!%_IsSmi(elem)) { | 473 if (!%_IsSmi(elem)) { |
| 468 // elem must be an Array. | 474 // elem must be an Array. |
| 469 // Use the apply argument as backing for global RegExp properties. | 475 // Use the apply argument as backing for global RegExp properties. |
| 470 lastMatchInfoOverride = elem; | 476 $regexpLastMatchInfoOverride = elem; |
| 471 var func_result = %Apply(replace, receiver, elem, 0, elem.length); | 477 var func_result = %Apply(replace, receiver, elem, 0, elem.length); |
| 472 // Overwrite the i'th element in the results with the string we got | 478 // Overwrite the i'th element in the results with the string we got |
| 473 // back from the callback function. | 479 // back from the callback function. |
| 474 res[i] = TO_STRING_INLINE(func_result); | 480 res[i] = TO_STRING_INLINE(func_result); |
| 475 } | 481 } |
| 476 } | 482 } |
| 477 } | 483 } |
| 478 var result = %StringBuilderConcat(res, res.length, subject); | 484 var result = %StringBuilderConcat(res, res.length, subject); |
| 479 resultArray.length = 0; | 485 resultArray.length = 0; |
| 480 reusableReplaceArray = resultArray; | 486 reusableReplaceArray = resultArray; |
| 481 return result; | 487 return result; |
| 482 } | 488 } |
| 483 | 489 |
| 484 | 490 |
| 485 function StringReplaceNonGlobalRegExpWithFunction(subject, regexp, replace) { | 491 function StringReplaceNonGlobalRegExpWithFunction(subject, regexp, replace) { |
| 486 var matchInfo = DoRegExpExec(regexp, subject, 0); | 492 var matchInfo = $regexpExec(regexp, subject, 0); |
| 487 if (IS_NULL(matchInfo)) { | 493 if (IS_NULL(matchInfo)) { |
| 488 regexp.lastIndex = 0; | 494 regexp.lastIndex = 0; |
| 489 return subject; | 495 return subject; |
| 490 } | 496 } |
| 491 var index = matchInfo[CAPTURE0]; | 497 var index = matchInfo[CAPTURE0]; |
| 492 var result = %_SubString(subject, 0, index); | 498 var result = %_SubString(subject, 0, index); |
| 493 var endOfMatch = matchInfo[CAPTURE1]; | 499 var endOfMatch = matchInfo[CAPTURE1]; |
| 494 // Compute the parameter list consisting of the match, captures, index, | 500 // Compute the parameter list consisting of the match, captures, index, |
| 495 // and subject for the replace function invocation. | 501 // and subject for the replace function invocation. |
| 496 // The number of captures plus one for the match. | 502 // The number of captures plus one for the match. |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 523 // ECMA-262 section 15.5.4.12 | 529 // ECMA-262 section 15.5.4.12 |
| 524 function StringSearch(re) { | 530 function StringSearch(re) { |
| 525 CHECK_OBJECT_COERCIBLE(this, "String.prototype.search"); | 531 CHECK_OBJECT_COERCIBLE(this, "String.prototype.search"); |
| 526 | 532 |
| 527 var regexp; | 533 var regexp; |
| 528 if (IS_STRING(re)) { | 534 if (IS_STRING(re)) { |
| 529 regexp = %_GetFromCache(STRING_TO_REGEXP_CACHE_ID, re); | 535 regexp = %_GetFromCache(STRING_TO_REGEXP_CACHE_ID, re); |
| 530 } else if (IS_REGEXP(re)) { | 536 } else if (IS_REGEXP(re)) { |
| 531 regexp = re; | 537 regexp = re; |
| 532 } else { | 538 } else { |
| 533 regexp = new $RegExp(re); | 539 regexp = new GlobalRegExp(re); |
| 534 } | 540 } |
| 535 var match = DoRegExpExec(regexp, TO_STRING_INLINE(this), 0); | 541 var match = $regexpExec(regexp, TO_STRING_INLINE(this), 0); |
| 536 if (match) { | 542 if (match) { |
| 537 return match[CAPTURE0]; | 543 return match[CAPTURE0]; |
| 538 } | 544 } |
| 539 return -1; | 545 return -1; |
| 540 } | 546 } |
| 541 | 547 |
| 542 | 548 |
| 543 // ECMA-262 section 15.5.4.13 | 549 // ECMA-262 section 15.5.4.13 |
| 544 function StringSlice(start, end) { | 550 function StringSlice(start, end) { |
| 545 CHECK_OBJECT_COERCIBLE(this, "String.prototype.slice"); | 551 CHECK_OBJECT_COERCIBLE(this, "String.prototype.slice"); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 611 | 617 |
| 612 if (limit === 0) return []; | 618 if (limit === 0) return []; |
| 613 | 619 |
| 614 // Separator is a regular expression. | 620 // Separator is a regular expression. |
| 615 return StringSplitOnRegExp(subject, separator, limit, length); | 621 return StringSplitOnRegExp(subject, separator, limit, length); |
| 616 } | 622 } |
| 617 | 623 |
| 618 | 624 |
| 619 function StringSplitOnRegExp(subject, separator, limit, length) { | 625 function StringSplitOnRegExp(subject, separator, limit, length) { |
| 620 if (length === 0) { | 626 if (length === 0) { |
| 621 if (DoRegExpExec(separator, subject, 0, 0) != null) { | 627 if ($regexpExec(separator, subject, 0, 0) != null) { |
| 622 return []; | 628 return []; |
| 623 } | 629 } |
| 624 return [subject]; | 630 return [subject]; |
| 625 } | 631 } |
| 626 | 632 |
| 627 var currentIndex = 0; | 633 var currentIndex = 0; |
| 628 var startIndex = 0; | 634 var startIndex = 0; |
| 629 var startMatch = 0; | 635 var startMatch = 0; |
| 630 var result = new InternalArray(); | 636 var result = new InternalArray(); |
| 631 | 637 |
| 632 outer_loop: | 638 outer_loop: |
| 633 while (true) { | 639 while (true) { |
| 634 | 640 |
| 635 if (startIndex === length) { | 641 if (startIndex === length) { |
| 636 result[result.length] = %_SubString(subject, currentIndex, length); | 642 result[result.length] = %_SubString(subject, currentIndex, length); |
| 637 break; | 643 break; |
| 638 } | 644 } |
| 639 | 645 |
| 640 var matchInfo = DoRegExpExec(separator, subject, startIndex); | 646 var matchInfo = $regexpExec(separator, subject, startIndex); |
| 641 if (matchInfo == null || length === (startMatch = matchInfo[CAPTURE0])) { | 647 if (matchInfo == null || length === (startMatch = matchInfo[CAPTURE0])) { |
| 642 result[result.length] = %_SubString(subject, currentIndex, length); | 648 result[result.length] = %_SubString(subject, currentIndex, length); |
| 643 break; | 649 break; |
| 644 } | 650 } |
| 645 var endIndex = matchInfo[CAPTURE1]; | 651 var endIndex = matchInfo[CAPTURE1]; |
| 646 | 652 |
| 647 // We ignore a zero-length match at the currentIndex. | 653 // We ignore a zero-length match at the currentIndex. |
| 648 if (startIndex === endIndex && endIndex === currentIndex) { | 654 if (startIndex === endIndex && endIndex === currentIndex) { |
| 649 startIndex++; | 655 startIndex++; |
| 650 continue; | 656 continue; |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 919 | 925 |
| 920 | 926 |
| 921 // ES6 draft, revision 26 (2014-07-18), section B.2.3.14 | 927 // ES6 draft, revision 26 (2014-07-18), section B.2.3.14 |
| 922 function StringSup() { | 928 function StringSup() { |
| 923 CHECK_OBJECT_COERCIBLE(this, "String.prototype.sup"); | 929 CHECK_OBJECT_COERCIBLE(this, "String.prototype.sup"); |
| 924 return "<sup>" + this + "</sup>"; | 930 return "<sup>" + this + "</sup>"; |
| 925 } | 931 } |
| 926 | 932 |
| 927 // ------------------------------------------------------------------- | 933 // ------------------------------------------------------------------- |
| 928 | 934 |
| 929 function SetUpString() { | 935 // Set the String function and constructor. |
| 930 %CheckIsBootstrapping(); | 936 %SetCode(GlobalString, StringConstructor); |
| 937 %FunctionSetPrototype(GlobalString, new GlobalString()); | |
| 931 | 938 |
| 932 // Set the String function and constructor. | 939 // Set up the constructor property on the String prototype object. |
| 933 %SetCode($String, StringConstructor); | 940 %AddNamedProperty(GlobalString.prototype, "constructor", GlobalString, DONT_ENUM ); |
|
Jakob Kummerow
2015/03/12 12:46:35
nit: 80col
| |
| 934 %FunctionSetPrototype($String, new $String()); | |
| 935 | 941 |
| 936 // Set up the constructor property on the String prototype object. | 942 // Set up the non-enumerable functions on the String object. |
| 937 %AddNamedProperty($String.prototype, "constructor", $String, DONT_ENUM); | 943 InstallFunctions(GlobalString, DONT_ENUM, $Array( |
|
Jakob Kummerow
2015/03/12 12:46:35
Why "$Array"? Other files use "var GlobalArray = g
| |
| 944 "fromCharCode", StringFromCharCode | |
| 945 )); | |
| 938 | 946 |
| 939 // Set up the non-enumerable functions on the String object. | 947 // Set up the non-enumerable functions on the String prototype object. |
| 940 InstallFunctions($String, DONT_ENUM, $Array( | 948 InstallFunctions(GlobalString.prototype, DONT_ENUM, $Array( |
| 941 "fromCharCode", StringFromCharCode | 949 "valueOf", StringValueOf, |
| 942 )); | 950 "toString", StringToString, |
| 951 "charAt", StringCharAt, | |
| 952 "charCodeAt", StringCharCodeAt, | |
| 953 "concat", StringConcat, | |
| 954 "indexOf", StringIndexOfJS, | |
| 955 "lastIndexOf", StringLastIndexOfJS, | |
| 956 "localeCompare", StringLocaleCompareJS, | |
| 957 "match", StringMatchJS, | |
| 958 "normalize", StringNormalizeJS, | |
| 959 "replace", StringReplace, | |
| 960 "search", StringSearch, | |
| 961 "slice", StringSlice, | |
| 962 "split", StringSplitJS, | |
| 963 "substring", StringSubstring, | |
| 964 "substr", StringSubstr, | |
| 965 "toLowerCase", StringToLowerCaseJS, | |
| 966 "toLocaleLowerCase", StringToLocaleLowerCase, | |
| 967 "toUpperCase", StringToUpperCaseJS, | |
| 968 "toLocaleUpperCase", StringToLocaleUpperCase, | |
| 969 "trim", StringTrimJS, | |
| 970 "trimLeft", StringTrimLeft, | |
| 971 "trimRight", StringTrimRight, | |
| 972 "link", StringLink, | |
| 973 "anchor", StringAnchor, | |
| 974 "fontcolor", StringFontcolor, | |
| 975 "fontsize", StringFontsize, | |
| 976 "big", StringBig, | |
| 977 "blink", StringBlink, | |
| 978 "bold", StringBold, | |
| 979 "fixed", StringFixed, | |
| 980 "italics", StringItalics, | |
| 981 "small", StringSmall, | |
| 982 "strike", StringStrike, | |
| 983 "sub", StringSub, | |
| 984 "sup", StringSup | |
| 985 )); | |
| 943 | 986 |
| 944 // Set up the non-enumerable functions on the String prototype object. | 987 $stringCharAt = StringCharAt; |
| 945 InstallFunctions($String.prototype, DONT_ENUM, $Array( | 988 $stringIndexOf = StringIndexOfJS; |
| 946 "valueOf", StringValueOf, | 989 $stringSubstring = StringSubstring; |
| 947 "toString", StringToString, | |
| 948 "charAt", StringCharAt, | |
| 949 "charCodeAt", StringCharCodeAt, | |
| 950 "concat", StringConcat, | |
| 951 "indexOf", StringIndexOfJS, | |
| 952 "lastIndexOf", StringLastIndexOfJS, | |
| 953 "localeCompare", StringLocaleCompareJS, | |
| 954 "match", StringMatchJS, | |
| 955 "normalize", StringNormalizeJS, | |
| 956 "replace", StringReplace, | |
| 957 "search", StringSearch, | |
| 958 "slice", StringSlice, | |
| 959 "split", StringSplitJS, | |
| 960 "substring", StringSubstring, | |
| 961 "substr", StringSubstr, | |
| 962 "toLowerCase", StringToLowerCaseJS, | |
| 963 "toLocaleLowerCase", StringToLocaleLowerCase, | |
| 964 "toUpperCase", StringToUpperCaseJS, | |
| 965 "toLocaleUpperCase", StringToLocaleUpperCase, | |
| 966 "trim", StringTrimJS, | |
| 967 "trimLeft", StringTrimLeft, | |
| 968 "trimRight", StringTrimRight, | |
| 969 "link", StringLink, | |
| 970 "anchor", StringAnchor, | |
| 971 "fontcolor", StringFontcolor, | |
| 972 "fontsize", StringFontsize, | |
| 973 "big", StringBig, | |
| 974 "blink", StringBlink, | |
| 975 "bold", StringBold, | |
| 976 "fixed", StringFixed, | |
| 977 "italics", StringItalics, | |
| 978 "small", StringSmall, | |
| 979 "strike", StringStrike, | |
| 980 "sub", StringSub, | |
| 981 "sup", StringSup | |
| 982 )); | |
| 983 } | |
| 984 | 990 |
| 985 SetUpString(); | 991 })(); |
| OLD | NEW |