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 'use strict'; | 7 'use strict'; |
8 | 8 |
9 %CheckIsBootstrapping(); | 9 %CheckIsBootstrapping(); |
10 | 10 |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 'RegExp.prototype.exec', this); | 171 'RegExp.prototype.exec', this); |
172 } | 172 } |
173 | 173 |
174 string = TO_STRING(string); | 174 string = TO_STRING(string); |
175 | 175 |
176 var lastIndex; | 176 var lastIndex; |
177 var global = TO_BOOLEAN(REGEXP_GLOBAL(this)); | 177 var global = TO_BOOLEAN(REGEXP_GLOBAL(this)); |
178 var sticky = TO_BOOLEAN(REGEXP_STICKY(this)); | 178 var sticky = TO_BOOLEAN(REGEXP_STICKY(this)); |
179 var updateLastIndex = global || sticky; | 179 var updateLastIndex = global || sticky; |
180 if (updateLastIndex) { | 180 if (updateLastIndex) { |
181 lastIndex = TO_LENGTH(this.lastIndex); | 181 // TODO(jgruber): This is actually ToLength in the spec, but we bailout |
| 182 // to the runtime in %_RegExpExec if lastIndex is not a Smi, so we are |
| 183 // smart here and trick both TurboFan and Crankshaft to produce a Smi. |
| 184 // This is a terrible hack, and correct for subtle reasons; it's a clear |
| 185 // indicator that we need a predictable RegExp implementation where we |
| 186 // don't need to add specific work-arounds for certain compiler issues. |
| 187 lastIndex = +this.lastIndex; |
182 if (lastIndex > string.length) { | 188 if (lastIndex > string.length) { |
183 this.lastIndex = 0; | 189 this.lastIndex = 0; |
184 return null; | 190 return null; |
| 191 } else if (lastIndex <= 0) { |
| 192 lastIndex = 0; |
185 } | 193 } |
| 194 lastIndex = lastIndex|0; |
186 } else { | 195 } else { |
187 lastIndex = 0; | 196 lastIndex = 0; |
188 } | 197 } |
189 | 198 |
190 // matchIndices is either null or the RegExpLastMatchInfo array. | 199 // matchIndices is either null or the RegExpLastMatchInfo array. |
191 var matchIndices = %_RegExpExec(this, string, lastIndex, RegExpLastMatchInfo); | 200 var matchIndices = %_RegExpExec(this, string, lastIndex, RegExpLastMatchInfo); |
192 | 201 |
193 if (IS_NULL(matchIndices)) { | 202 if (IS_NULL(matchIndices)) { |
194 if (updateLastIndex) this.lastIndex = 0; | 203 if (updateLastIndex) this.lastIndex = 0; |
195 return null; | 204 return null; |
(...skipping 929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1125 to.GetSubstitution = GetSubstitution; | 1134 to.GetSubstitution = GetSubstitution; |
1126 to.InternalRegExpMatch = InternalRegExpMatch; | 1135 to.InternalRegExpMatch = InternalRegExpMatch; |
1127 to.InternalRegExpReplace = InternalRegExpReplace; | 1136 to.InternalRegExpReplace = InternalRegExpReplace; |
1128 to.IsRegExp = IsRegExp; | 1137 to.IsRegExp = IsRegExp; |
1129 to.RegExpExec = DoRegExpExec; | 1138 to.RegExpExec = DoRegExpExec; |
1130 to.RegExpInitialize = RegExpInitialize; | 1139 to.RegExpInitialize = RegExpInitialize; |
1131 to.RegExpLastMatchInfo = RegExpLastMatchInfo; | 1140 to.RegExpLastMatchInfo = RegExpLastMatchInfo; |
1132 }); | 1141 }); |
1133 | 1142 |
1134 }) | 1143 }) |
OLD | NEW |