| OLD | NEW |
| 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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 // do anything locale specific. | 155 // do anything locale specific. |
| 156 function StringLocaleCompare(other) { | 156 function StringLocaleCompare(other) { |
| 157 if (%_ArgumentsLength() === 0) return 0; | 157 if (%_ArgumentsLength() === 0) return 0; |
| 158 | 158 |
| 159 var this_str = TO_STRING_INLINE(this); | 159 var this_str = TO_STRING_INLINE(this); |
| 160 var other_str = TO_STRING_INLINE(other); | 160 var other_str = TO_STRING_INLINE(other); |
| 161 return %StringLocaleCompare(this_str, other_str); | 161 return %StringLocaleCompare(this_str, other_str); |
| 162 } | 162 } |
| 163 | 163 |
| 164 | 164 |
| 165 var stringMatchCacheInput; |
| 166 var stringMatchCacheId; |
| 167 var stringMatchCacheResult; |
| 168 |
| 165 // ECMA-262 section 15.5.4.10 | 169 // ECMA-262 section 15.5.4.10 |
| 166 function StringMatch(regexp) { | 170 function StringMatch(regexp) { |
| 167 if (!IS_REGEXP(regexp)) regexp = new ORIGINAL_REGEXP(regexp); | 171 if (!IS_REGEXP(regexp)) regexp = new ORIGINAL_REGEXP(regexp); |
| 168 var subject = TO_STRING_INLINE(this); | 172 var subject = TO_STRING_INLINE(this); |
| 169 | 173 |
| 170 if (!regexp.global) return regexp.exec(subject); | 174 if (!regexp.global) return RegExpExec.call(regexp, subject); |
| 171 %_Log('regexp', 'regexp-match,%0S,%1r', [subject, regexp]); | 175 %_Log('regexp', 'regexp-match,%0S,%1r', [subject, regexp]); |
| 176 |
| 177 var reid = %_RegExpId(regexp); |
| 178 if (%_IsIdentical(reid, stringMatchCacheId) && |
| 179 %_IsIdentical(this, stringMatchCacheInput)) { |
| 180 %_Log("regexp", "regexp-match-cache-hit", []); |
| 181 var cachedResult = stringMatchCacheResult; |
| 182 if (cachedResult) { |
| 183 cachedResult = ArraySlice.call(cachedResult, 0, cachedResult.length); |
| 184 } |
| 185 return cachedResult; |
| 186 } |
| 187 %_Log("regexp", "regexp-match-cache-miss", []); |
| 188 |
| 172 // lastMatchInfo is defined in regexp-delay.js. | 189 // lastMatchInfo is defined in regexp-delay.js. |
| 173 return %StringMatch(subject, regexp, lastMatchInfo); | 190 var result = %StringMatch(subject, regexp, lastMatchInfo); |
| 191 stringMatchCacheInput = this; |
| 192 stringMatchCacheId = reid; |
| 193 stringMatchCacheResult = result; |
| 194 return result; |
| 174 } | 195 } |
| 175 | 196 |
| 176 | 197 |
| 177 // SubString is an internal function that returns the sub string of 'string'. | 198 // SubString is an internal function that returns the sub string of 'string'. |
| 178 // If resulting string is of length 1, we use the one character cache | 199 // If resulting string is of length 1, we use the one character cache |
| 179 // otherwise we call the runtime system. | 200 // otherwise we call the runtime system. |
| 180 function SubString(string, start, end) { | 201 function SubString(string, start, end) { |
| 181 // Use the one character string cache. | 202 // Use the one character string cache. |
| 182 if (start + 1 == end) { | 203 if (start + 1 == end) { |
| 183 var char_code = %_FastCharCodeAt(string, start); | 204 var char_code = %_FastCharCodeAt(string, start); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 ExpandReplacement(replace, subject, reusableMatchInfo, builder); | 253 ExpandReplacement(replace, subject, reusableMatchInfo, builder); |
| 233 } | 254 } |
| 234 | 255 |
| 235 // suffix | 256 // suffix |
| 236 builder.addSpecialSlice(end, subject.length); | 257 builder.addSpecialSlice(end, subject.length); |
| 237 | 258 |
| 238 return builder.generate(); | 259 return builder.generate(); |
| 239 } | 260 } |
| 240 | 261 |
| 241 | 262 |
| 263 var stringReplaceRegExpCacheInput; |
| 264 var stringReplaceRegExpCacheId; |
| 265 var stringReplaceRegExpCacheIndex; |
| 266 var stringReplaceRegExpCacheReplace; |
| 267 var stringReplaceRegExpCacheResult; |
| 242 // Helper function for regular expressions in String.prototype.replace. | 268 // Helper function for regular expressions in String.prototype.replace. |
| 243 function StringReplaceRegExp(subject, regexp, replace) { | 269 function StringReplaceRegExp(subject, regexp, replace) { |
| 270 if (%_IsIdentical(%_RegExpId(regexp), stringReplaceRegExpCacheId) && |
| 271 %_IsIdentical(subject, stringReplaceRegExpCacheInput) && |
| 272 %_IsIdentical(replace, stringReplaceRegExpCacheReplace) && |
| 273 (!regexp.global || |
| 274 %_IsIdentical(regexp.lastIndex, stringReplaceRegExpCacheIndex))) { |
| 275 %_Log("regexp", "regexp-replace-cache-hit", []); |
| 276 return stringReplaceRegExpCacheResult; |
| 277 } |
| 278 %_Log("regexp", "regexp-replace-cache-miss", []); |
| 279 stringReplaceRegExpCacheId = %_RegExpId(regexp); |
| 280 stringReplaceRegExpCacheInput = subject; |
| 281 stringReplaceRegExpCacheIndex = regexp.lastIndex; |
| 282 stringReplaceRegExpCacheReplace = replace; |
| 244 replace = TO_STRING_INLINE(replace); | 283 replace = TO_STRING_INLINE(replace); |
| 245 return %StringReplaceRegExpWithString(subject, | 284 var result = %StringReplaceRegExpWithString(subject, |
| 246 regexp, | 285 regexp, |
| 247 replace, | 286 replace, |
| 248 lastMatchInfo); | 287 lastMatchInfo); |
| 288 stringReplaceRegExpCacheResult = result; |
| 289 return result; |
| 249 }; | 290 }; |
| 250 | 291 |
| 251 | 292 |
| 252 // Expand the $-expressions in the string and return a new string with | 293 // Expand the $-expressions in the string and return a new string with |
| 253 // the result. | 294 // the result. |
| 254 function ExpandReplacement(string, subject, matchInfo, builder) { | 295 function ExpandReplacement(string, subject, matchInfo, builder) { |
| 255 var next = %StringIndexOf(string, '$', 0); | 296 var next = %StringIndexOf(string, '$', 0); |
| 256 if (next < 0) { | 297 if (next < 0) { |
| 257 builder.add(string); | 298 builder.add(string); |
| 258 return; | 299 return; |
| (...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 904 "small", StringSmall, | 945 "small", StringSmall, |
| 905 "strike", StringStrike, | 946 "strike", StringStrike, |
| 906 "sub", StringSub, | 947 "sub", StringSub, |
| 907 "sup", StringSup, | 948 "sup", StringSup, |
| 908 "toJSON", StringToJSON | 949 "toJSON", StringToJSON |
| 909 )); | 950 )); |
| 910 } | 951 } |
| 911 | 952 |
| 912 | 953 |
| 913 SetupString(); | 954 SetupString(); |
| OLD | NEW |