| Index: src/js/regexp.js
 | 
| diff --git a/src/js/regexp.js b/src/js/regexp.js
 | 
| index 584d4cdf41bdbe58c76cb3bd9ee22249f34f494a..b9d0f50b244345c52e73e1cb33fdbe09d7c3c6f6 100644
 | 
| --- a/src/js/regexp.js
 | 
| +++ b/src/js/regexp.js
 | 
| @@ -162,46 +162,6 @@ function RegExpSubclassExecJS(string) {
 | 
|  %FunctionRemovePrototype(RegExpSubclassExecJS);
 | 
|  
 | 
|  
 | 
| -// Legacy implementation of RegExp.prototype.exec
 | 
| -function RegExpExecJS(string) {
 | 
| -  if (!IS_REGEXP(this)) {
 | 
| -    throw %make_type_error(kIncompatibleMethodReceiver,
 | 
| -                        'RegExp.prototype.exec', this);
 | 
| -  }
 | 
| -
 | 
| -  string = TO_STRING(string);
 | 
| -  var lastIndex = this.lastIndex;
 | 
| -
 | 
| -  // Conversion is required by the ES2015 specification (RegExpBuiltinExec
 | 
| -  // algorithm, step 4) even if the value is discarded for non-global RegExps.
 | 
| -  var i = TO_LENGTH(lastIndex);
 | 
| -
 | 
| -  var updateLastIndex = REGEXP_GLOBAL(this) || REGEXP_STICKY(this);
 | 
| -  if (updateLastIndex) {
 | 
| -    if (i < 0 || i > string.length) {
 | 
| -      this.lastIndex = 0;
 | 
| -      return null;
 | 
| -    }
 | 
| -  } else {
 | 
| -    i = 0;
 | 
| -  }
 | 
| -
 | 
| -  // matchIndices is either null or the RegExpLastMatchInfo array.
 | 
| -  var matchIndices = %_RegExpExec(this, string, i, RegExpLastMatchInfo);
 | 
| -
 | 
| -  if (IS_NULL(matchIndices)) {
 | 
| -    this.lastIndex = 0;
 | 
| -    return null;
 | 
| -  }
 | 
| -
 | 
| -  // Successful match.
 | 
| -  if (updateLastIndex) {
 | 
| -    this.lastIndex = RegExpLastMatchInfo[CAPTURE1];
 | 
| -  }
 | 
| -  RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string);
 | 
| -}
 | 
| -
 | 
| -
 | 
|  // ES#sec-regexpexec Runtime Semantics: RegExpExec ( R, S )
 | 
|  // Also takes an optional exec method in case our caller
 | 
|  // has already fetched exec.
 | 
| @@ -216,70 +176,11 @@ function RegExpSubclassExec(regexp, string, exec) {
 | 
|      }
 | 
|      return result;
 | 
|    }
 | 
| -  return %_Call(RegExpExecJS, regexp, string);
 | 
| +  return %_Call(RegExpSubclassExecJS, regexp, string);
 | 
|  }
 | 
|  %SetForceInlineFlag(RegExpSubclassExec);
 | 
|  
 | 
|  
 | 
| -// One-element cache for the simplified test regexp.
 | 
| -var regexp_key;
 | 
| -var regexp_val;
 | 
| -
 | 
| -// Legacy implementation of RegExp.prototype.test
 | 
| -// Section 15.10.6.3 doesn't actually make sense, but the intention seems to be
 | 
| -// that test is defined in terms of String.prototype.exec. However, it probably
 | 
| -// means the original value of String.prototype.exec, which is what everybody
 | 
| -// else implements.
 | 
