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 (function(global, utils) { | 5 (function(global, utils) { |
6 | 6 |
7 %CheckIsBootstrapping(); | 7 %CheckIsBootstrapping(); |
8 | 8 |
9 // ------------------------------------------------------------------- | 9 // ------------------------------------------------------------------- |
10 // Imports | 10 // Imports |
11 | 11 |
12 var FLAG_harmony_tolength; | 12 var FLAG_harmony_tolength; |
13 var GlobalObject = global.Object; | 13 var GlobalObject = global.Object; |
14 var GlobalRegExp = global.RegExp; | 14 var GlobalRegExp = global.RegExp; |
| 15 var GlobalRegExpPrototype; |
15 var InternalArray = utils.InternalArray; | 16 var InternalArray = utils.InternalArray; |
16 var InternalPackedArray = utils.InternalPackedArray; | 17 var InternalPackedArray = utils.InternalPackedArray; |
17 var MakeTypeError; | 18 var MakeTypeError; |
18 var matchSymbol = utils.ImportNow("match_symbol"); | 19 var matchSymbol = utils.ImportNow("match_symbol"); |
19 var searchSymbol = utils.ImportNow("search_symbol"); | 20 var searchSymbol = utils.ImportNow("search_symbol"); |
20 var splitSymbol = utils.ImportNow("split_symbol"); | 21 var splitSymbol = utils.ImportNow("split_symbol"); |
21 | 22 |
22 utils.ImportFromExperimental(function(from) { | 23 utils.ImportFromExperimental(function(from) { |
23 FLAG_harmony_tolength = from.FLAG_harmony_tolength; | 24 FLAG_harmony_tolength = from.FLAG_harmony_tolength; |
24 }); | 25 }); |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 regexp_val = | 264 regexp_val = |
264 new GlobalRegExp( | 265 new GlobalRegExp( |
265 %_SubString(REGEXP_SOURCE(regexp), 2, REGEXP_SOURCE(regexp).length), | 266 %_SubString(REGEXP_SOURCE(regexp), 2, REGEXP_SOURCE(regexp).length), |
266 (REGEXP_IGNORE_CASE(regexp) ? REGEXP_MULTILINE(regexp) ? "im" : "i" | 267 (REGEXP_IGNORE_CASE(regexp) ? REGEXP_MULTILINE(regexp) ? "im" : "i" |
267 : REGEXP_MULTILINE(regexp) ? "m" : "")); | 268 : REGEXP_MULTILINE(regexp) ? "m" : "")); |
268 } | 269 } |
269 return regexp_val; | 270 return regexp_val; |
270 } | 271 } |
271 | 272 |
272 | 273 |
| 274 var kRegExpPrototypeToString = 12; |
| 275 |
273 function RegExpToString() { | 276 function RegExpToString() { |
274 if (!IS_REGEXP(this)) { | 277 if (!IS_REGEXP(this)) { |
| 278 // RegExp.prototype.toString() returns '/(?:)/' as a compatibility fix; |
| 279 // a UseCounter is incremented to track it. |
| 280 // TODO(littledan): Remove this workaround or standardize it |
| 281 if (this === GlobalRegExpPrototype) { |
| 282 %IncrementUseCounter(kRegExpPrototypeToString); |
| 283 return '/(?:)/'; |
| 284 } |
275 throw MakeTypeError(kIncompatibleMethodReceiver, | 285 throw MakeTypeError(kIncompatibleMethodReceiver, |
276 'RegExp.prototype.toString', this); | 286 'RegExp.prototype.toString', this); |
277 } | 287 } |
278 var result = '/' + REGEXP_SOURCE(this) + '/'; | 288 var result = '/' + REGEXP_SOURCE(this) + '/'; |
279 if (REGEXP_GLOBAL(this)) result += 'g'; | 289 if (REGEXP_GLOBAL(this)) result += 'g'; |
280 if (REGEXP_IGNORE_CASE(this)) result += 'i'; | 290 if (REGEXP_IGNORE_CASE(this)) result += 'i'; |
281 if (REGEXP_MULTILINE(this)) result += 'm'; | 291 if (REGEXP_MULTILINE(this)) result += 'm'; |
282 if (REGEXP_UNICODE(this)) result += 'u'; | 292 if (REGEXP_UNICODE(this)) result += 'u'; |
283 if (REGEXP_STICKY(this)) result += 'y'; | 293 if (REGEXP_STICKY(this)) result += 'y'; |
284 return result; | 294 return result; |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 throw MakeTypeError(kRegExpNonRegExp, "RegExp.prototype.source"); | 494 throw MakeTypeError(kRegExpNonRegExp, "RegExp.prototype.source"); |
485 } | 495 } |
486 return REGEXP_SOURCE(this); | 496 return REGEXP_SOURCE(this); |
487 } | 497 } |
488 %FunctionSetName(RegExpGetSource, "RegExp.prototype.source"); | 498 %FunctionSetName(RegExpGetSource, "RegExp.prototype.source"); |
489 %SetNativeFlag(RegExpGetSource); | 499 %SetNativeFlag(RegExpGetSource); |
490 | 500 |
491 // ------------------------------------------------------------------- | 501 // ------------------------------------------------------------------- |
492 | 502 |
493 %FunctionSetInstanceClassName(GlobalRegExp, 'RegExp'); | 503 %FunctionSetInstanceClassName(GlobalRegExp, 'RegExp'); |
494 %FunctionSetPrototype(GlobalRegExp, new GlobalObject()); | 504 GlobalRegExpPrototype = new GlobalObject(); |
| 505 %FunctionSetPrototype(GlobalRegExp, GlobalRegExpPrototype); |
495 %AddNamedProperty( | 506 %AddNamedProperty( |
496 GlobalRegExp.prototype, 'constructor', GlobalRegExp, DONT_ENUM); | 507 GlobalRegExp.prototype, 'constructor', GlobalRegExp, DONT_ENUM); |
497 %SetCode(GlobalRegExp, RegExpConstructor); | 508 %SetCode(GlobalRegExp, RegExpConstructor); |
498 | 509 |
499 utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [ | 510 utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [ |
500 "exec", RegExpExecJS, | 511 "exec", RegExpExecJS, |
501 "test", RegExpTest, | 512 "test", RegExpTest, |
502 "toString", RegExpToString, | 513 "toString", RegExpToString, |
503 "compile", RegExpCompileJS, | 514 "compile", RegExpCompileJS, |
504 matchSymbol, RegExpMatch, | 515 matchSymbol, RegExpMatch, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 // Exports | 574 // Exports |
564 | 575 |
565 utils.Export(function(to) { | 576 utils.Export(function(to) { |
566 to.RegExpExec = DoRegExpExec; | 577 to.RegExpExec = DoRegExpExec; |
567 to.RegExpExecNoTests = RegExpExecNoTests; | 578 to.RegExpExecNoTests = RegExpExecNoTests; |
568 to.RegExpLastMatchInfo = RegExpLastMatchInfo; | 579 to.RegExpLastMatchInfo = RegExpLastMatchInfo; |
569 to.RegExpTest = RegExpTest; | 580 to.RegExpTest = RegExpTest; |
570 }); | 581 }); |
571 | 582 |
572 }) | 583 }) |
OLD | NEW |