Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/string.js

Issue 519061: Improve performance of Array.prototype.join and String.prototype.substring... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 10 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 if (num_c < 0) 498 if (num_c < 0)
499 num_c = 0; 499 num_c = 0;
500 500
501 return SubString(s, start_i, start_i + num_c); 501 return SubString(s, start_i, start_i + num_c);
502 } 502 }
503 503
504 504
505 // ECMA-262 section 15.5.4.14 505 // ECMA-262 section 15.5.4.14
506 function StringSplit(separator, limit) { 506 function StringSplit(separator, limit) {
507 var subject = ToString(this); 507 var subject = ToString(this);
508 limit = (limit === void 0) ? 0xffffffff : ToUint32(limit); 508 limit = (IS_UNDEFINED(limit)) ? 0xffffffff : TO_UINT32(limit);
509 if (limit === 0) return []; 509 if (limit === 0) return [];
510 510
511 // ECMA-262 says that if separator is undefined, the result should 511 // ECMA-262 says that if separator is undefined, the result should
512 // be an array of size 1 containing the entire string. SpiderMonkey 512 // be an array of size 1 containing the entire string. SpiderMonkey
513 // and KJS have this behaviour only when no separator is given. If 513 // and KJS have this behaviour only when no separator is given. If
514 // undefined is explicitly given, they convert it to a string and 514 // undefined is explicitly given, they convert it to a string and
515 // use that. We do as SpiderMonkey and KJS. 515 // use that. We do as SpiderMonkey and KJS.
516 if (%_ArgumentsLength() === 0) { 516 if (%_ArgumentsLength() === 0) {
517 return [subject]; 517 return [subject];
518 } 518 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 if (separatorIndex === -1) return null; 597 if (separatorIndex === -1) return null;
598 598
599 reusableMatchInfo[CAPTURE0] = separatorIndex; 599 reusableMatchInfo[CAPTURE0] = separatorIndex;
600 reusableMatchInfo[CAPTURE1] = separatorIndex + separator.length; 600 reusableMatchInfo[CAPTURE1] = separatorIndex + separator.length;
601 return reusableMatchInfo; 601 return reusableMatchInfo;
602 }; 602 };
603 603
604 604
605 // ECMA-262 section 15.5.4.15 605 // ECMA-262 section 15.5.4.15
606 function StringSubstring(start, end) { 606 function StringSubstring(start, end) {
607 var s = ToString(this); 607 var s = this;
608 if (!IS_STRING(s)) s = ToString(s);
608 var s_len = s.length; 609 var s_len = s.length;
610
609 var start_i = TO_INTEGER(start); 611 var start_i = TO_INTEGER(start);
612 if (start_i < 0) {
613 start_i = 0;
614 } else if (start_i > s_len) {
615 start_i = s_len;
616 }
617
610 var end_i = s_len; 618 var end_i = s_len;
611 if (!IS_UNDEFINED(end)) 619 if (!IS_UNDEFINED(end)) {
612 end_i = TO_INTEGER(end); 620 end_i = TO_INTEGER(end);
613 621 if (end_i > s_len) {
614 if (start_i < 0) start_i = 0; 622 end_i = s_len;
615 if (start_i > s_len) start_i = s_len; 623 } else {
616 if (end_i < 0) end_i = 0; 624 if (end_i < 0) end_i = 0;
617 if (end_i > s_len) end_i = s_len; 625 if (start_i > end_i) {
618 626 var tmp = end_i;
619 if (start_i > end_i) { 627 end_i = start_i;
620 var tmp = end_i; 628 start_i = tmp;
621 end_i = start_i; 629 }
622 start_i = tmp; 630 }
623 } 631 }
624 632
625 return SubString(s, start_i, end_i); 633 return SubString(s, start_i, end_i);
626 } 634 }
627 635
628 636
629 // This is not a part of ECMA-262. 637 // This is not a part of ECMA-262.
630 function StringSubstr(start, n) { 638 function StringSubstr(start, n) {
631 var s = ToString(this); 639 var s = ToString(this);
632 var len; 640 var len;
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 function StringSub() { 791 function StringSub() {
784 return "<sub>" + this + "</sub>"; 792 return "<sub>" + this + "</sub>";
785 } 793 }
786 794
787 795
788 function StringSup() { 796 function StringSup() {
789 return "<sup>" + this + "</sup>"; 797 return "<sup>" + this + "</sup>";
790 } 798 }
791 799
792 800
793 // StringBuilder support. 801 // ReplaceResultBuilder support.
794
795 function StringBuilder() {
796 this.elements = new $Array();
797 }
798
799
800 function ReplaceResultBuilder(str) { 802 function ReplaceResultBuilder(str) {
801 this.elements = new $Array(); 803 this.elements = new $Array();
802 this.special_string = str; 804 this.special_string = str;
803 } 805 }
804 806
805 807
806 ReplaceResultBuilder.prototype.add = 808 ReplaceResultBuilder.prototype.add = function(str) {
807 StringBuilder.prototype.add = function(str) {
808 if (!IS_STRING(str)) str = ToString(str); 809 if (!IS_STRING(str)) str = ToString(str);
809 if (str.length > 0) { 810 if (str.length > 0) {
810 var elements = this.elements; 811 var elements = this.elements;
811 elements[elements.length] = str; 812 elements[elements.length] = str;
812 } 813 }
813 } 814 }
814 815
815 816
816 ReplaceResultBuilder.prototype.addSpecialSlice = function(start, end) { 817 ReplaceResultBuilder.prototype.addSpecialSlice = function(start, end) {
817 var len = end - start; 818 var len = end - start;
818 if (len == 0) return; 819 if (len == 0) return;
819 var elements = this.elements; 820 var elements = this.elements;
820 if (start < 0x80000 && len < 0x800) { 821 if (start < 0x80000 && len < 0x800) {
821 elements[elements.length] = (start << 11) + len; 822 elements[elements.length] = (start << 11) + len;
822 } else { 823 } else {
823 // 0 < len <= String::kMaxLength and Smi::kMaxValue >= String::kMaxLength, 824 // 0 < len <= String::kMaxLength and Smi::kMaxValue >= String::kMaxLength,
824 // so -len is a smi. 825 // so -len is a smi.
825 elements[elements.length] = -len; 826 elements[elements.length] = -len;
826 elements[elements.length] = start; 827 elements[elements.length] = start;
827 } 828 }
828 } 829 }
829 830
830 831
831 StringBuilder.prototype.generate = function() {
832 return %StringBuilderConcat(this.elements, "");
833 }
834
835
836 ReplaceResultBuilder.prototype.generate = function() { 832 ReplaceResultBuilder.prototype.generate = function() {
837 return %StringBuilderConcat(this.elements, this.special_string); 833 var elements = this.elements;
834 return %StringBuilderConcat(elements, elements.length, this.special_string);
838 } 835 }
839 836
840 837
841 function StringToJSON(key) { 838 function StringToJSON(key) {
842 return CheckJSONPrimitive(this.valueOf()); 839 return CheckJSONPrimitive(this.valueOf());
843 } 840 }
844 841
845 842
846 // ------------------------------------------------------------------- 843 // -------------------------------------------------------------------
847 844
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 "small", StringSmall, 889 "small", StringSmall,
893 "strike", StringStrike, 890 "strike", StringStrike,
894 "sub", StringSub, 891 "sub", StringSub,
895 "sup", StringSup, 892 "sup", StringSup,
896 "toJSON", StringToJSON 893 "toJSON", StringToJSON
897 )); 894 ));
898 } 895 }
899 896
900 897
901 SetupString(); 898 SetupString();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698