| -function RegExpTest(string) {
 | 
| -  if (!IS_REGEXP(this)) {
 | 
| -    throw %make_type_error(kIncompatibleMethodReceiver,
 | 
| -                        'RegExp.prototype.test', this);
 | 
| -  }
 | 
| -  string = TO_STRING(string);
 | 
| -
 | 
| -  var lastIndex = this.lastIndex;
 | 
| -
 | 
| -  // Conversion is required by the ES2015 specification (RegExpBuiltinExec
 | 
| -  // algorithm, step 4) even if the value is discarded for non-global RegExps.
 | 
| -  var i = TO_LENGTH(lastIndex);
 | 
| -
 | 
| -  if (REGEXP_GLOBAL(this) || REGEXP_STICKY(this)) {
 | 
| -    if (i < 0 || i > string.length) {
 | 
| -      this.lastIndex = 0;
 | 
| -      return false;
 | 
| -    }
 | 
| -    // matchIndices is either null or the RegExpLastMatchInfo array.
 | 
| -    var matchIndices = %_RegExpExec(this, string, i, RegExpLastMatchInfo);
 | 
| -    if (IS_NULL(matchIndices)) {
 | 
| -      this.lastIndex = 0;
 | 
| -      return false;
 | 
| -    }
 | 
| -    this.lastIndex = RegExpLastMatchInfo[CAPTURE1];
 | 
| -    return true;
 | 
| -  } else {
 | 
| -    // Non-global, non-sticky regexp.
 | 
| -    // Remove irrelevant preceeding '.*' in a test regexp.  The expression
 | 
| -    // checks whether this.source starts with '.*' and that the third char is
 | 
| -    // not a '?'.  But see https://code.google.com/p/v8/issues/detail?id=3560
 | 
| -    var regexp = this;
 | 
| -    var source = REGEXP_SOURCE(regexp);
 | 
| -    if (source.length >= 3 &&
 | 
| -        %_StringCharCodeAt(source, 0) == 46 &&  // '.'
 | 
| -        %_StringCharCodeAt(source, 1) == 42 &&  // '*'
 | 
| -        %_StringCharCodeAt(source, 2) != 63) {  // '?'
 | 
| -      regexp = TrimRegExp(regexp);
 | 
| -    }
 | 
| -    // matchIndices is either null or the RegExpLastMatchInfo array.
 | 
| -    var matchIndices = %_RegExpExec(regexp, string, 0, RegExpLastMatchInfo);
 | 
| -    if (IS_NULL(matchIndices)) {
 | 
| -      this.lastIndex = 0;
 | 
| -      return false;
 | 
| -    }
 | 
| -    return true;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -
 | 
|  // ES#sec-regexp.prototype.test RegExp.prototype.test ( S )
 | 
|  function RegExpSubclassTest(string) {
 | 
|    if (!IS_RECEIVER(this)) {
 | 
| @@ -292,18 +193,6 @@ function RegExpSubclassTest(string) {
 | 
|  }
 | 
|  %FunctionRemovePrototype(RegExpSubclassTest);
 | 
|  
 | 
| -function TrimRegExp(regexp) {
 | 
| -  if (regexp_key !== regexp) {
 | 
| -    regexp_key = regexp;
 | 
| -    regexp_val =
 | 
| -      new GlobalRegExp(
 | 
| -          %_SubString(REGEXP_SOURCE(regexp), 2, REGEXP_SOURCE(regexp).length),
 | 
| -          (REGEXP_IGNORE_CASE(regexp) ? REGEXP_MULTILINE(regexp) ? "im" : "i"
 | 
| -                                      : REGEXP_MULTILINE(regexp) ? "m" : ""));
 | 
| -  }
 | 
| -  return regexp_val;
 | 
| -}
 | 
| -
 | 
|  
 | 
|  function AtSurrogatePair(subject, index) {
 | 
|    if (index + 1 >= subject.length) return false;
 | 
| @@ -927,10 +816,7 @@ utils.Export(function(to) {
 | 
|    to.InternalRegExpMatch = InternalRegExpMatch;
 | 
|    to.InternalRegExpReplace = InternalRegExpReplace;
 | 
|    to.IsRegExp = IsRegExp;
 | 
| -  to.RegExpExec = DoRegExpExec;
 | 
|    to.RegExpInitialize = RegExpInitialize;
 | 
| -  to.RegExpLastMatchInfo = RegExpLastMatchInfo;
 | 
| -  to.RegExpTest = RegExpTest;
 | 
|  });
 | 
|  
 | 
|  })
 | 
| 
 |