@@ -12,6 +12,7 @@ var fails = require('../internals/fails');
12
12
var enforceInternalState = require ( '../internals/internal-state' ) . enforce ;
13
13
var setSpecies = require ( '../internals/set-species' ) ;
14
14
var wellKnownSymbol = require ( '../internals/well-known-symbol' ) ;
15
+ var UNSUPPORTED_DOT_ALL = require ( '../internals/regexp-unsupported-dot-all' ) ;
15
16
16
17
var MATCH = wellKnownSymbol ( 'match' ) ;
17
18
var NativeRegExp = global . RegExp ;
@@ -24,20 +25,44 @@ var CORRECT_NEW = new NativeRegExp(re1) !== re1;
24
25
25
26
var UNSUPPORTED_Y = stickyHelpers . UNSUPPORTED_Y ;
26
27
27
- var FORCED = DESCRIPTORS && isForced ( 'RegExp' , ( ! CORRECT_NEW || UNSUPPORTED_Y || fails ( function ( ) {
28
+ var BASE_FORCED = DESCRIPTORS && ! CORRECT_NEW || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || fails ( function ( ) {
28
29
re2 [ MATCH ] = false ;
29
30
// RegExp constructor can alter flags and IsRegExp works correct with @@match
30
31
return NativeRegExp ( re1 ) != re1 || NativeRegExp ( re2 ) == re2 || NativeRegExp ( re1 , 'i' ) != '/a/i' ;
31
- } ) ) ) ;
32
+ } ) ;
33
+
34
+ var deDotAll = function ( string ) {
35
+ var result = '' ;
36
+ var index = 0 ;
37
+ var length = string . length ;
38
+ var brackets = false ;
39
+ var chr ;
40
+ for ( ; index <= length ; index ++ ) {
41
+ chr = string . charAt ( index ) ;
42
+ if ( chr === '\\' ) {
43
+ result += chr + string . charAt ( ++ index ) ;
44
+ continue ;
45
+ }
46
+ if ( ! brackets && chr === '.' ) {
47
+ result += '[\\s\\S]' ;
48
+ } else {
49
+ if ( chr === '[' ) {
50
+ brackets = true ;
51
+ } else if ( chr === ']' ) {
52
+ brackets = false ;
53
+ } result += chr ;
54
+ }
55
+ } return result ;
56
+ } ;
32
57
33
58
// `RegExp` constructor
34
59
// https://tc39.es/ecma262/#sec-regexp-constructor
35
- if ( FORCED ) {
60
+ if ( isForced ( 'RegExp' , BASE_FORCED ) ) {
36
61
var RegExpWrapper = function RegExp ( pattern , flags ) {
37
62
var thisIsRegExp = this instanceof RegExpWrapper ;
38
63
var patternIsRegExp = isRegExp ( pattern ) ;
39
64
var flagsAreUndefined = flags === undefined ;
40
- var sticky ;
65
+ var rawFlags , dotAll , sticky , result , state ;
41
66
42
67
if ( ! thisIsRegExp && patternIsRegExp && pattern . constructor === RegExpWrapper && flagsAreUndefined ) {
43
68
return pattern ;
@@ -50,34 +75,48 @@ if (FORCED) {
50
75
pattern = pattern . source ;
51
76
}
52
77
78
+ if ( UNSUPPORTED_DOT_ALL ) {
79
+ dotAll = ! ! flags && flags . indexOf ( 's' ) > - 1 ;
80
+ if ( dotAll ) flags = flags . replace ( / s / g, '' ) ;
81
+ }
82
+
83
+ rawFlags = flags ;
84
+
53
85
if ( UNSUPPORTED_Y ) {
54
86
sticky = ! ! flags && flags . indexOf ( 'y' ) > - 1 ;
55
87
if ( sticky ) flags = flags . replace ( / y / g, '' ) ;
56
88
}
57
89
58
- var result = inheritIfRequired (
90
+ result = inheritIfRequired (
59
91
CORRECT_NEW ? new NativeRegExp ( pattern , flags ) : NativeRegExp ( pattern , flags ) ,
60
92
thisIsRegExp ? this : RegExpPrototype ,
61
93
RegExpWrapper
62
94
) ;
63
95
64
- if ( UNSUPPORTED_Y && sticky ) {
65
- var state = enforceInternalState ( result ) ;
66
- state . sticky = true ;
96
+ if ( dotAll || sticky ) {
97
+ state = enforceInternalState ( result ) ;
98
+ if ( dotAll ) {
99
+ state . dotAll = true ;
100
+ state . raw = RegExpWrapper ( deDotAll ( pattern ) , rawFlags ) ;
101
+ }
102
+ if ( sticky ) state . sticky = true ;
67
103
}
68
104
69
105
return result ;
70
106
} ;
107
+
71
108
var proxy = function ( key ) {
72
109
key in RegExpWrapper || defineProperty ( RegExpWrapper , key , {
73
110
configurable : true ,
74
111
get : function ( ) { return NativeRegExp [ key ] ; } ,
75
112
set : function ( it ) { NativeRegExp [ key ] = it ; }
76
113
} ) ;
77
114
} ;
78
- var keys = getOwnPropertyNames ( NativeRegExp ) ;
79
- var index = 0 ;
80
- while ( keys . length > index ) proxy ( keys [ index ++ ] ) ;
115
+
116
+ for ( var keys = getOwnPropertyNames ( NativeRegExp ) , index = 0 ; keys . length > index ; ) {
117
+ proxy ( keys [ index ++ ] ) ;
118
+ }
119
+
81
120
RegExpPrototype . constructor = RegExpWrapper ;
82
121
RegExpWrapper . prototype = RegExpPrototype ;
83
122
redefine ( global , 'RegExp' , RegExpWrapper ) ;
0 commit comments