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

Side by Side Diff: src/regexp.js

Issue 1154743003: Revert of Hook up more import/exports in natives. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 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
« no previous file with comments | « src/proxy.js ('k') | src/string.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 var $regexpExec;
6 var $regexpExecNoTests;
7 var $regexpLastMatchInfo;
5 var $regexpLastMatchInfoOverride; 8 var $regexpLastMatchInfoOverride;
6 var harmony_regexps = false; 9 var harmony_regexps = false;
7 var harmony_unicode_regexps = false; 10 var harmony_unicode_regexps = false;
8 11
9 (function(global, utils) { 12 (function(global, utils) {
10 13
11 %CheckIsBootstrapping(); 14 %CheckIsBootstrapping();
12 15
13 // ------------------------------------------------------------------- 16 // -------------------------------------------------------------------
14 // Imports 17 // Imports
15 18
16 var GlobalRegExp = global.RegExp; 19 var GlobalRegExp = global.RegExp;
17 var InternalPackedArray = utils.InternalPackedArray; 20 var InternalPackedArray = utils.InternalPackedArray;
18 21
19 // ------------------------------------------------------------------- 22 // -------------------------------------------------------------------
20 23
21 // Property of the builtins object for recording the result of the last 24 // Property of the builtins object for recording the result of the last
22 // regexp match. The property RegExpLastMatchInfo includes the matchIndices 25 // regexp match. The property $regexpLastMatchInfo includes the matchIndices
23 // array of the last successful regexp match (an array of start/end index 26 // array of the last successful regexp match (an array of start/end index
24 // pairs for the match and all the captured substrings), the invariant is 27 // pairs for the match and all the captured substrings), the invariant is
25 // that there are at least two capture indeces. The array also contains 28 // that there are at least two capture indeces. The array also contains
26 // the subject string for the last successful match. 29 // the subject string for the last successful match.
27 var RegExpLastMatchInfo = new InternalPackedArray( 30 $regexpLastMatchInfo = new InternalPackedArray(
28 2, // REGEXP_NUMBER_OF_CAPTURES 31 2, // REGEXP_NUMBER_OF_CAPTURES
29 "", // Last subject. 32 "", // Last subject.
30 UNDEFINED, // Last input - settable with RegExpSetInput. 33 UNDEFINED, // Last input - settable with RegExpSetInput.
31 0, // REGEXP_FIRST_CAPTURE + 0 34 0, // REGEXP_FIRST_CAPTURE + 0
32 0 // REGEXP_FIRST_CAPTURE + 1 35 0 // REGEXP_FIRST_CAPTURE + 1
33 ); 36 );
34 37
35 // Override last match info with an array of actual substrings. 38 // Override last match info with an array of actual substrings.
36 // Used internally by replace regexp with function. 39 // Used internally by replace regexp with function.
37 // The array has the format of an "apply" argument for a replacement 40 // The array has the format of an "apply" argument for a replacement
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 } 97 }
95 if (IS_UNDEFINED(pattern) && %_ArgumentsLength() != 0) { 98 if (IS_UNDEFINED(pattern) && %_ArgumentsLength() != 0) {
96 DoConstructRegExp(this, 'undefined', flags); 99 DoConstructRegExp(this, 'undefined', flags);
97 } else { 100 } else {
98 DoConstructRegExp(this, pattern, flags); 101 DoConstructRegExp(this, pattern, flags);
99 } 102 }
100 } 103 }
101 104
102 105
103 function DoRegExpExec(regexp, string, index) { 106 function DoRegExpExec(regexp, string, index) {
104 var result = %_RegExpExec(regexp, string, index, RegExpLastMatchInfo); 107 var result = %_RegExpExec(regexp, string, index, $regexpLastMatchInfo);
105 if (result !== null) $regexpLastMatchInfoOverride = null; 108 if (result !== null) $regexpLastMatchInfoOverride = null;
106 return result; 109 return result;
107 } 110 }
108 111
109 112
110 // This is kind of performance sensitive, so we want to avoid unnecessary 113 // This is kind of performance sensitive, so we want to avoid unnecessary
111 // type checks on inputs. But we also don't want to inline it several times 114 // type checks on inputs. But we also don't want to inline it several times
112 // manually, so we use a macro :-) 115 // manually, so we use a macro :-)
113 macro RETURN_NEW_RESULT_FROM_MATCH_INFO(MATCHINFO, STRING) 116 macro RETURN_NEW_RESULT_FROM_MATCH_INFO(MATCHINFO, STRING)
114 var numResults = NUMBER_OF_CAPTURES(MATCHINFO) >> 1; 117 var numResults = NUMBER_OF_CAPTURES(MATCHINFO) >> 1;
(...skipping 13 matching lines...) Expand all
128 result[i] = %_SubString(STRING, start, end); 131 result[i] = %_SubString(STRING, start, end);
129 } 132 }
130 j++; 133 j++;
131 } 134 }
132 return result; 135 return result;
133 endmacro 136 endmacro
134 137
135 138
136 function RegExpExecNoTests(regexp, string, start) { 139 function RegExpExecNoTests(regexp, string, start) {
137 // Must be called with RegExp, string and positive integer as arguments. 140 // Must be called with RegExp, string and positive integer as arguments.
138 var matchInfo = %_RegExpExec(regexp, string, start, RegExpLastMatchInfo); 141 var matchInfo = %_RegExpExec(regexp, string, start, $regexpLastMatchInfo);
139 if (matchInfo !== null) { 142 if (matchInfo !== null) {
140 $regexpLastMatchInfoOverride = null; 143 $regexpLastMatchInfoOverride = null;
141 RETURN_NEW_RESULT_FROM_MATCH_INFO(matchInfo, string); 144 RETURN_NEW_RESULT_FROM_MATCH_INFO(matchInfo, string);
142 } 145 }
143 regexp.lastIndex = 0; 146 regexp.lastIndex = 0;
144 return null; 147 return null;
145 } 148 }
146 149
147 150
148 function RegExpExecJS(string) { 151 function RegExpExecJS(string) {
(...skipping 12 matching lines...) Expand all
161 var updateLastIndex = this.global || (harmony_regexps && this.sticky); 164 var updateLastIndex = this.global || (harmony_regexps && this.sticky);
162 if (updateLastIndex) { 165 if (updateLastIndex) {
163 if (i < 0 || i > string.length) { 166 if (i < 0 || i > string.length) {
164 this.lastIndex = 0; 167 this.lastIndex = 0;
165 return null; 168 return null;
166 } 169 }
167 } else { 170 } else {
168 i = 0; 171 i = 0;
169 } 172 }
170 173
171 // matchIndices is either null or the RegExpLastMatchInfo array. 174 // matchIndices is either null or the $regexpLastMatchInfo array.
172 var matchIndices = %_RegExpExec(this, string, i, RegExpLastMatchInfo); 175 var matchIndices = %_RegExpExec(this, string, i, $regexpLastMatchInfo);
173 176
174 if (IS_NULL(matchIndices)) { 177 if (IS_NULL(matchIndices)) {
175 this.lastIndex = 0; 178 this.lastIndex = 0;
176 return null; 179 return null;
177 } 180 }
178 181
179 // Successful match. 182 // Successful match.
180 $regexpLastMatchInfoOverride = null; 183 $regexpLastMatchInfoOverride = null;
181 if (updateLastIndex) { 184 if (updateLastIndex) {
182 this.lastIndex = RegExpLastMatchInfo[CAPTURE1]; 185 this.lastIndex = $regexpLastMatchInfo[CAPTURE1];
183 } 186 }
184 RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string); 187 RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string);
185 } 188 }
186 189
187 190
188 // One-element cache for the simplified test regexp. 191 // One-element cache for the simplified test regexp.
189 var regexp_key; 192 var regexp_key;
190 var regexp_val; 193 var regexp_val;
191 194
192 // Section 15.10.6.3 doesn't actually make sense, but the intention seems to be 195 // Section 15.10.6.3 doesn't actually make sense, but the intention seems to be
(...skipping 11 matching lines...) Expand all
204 207
205 // Conversion is required by the ES5 specification (RegExp.prototype.exec 208 // Conversion is required by the ES5 specification (RegExp.prototype.exec
206 // algorithm, step 5) even if the value is discarded for non-global RegExps. 209 // algorithm, step 5) even if the value is discarded for non-global RegExps.
207 var i = TO_INTEGER(lastIndex); 210 var i = TO_INTEGER(lastIndex);
208 211
209 if (this.global || (harmony_regexps && this.sticky)) { 212 if (this.global || (harmony_regexps && this.sticky)) {
210 if (i < 0 || i > string.length) { 213 if (i < 0 || i > string.length) {
211 this.lastIndex = 0; 214 this.lastIndex = 0;
212 return false; 215 return false;
213 } 216 }
214 // matchIndices is either null or the RegExpLastMatchInfo array. 217 // matchIndices is either null or the $regexpLastMatchInfo array.
215 var matchIndices = %_RegExpExec(this, string, i, RegExpLastMatchInfo); 218 var matchIndices = %_RegExpExec(this, string, i, $regexpLastMatchInfo);
216 if (IS_NULL(matchIndices)) { 219 if (IS_NULL(matchIndices)) {
217 this.lastIndex = 0; 220 this.lastIndex = 0;
218 return false; 221 return false;
219 } 222 }
220 $regexpLastMatchInfoOverride = null; 223 $regexpLastMatchInfoOverride = null;
221 this.lastIndex = RegExpLastMatchInfo[CAPTURE1]; 224 this.lastIndex = $regexpLastMatchInfo[CAPTURE1];
222 return true; 225 return true;
223 } else { 226 } else {
224 // Non-global, non-sticky regexp. 227 // Non-global, non-sticky regexp.
225 // Remove irrelevant preceeding '.*' in a test regexp. The expression 228 // Remove irrelevant preceeding '.*' in a test regexp. The expression
226 // checks whether this.source starts with '.*' and that the third char is 229 // checks whether this.source starts with '.*' and that the third char is
227 // not a '?'. But see https://code.google.com/p/v8/issues/detail?id=3560 230 // not a '?'. But see https://code.google.com/p/v8/issues/detail?id=3560
228 var regexp = this; 231 var regexp = this;
229 if (regexp.source.length >= 3 && 232 if (regexp.source.length >= 3 &&
230 %_StringCharCodeAt(regexp.source, 0) == 46 && // '.' 233 %_StringCharCodeAt(regexp.source, 0) == 46 && // '.'
231 %_StringCharCodeAt(regexp.source, 1) == 42 && // '*' 234 %_StringCharCodeAt(regexp.source, 1) == 42 && // '*'
232 %_StringCharCodeAt(regexp.source, 2) != 63) { // '?' 235 %_StringCharCodeAt(regexp.source, 2) != 63) { // '?'
233 regexp = TrimRegExp(regexp); 236 regexp = TrimRegExp(regexp);
234 } 237 }
235 // matchIndices is either null or the RegExpLastMatchInfo array. 238 // matchIndices is either null or the $regexpLastMatchInfo array.
236 var matchIndices = %_RegExpExec(regexp, string, 0, RegExpLastMatchInfo); 239 var matchIndices = %_RegExpExec(regexp, string, 0, $regexpLastMatchInfo);
237 if (IS_NULL(matchIndices)) { 240 if (IS_NULL(matchIndices)) {
238 this.lastIndex = 0; 241 this.lastIndex = 0;
239 return false; 242 return false;
240 } 243 }
241 $regexpLastMatchInfoOverride = null; 244 $regexpLastMatchInfoOverride = null;
242 return true; 245 return true;
243 } 246 }
244 } 247 }
245 248
246 function TrimRegExp(regexp) { 249 function TrimRegExp(regexp) {
(...skipping 24 matching lines...) Expand all
271 274
272 275
273 // Getters for the static properties lastMatch, lastParen, leftContext, and 276 // Getters for the static properties lastMatch, lastParen, leftContext, and
274 // rightContext of the RegExp constructor. The properties are computed based 277 // rightContext of the RegExp constructor. The properties are computed based
275 // on the captures array of the last successful match and the subject string 278 // on the captures array of the last successful match and the subject string
276 // of the last successful match. 279 // of the last successful match.
277 function RegExpGetLastMatch() { 280 function RegExpGetLastMatch() {
278 if ($regexpLastMatchInfoOverride !== null) { 281 if ($regexpLastMatchInfoOverride !== null) {
279 return OVERRIDE_MATCH($regexpLastMatchInfoOverride); 282 return OVERRIDE_MATCH($regexpLastMatchInfoOverride);
280 } 283 }
281 var regExpSubject = LAST_SUBJECT(RegExpLastMatchInfo); 284 var regExpSubject = LAST_SUBJECT($regexpLastMatchInfo);
282 return %_SubString(regExpSubject, 285 return %_SubString(regExpSubject,
283 RegExpLastMatchInfo[CAPTURE0], 286 $regexpLastMatchInfo[CAPTURE0],
284 RegExpLastMatchInfo[CAPTURE1]); 287 $regexpLastMatchInfo[CAPTURE1]);
285 } 288 }
286 289
287 290
288 function RegExpGetLastParen() { 291 function RegExpGetLastParen() {
289 if ($regexpLastMatchInfoOverride) { 292 if ($regexpLastMatchInfoOverride) {
290 var override = $regexpLastMatchInfoOverride; 293 var override = $regexpLastMatchInfoOverride;
291 if (override.length <= 3) return ''; 294 if (override.length <= 3) return '';
292 return override[override.length - 3]; 295 return override[override.length - 3];
293 } 296 }
294 var length = NUMBER_OF_CAPTURES(RegExpLastMatchInfo); 297 var length = NUMBER_OF_CAPTURES($regexpLastMatchInfo);
295 if (length <= 2) return ''; // There were no captures. 298 if (length <= 2) return ''; // There were no captures.
296 // We match the SpiderMonkey behavior: return the substring defined by the 299 // We match the SpiderMonkey behavior: return the substring defined by the
297 // last pair (after the first pair) of elements of the capture array even if 300 // last pair (after the first pair) of elements of the capture array even if
298 // it is empty. 301 // it is empty.
299 var regExpSubject = LAST_SUBJECT(RegExpLastMatchInfo); 302 var regExpSubject = LAST_SUBJECT($regexpLastMatchInfo);
300 var start = RegExpLastMatchInfo[CAPTURE(length - 2)]; 303 var start = $regexpLastMatchInfo[CAPTURE(length - 2)];
301 var end = RegExpLastMatchInfo[CAPTURE(length - 1)]; 304 var end = $regexpLastMatchInfo[CAPTURE(length - 1)];
302 if (start != -1 && end != -1) { 305 if (start != -1 && end != -1) {
303 return %_SubString(regExpSubject, start, end); 306 return %_SubString(regExpSubject, start, end);
304 } 307 }
305 return ""; 308 return "";
306 } 309 }
307 310
308 311
309 function RegExpGetLeftContext() { 312 function RegExpGetLeftContext() {
310 var start_index; 313 var start_index;
311 var subject; 314 var subject;
312 if (!$regexpLastMatchInfoOverride) { 315 if (!$regexpLastMatchInfoOverride) {
313 start_index = RegExpLastMatchInfo[CAPTURE0]; 316 start_index = $regexpLastMatchInfo[CAPTURE0];
314 subject = LAST_SUBJECT(RegExpLastMatchInfo); 317 subject = LAST_SUBJECT($regexpLastMatchInfo);
315 } else { 318 } else {
316 var override = $regexpLastMatchInfoOverride; 319 var override = $regexpLastMatchInfoOverride;
317 start_index = OVERRIDE_POS(override); 320 start_index = OVERRIDE_POS(override);
318 subject = OVERRIDE_SUBJECT(override); 321 subject = OVERRIDE_SUBJECT(override);
319 } 322 }
320 return %_SubString(subject, 0, start_index); 323 return %_SubString(subject, 0, start_index);
321 } 324 }
322 325
323 326
324 function RegExpGetRightContext() { 327 function RegExpGetRightContext() {
325 var start_index; 328 var start_index;
326 var subject; 329 var subject;
327 if (!$regexpLastMatchInfoOverride) { 330 if (!$regexpLastMatchInfoOverride) {
328 start_index = RegExpLastMatchInfo[CAPTURE1]; 331 start_index = $regexpLastMatchInfo[CAPTURE1];
329 subject = LAST_SUBJECT(RegExpLastMatchInfo); 332 subject = LAST_SUBJECT($regexpLastMatchInfo);
330 } else { 333 } else {
331 var override = $regexpLastMatchInfoOverride; 334 var override = $regexpLastMatchInfoOverride;
332 subject = OVERRIDE_SUBJECT(override); 335 subject = OVERRIDE_SUBJECT(override);
333 var match = OVERRIDE_MATCH(override); 336 var match = OVERRIDE_MATCH(override);
334 start_index = OVERRIDE_POS(override) + match.length; 337 start_index = OVERRIDE_POS(override) + match.length;
335 } 338 }
336 return %_SubString(subject, start_index, subject.length); 339 return %_SubString(subject, start_index, subject.length);
337 } 340 }
338 341
339 342
340 // The properties $1..$9 are the first nine capturing substrings of the last 343 // The properties $1..$9 are the first nine capturing substrings of the last
341 // successful match, or ''. The function RegExpMakeCaptureGetter will be 344 // successful match, or ''. The function RegExpMakeCaptureGetter will be
342 // called with indices from 1 to 9. 345 // called with indices from 1 to 9.
343 function RegExpMakeCaptureGetter(n) { 346 function RegExpMakeCaptureGetter(n) {
344 return function foo() { 347 return function foo() {
345 if ($regexpLastMatchInfoOverride) { 348 if ($regexpLastMatchInfoOverride) {
346 if (n < $regexpLastMatchInfoOverride.length - 2) { 349 if (n < $regexpLastMatchInfoOverride.length - 2) {
347 return OVERRIDE_CAPTURE($regexpLastMatchInfoOverride, n); 350 return OVERRIDE_CAPTURE($regexpLastMatchInfoOverride, n);
348 } 351 }
349 return ''; 352 return '';
350 } 353 }
351 var index = n * 2; 354 var index = n * 2;
352 if (index >= NUMBER_OF_CAPTURES(RegExpLastMatchInfo)) return ''; 355 if (index >= NUMBER_OF_CAPTURES($regexpLastMatchInfo)) return '';
353 var matchStart = RegExpLastMatchInfo[CAPTURE(index)]; 356 var matchStart = $regexpLastMatchInfo[CAPTURE(index)];
354 var matchEnd = RegExpLastMatchInfo[CAPTURE(index + 1)]; 357 var matchEnd = $regexpLastMatchInfo[CAPTURE(index + 1)];
355 if (matchStart == -1 || matchEnd == -1) return ''; 358 if (matchStart == -1 || matchEnd == -1) return '';
356 return %_SubString(LAST_SUBJECT(RegExpLastMatchInfo), matchStart, matchEnd); 359 return %_SubString(LAST_SUBJECT($regexpLastMatchInfo), matchStart, matchEnd) ;
357 }; 360 };
358 } 361 }
359 362
360 // ------------------------------------------------------------------- 363 // -------------------------------------------------------------------
361 364
362 %FunctionSetInstanceClassName(GlobalRegExp, 'RegExp'); 365 %FunctionSetInstanceClassName(GlobalRegExp, 'RegExp');
363 %AddNamedProperty( 366 %AddNamedProperty(
364 GlobalRegExp.prototype, 'constructor', GlobalRegExp, DONT_ENUM); 367 GlobalRegExp.prototype, 'constructor', GlobalRegExp, DONT_ENUM);
365 %SetCode(GlobalRegExp, RegExpConstructor); 368 %SetCode(GlobalRegExp, RegExpConstructor);
366 369
367 utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [ 370 $installFunctions(GlobalRegExp.prototype, DONT_ENUM, [
368 "exec", RegExpExecJS, 371 "exec", RegExpExecJS,
369 "test", RegExpTest, 372 "test", RegExpTest,
370 "toString", RegExpToString, 373 "toString", RegExpToString,
371 "compile", RegExpCompileJS 374 "compile", RegExpCompileJS
372 ]); 375 ]);
373 376
374 // The length of compile is 1 in SpiderMonkey. 377 // The length of compile is 1 in SpiderMonkey.
375 %FunctionSetLength(GlobalRegExp.prototype.compile, 1); 378 %FunctionSetLength(GlobalRegExp.prototype.compile, 1);
376 379
377 // The properties `input` and `$_` are aliases for each other. When this 380 // The properties `input` and `$_` are aliases for each other. When this
378 // value is set the value it is set to is coerced to a string. 381 // value is set the value it is set to is coerced to a string.
379 // Getter and setter for the input. 382 // Getter and setter for the input.
380 var RegExpGetInput = function() { 383 var RegExpGetInput = function() {
381 var regExpInput = LAST_INPUT(RegExpLastMatchInfo); 384 var regExpInput = LAST_INPUT($regexpLastMatchInfo);
382 return IS_UNDEFINED(regExpInput) ? "" : regExpInput; 385 return IS_UNDEFINED(regExpInput) ? "" : regExpInput;
383 }; 386 };
384 var RegExpSetInput = function(string) { 387 var RegExpSetInput = function(string) {
385 LAST_INPUT(RegExpLastMatchInfo) = $toString(string); 388 LAST_INPUT($regexpLastMatchInfo) = $toString(string);
386 }; 389 };
387 390
388 %OptimizeObjectForAddingMultipleProperties(GlobalRegExp, 22); 391 %OptimizeObjectForAddingMultipleProperties(GlobalRegExp, 22);
389 %DefineAccessorPropertyUnchecked(GlobalRegExp, 'input', RegExpGetInput, 392 %DefineAccessorPropertyUnchecked(GlobalRegExp, 'input', RegExpGetInput,
390 RegExpSetInput, DONT_DELETE); 393 RegExpSetInput, DONT_DELETE);
391 %DefineAccessorPropertyUnchecked(GlobalRegExp, '$_', RegExpGetInput, 394 %DefineAccessorPropertyUnchecked(GlobalRegExp, '$_', RegExpGetInput,
392 RegExpSetInput, DONT_ENUM | DONT_DELETE); 395 RegExpSetInput, DONT_ENUM | DONT_DELETE);
393 396
394 // The properties multiline and $* are aliases for each other. When this 397 // The properties multiline and $* are aliases for each other. When this
395 // value is set in SpiderMonkey, the value it is set to is coerced to a 398 // value is set in SpiderMonkey, the value it is set to is coerced to a
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 %DefineAccessorPropertyUnchecked(GlobalRegExp, "$'", RegExpGetRightContext, 436 %DefineAccessorPropertyUnchecked(GlobalRegExp, "$'", RegExpGetRightContext,
434 NoOpSetter, DONT_ENUM | DONT_DELETE); 437 NoOpSetter, DONT_ENUM | DONT_DELETE);
435 438
436 for (var i = 1; i < 10; ++i) { 439 for (var i = 1; i < 10; ++i) {
437 %DefineAccessorPropertyUnchecked(GlobalRegExp, '$' + i, 440 %DefineAccessorPropertyUnchecked(GlobalRegExp, '$' + i,
438 RegExpMakeCaptureGetter(i), NoOpSetter, 441 RegExpMakeCaptureGetter(i), NoOpSetter,
439 DONT_DELETE); 442 DONT_DELETE);
440 } 443 }
441 %ToFastProperties(GlobalRegExp); 444 %ToFastProperties(GlobalRegExp);
442 445
443 // ------------------------------------------------------------------- 446 $regexpExecNoTests = RegExpExecNoTests;
444 // Exports 447 $regexpExec = DoRegExpExec;
445
446 utils.Export(function(to) {
447 to.RegExpExec = DoRegExpExec;
448 to.RegExpExecNoTests = RegExpExecNoTests;
449 to.RegExpLastMatchInfo = RegExpLastMatchInfo;
450 });
451 448
452 }) 449 })
OLDNEW
« no previous file with comments | « src/proxy.js ('k') | src/string.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698