| Index: src/js/regexp.js
|
| diff --git a/src/js/regexp.js b/src/js/regexp.js
|
| index 915a44f0b54daec86f4f005660aa9383c988e34d..b5574877ec3a19f16dd1fdbd5efbe9762e05b99f 100644
|
| --- a/src/js/regexp.js
|
| +++ b/src/js/regexp.js
|
| @@ -103,6 +103,7 @@
|
| endmacro
|
|
|
|
|
| +
|
| // ES#sec-regexpexec Runtime Semantics: RegExpExec ( R, S )
|
| // Also takes an optional exec method in case our caller
|
| // has already fetched exec.
|
| @@ -120,6 +121,19 @@
|
| return %_Call(RegExpExecJS, regexp, string);
|
| }
|
| %SetForceInlineFlag(RegExpSubclassExec);
|
| +
|
| +
|
| +// ES#sec-regexp.prototype.test RegExp.prototype.test ( S )
|
| +function RegExpSubclassTest(string) {
|
| + if (!IS_RECEIVER(this)) {
|
| + throw %make_type_error(kIncompatibleMethodReceiver,
|
| + 'RegExp.prototype.test', this);
|
| + }
|
| + string = TO_STRING(string);
|
| + var match = RegExpSubclassExec(this, string);
|
| + return !IS_NULL(match);
|
| +}
|
| +%FunctionRemovePrototype(RegExpSubclassTest);
|
|
|
|
|
| function AtSurrogatePair(subject, index) {
|
| @@ -273,6 +287,39 @@
|
| return array;
|
| }
|
| %FunctionRemovePrototype(RegExpSubclassSplit);
|
| +
|
| +
|
| +// ES#sec-regexp.prototype-@@match
|
| +// RegExp.prototype [ @@match ] ( string )
|
| +function RegExpSubclassMatch(string) {
|
| + if (!IS_RECEIVER(this)) {
|
| + throw %make_type_error(kIncompatibleMethodReceiver,
|
| + "RegExp.prototype.@@match", this);
|
| + }
|
| + string = TO_STRING(string);
|
| + var global = this.global;
|
| + if (!global) return RegExpSubclassExec(this, string);
|
| + var unicode = this.unicode;
|
| + this.lastIndex = 0;
|
| + var array = new InternalArray();
|
| + var n = 0;
|
| + var result;
|
| + while (true) {
|
| + result = RegExpSubclassExec(this, string);
|
| + if (IS_NULL(result)) {
|
| + if (n === 0) return null;
|
| + break;
|
| + }
|
| + var matchStr = TO_STRING(result[0]);
|
| + array[n] = matchStr;
|
| + if (matchStr === "") SetAdvancedStringIndex(this, string, unicode);
|
| + n++;
|
| + }
|
| + var resultArray = [];
|
| + %MoveArrayContents(array, resultArray);
|
| + return resultArray;
|
| +}
|
| +%FunctionRemovePrototype(RegExpSubclassMatch);
|
|
|
|
|
| // Legacy implementation of RegExp.prototype[Symbol.replace] which
|
| @@ -669,11 +716,32 @@
|
| %FunctionRemovePrototype(RegExpSubclassReplace);
|
|
|
|
|
| +// ES#sec-regexp.prototype-@@search
|
| +// RegExp.prototype [ @@search ] ( string )
|
| +function RegExpSubclassSearch(string) {
|
| + if (!IS_RECEIVER(this)) {
|
| + throw %make_type_error(kIncompatibleMethodReceiver,
|
| + "RegExp.prototype.@@search", this);
|
| + }
|
| + string = TO_STRING(string);
|
| + var previousLastIndex = this.lastIndex;
|
| + if (previousLastIndex != 0) this.lastIndex = 0;
|
| + var result = RegExpSubclassExec(this, string);
|
| + var currentLastIndex = this.lastIndex;
|
| + if (currentLastIndex != previousLastIndex) this.lastIndex = previousLastIndex;
|
| + if (IS_NULL(result)) return -1;
|
| + return result.index;
|
| +}
|
| +%FunctionRemovePrototype(RegExpSubclassSearch);
|
| +
|
|
|
| // -------------------------------------------------------------------
|
|
|
| utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [
|
| + "test", RegExpSubclassTest,
|
| + matchSymbol, RegExpSubclassMatch,
|
| replaceSymbol, RegExpSubclassReplace,
|
| + searchSymbol, RegExpSubclassSearch,
|
| splitSymbol, RegExpSubclassSplit,
|
| ]);
|
|
|
|
|