Index: src/js/regexp.js |
diff --git a/src/js/regexp.js b/src/js/regexp.js |
index 71fe64f05930fdcb54fb02192d8a2e0ab9d5813e..2640726fdf1f5b8ab42868f31e631015f2f3a35f 100644 |
--- a/src/js/regexp.js |
+++ b/src/js/regexp.js |
@@ -14,11 +14,12 @@ |
var GlobalArray = global.Array; |
var GlobalObject = global.Object; |
var GlobalRegExp = global.RegExp; |
-var GlobalRegExpPrototype; |
+var GlobalRegExpPrototype = GlobalRegExp.prototype; |
var InternalArray = utils.InternalArray; |
var InternalPackedArray = utils.InternalPackedArray; |
var MaxSimple; |
var MinSimple; |
+var RegExpExecJS = GlobalRegExp.prototype.exec; |
var matchSymbol = utils.ImportNow("match_symbol"); |
var replaceSymbol = utils.ImportNow("replace_symbol"); |
var searchSymbol = utils.ImportNow("search_symbol"); |
@@ -163,55 +164,6 @@ macro RETURN_NEW_RESULT_FROM_MATCH_INFO(MATCHINFO, STRING) |
endmacro |
-// ES#sec-regexp.prototype.exec |
-// RegExp.prototype.exec ( string ) |
-function RegExpExecJS(string) { |
- if (!IS_REGEXP(this)) { |
- throw %make_type_error(kIncompatibleMethodReceiver, |
- 'RegExp.prototype.exec', this); |
- } |
- |
- string = TO_STRING(string); |
- |
- var lastIndex; |
- var global = TO_BOOLEAN(REGEXP_GLOBAL(this)); |
- var sticky = TO_BOOLEAN(REGEXP_STICKY(this)); |
- var updateLastIndex = global || sticky; |
- if (updateLastIndex) { |
- // TODO(jgruber): This is actually ToLength in the spec, but we bailout |
- // to the runtime in %_RegExpExec if lastIndex is not a Smi, so we are |
- // smart here and trick both TurboFan and Crankshaft to produce a Smi. |
- // This is a terrible hack, and correct for subtle reasons; it's a clear |
- // indicator that we need a predictable RegExp implementation where we |
- // don't need to add specific work-arounds for certain compiler issues. |
- lastIndex = +this.lastIndex; |
- if (lastIndex > string.length) { |
- this.lastIndex = 0; |
- return null; |
- } else if (lastIndex <= 0) { |
- lastIndex = 0; |
- } |
- lastIndex = lastIndex|0; |
- } else { |
- lastIndex = 0; |
- } |
- |
- // matchIndices is either null or the RegExpLastMatchInfo array. |
- var matchIndices = %_RegExpExec(this, string, lastIndex, RegExpLastMatchInfo); |
- |
- if (IS_NULL(matchIndices)) { |
- if (updateLastIndex) this.lastIndex = 0; |
- return null; |
- } |
- |
- // Successful match. |
- if (updateLastIndex) { |
- this.lastIndex = RegExpLastMatchInfo[CAPTURE1]; |
- } |
- RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string); |
-} |
-%FunctionRemovePrototype(RegExpExecJS); |
- |
// ES#sec-regexpexec Runtime Semantics: RegExpExec ( R, S ) |
// Also takes an optional exec method in case our caller |
@@ -1022,16 +974,11 @@ function RegExpSpecies() { |
// ------------------------------------------------------------------- |
%FunctionSetInstanceClassName(GlobalRegExp, 'RegExp'); |
-GlobalRegExpPrototype = new GlobalObject(); |
-%FunctionSetPrototype(GlobalRegExp, GlobalRegExpPrototype); |
-%AddNamedProperty( |
- GlobalRegExp.prototype, 'constructor', GlobalRegExp, DONT_ENUM); |
%SetCode(GlobalRegExp, RegExpConstructor); |
utils.InstallGetter(GlobalRegExp, speciesSymbol, RegExpSpecies); |
utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [ |
- "exec", RegExpExecJS, |
"test", RegExpSubclassTest, |
"toString", RegExpToString, |
"compile", RegExpCompileJS, |
@@ -1103,6 +1050,8 @@ for (var i = 1; i < 10; ++i) { |
} |
%ToFastProperties(GlobalRegExp); |
+%InstallToContext(["regexp_last_match_info", RegExpLastMatchInfo]); |
+ |
// ------------------------------------------------------------------- |
// Internal |