| Index: src/js/regexp.js
|
| diff --git a/src/js/regexp.js b/src/js/regexp.js
|
| index ecf3289b61ca3392cdfe59946fb4d78bab869ac9..e51a6d227a8d40ef2308cfeb1eed557c44656f4f 100644
|
| --- a/src/js/regexp.js
|
| +++ b/src/js/regexp.js
|
| @@ -17,6 +17,7 @@ var InternalArray = utils.InternalArray;
|
| var InternalPackedArray = utils.InternalPackedArray;
|
| var MaxSimple;
|
| var MinSimple;
|
| +var lastMatchInfoSymbol = utils.ImportNow("regexp_last_match_info_symbol");
|
| var matchSymbol = utils.ImportNow("match_symbol");
|
| var replaceSymbol = utils.ImportNow("replace_symbol");
|
| var searchSymbol = utils.ImportNow("search_symbol");
|
| @@ -923,180 +924,8 @@ function RegExpSubclassSearch(string) {
|
| %FunctionRemovePrototype(RegExpSubclassSearch);
|
|
|
|
|
| -// Getters for the static properties lastMatch, lastParen, leftContext, and
|
| -// rightContext of the RegExp constructor. The properties are computed based
|
| -// on the captures array of the last successful match and the subject string
|
| -// of the last successful match.
|
| -function RegExpGetLastMatch() {
|
| - var regExpSubject = LAST_SUBJECT(RegExpLastMatchInfo);
|
| - return %_SubString(regExpSubject,
|
| - RegExpLastMatchInfo[CAPTURE0],
|
| - RegExpLastMatchInfo[CAPTURE1]);
|
| -}
|
| -
|
| -
|
| -function RegExpGetLastParen() {
|
| - var length = NUMBER_OF_CAPTURES(RegExpLastMatchInfo);
|
| - if (length <= 2) return ''; // There were no captures.
|
| - // We match the SpiderMonkey behavior: return the substring defined by the
|
| - // last pair (after the first pair) of elements of the capture array even if
|
| - // it is empty.
|
| - var regExpSubject = LAST_SUBJECT(RegExpLastMatchInfo);
|
| - var start = RegExpLastMatchInfo[CAPTURE(length - 2)];
|
| - var end = RegExpLastMatchInfo[CAPTURE(length - 1)];
|
| - if (start != -1 && end != -1) {
|
| - return %_SubString(regExpSubject, start, end);
|
| - }
|
| - return "";
|
| -}
|
| -
|
| -
|
| -function RegExpGetLeftContext() {
|
| - var start_index;
|
| - var subject;
|
| - start_index = RegExpLastMatchInfo[CAPTURE0];
|
| - subject = LAST_SUBJECT(RegExpLastMatchInfo);
|
| - return %_SubString(subject, 0, start_index);
|
| -}
|
| -
|
| -
|
| -function RegExpGetRightContext() {
|
| - var start_index;
|
| - var subject;
|
| - start_index = RegExpLastMatchInfo[CAPTURE1];
|
| - subject = LAST_SUBJECT(RegExpLastMatchInfo);
|
| - return %_SubString(subject, start_index, subject.length);
|
| -}
|
| -
|
| -
|
| -// The properties $1..$9 are the first nine capturing substrings of the last
|
| -// successful match, or ''. The function RegExpMakeCaptureGetter will be
|
| -// called with indices from 1 to 9.
|
| -function RegExpMakeCaptureGetter(n) {
|
| - return function foo() {
|
| - var index = n * 2;
|
| - if (index >= NUMBER_OF_CAPTURES(RegExpLastMatchInfo)) return '';
|
| - var matchStart = RegExpLastMatchInfo[CAPTURE(index)];
|
| - var matchEnd = RegExpLastMatchInfo[CAPTURE(index + 1)];
|
| - if (matchStart == -1 || matchEnd == -1) return '';
|
| - return %_SubString(LAST_SUBJECT(RegExpLastMatchInfo), matchStart, matchEnd);
|
| - };
|
| -}
|
| -
|
| -
|
| -// ES6 21.2.5.3.
|
| -function RegExpGetFlags() {
|
| - if (!IS_RECEIVER(this)) {
|
| - throw %make_type_error(
|
| - kRegExpNonObject, "RegExp.prototype.flags", TO_STRING(this));
|
| - }
|
| - var result = '';
|
| - if (this.global) result += 'g';
|
| - if (this.ignoreCase) result += 'i';
|
| - if (this.multiline) result += 'm';
|
| - if (this.unicode) result += 'u';
|
| - if (this.sticky) result += 'y';
|
| - return result;
|
| -}
|
| -
|
| -
|
| -// ES6 21.2.5.4.
|
| -function RegExpGetGlobal() {
|
| - if (!IS_REGEXP(this)) {
|
| - // TODO(littledan): Remove this RegExp compat workaround
|
| - if (this === GlobalRegExp.prototype) {
|
| - %IncrementUseCounter(kRegExpPrototypeOldFlagGetter);
|
| - return UNDEFINED;
|
| - }
|
| - throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.global");
|
| - }
|
| - return TO_BOOLEAN(REGEXP_GLOBAL(this));
|
| -}
|
| -%SetForceInlineFlag(RegExpGetGlobal);
|
| -
|
| -
|
| -// ES6 21.2.5.5.
|
| -function RegExpGetIgnoreCase() {
|
| - if (!IS_REGEXP(this)) {
|
| - // TODO(littledan): Remove this RegExp compat workaround
|
| - if (this === GlobalRegExp.prototype) {
|
| - %IncrementUseCounter(kRegExpPrototypeOldFlagGetter);
|
| - return UNDEFINED;
|
| - }
|
| - throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.ignoreCase");
|
| - }
|
| - return TO_BOOLEAN(REGEXP_IGNORE_CASE(this));
|
| -}
|
| -
|
| -
|
| -// ES6 21.2.5.7.
|
| -function RegExpGetMultiline() {
|
| - if (!IS_REGEXP(this)) {
|
| - // TODO(littledan): Remove this RegExp compat workaround
|
| - if (this === GlobalRegExp.prototype) {
|
| - %IncrementUseCounter(kRegExpPrototypeOldFlagGetter);
|
| - return UNDEFINED;
|
| - }
|
| - throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.multiline");
|
| - }
|
| - return TO_BOOLEAN(REGEXP_MULTILINE(this));
|
| -}
|
| -
|
| -
|
| -// ES6 21.2.5.10.
|
| -function RegExpGetSource() {
|
| - if (!IS_REGEXP(this)) {
|
| - // TODO(littledan): Remove this RegExp compat workaround
|
| - if (this === GlobalRegExp.prototype) {
|
| - %IncrementUseCounter(kRegExpPrototypeSourceGetter);
|
| - return "(?:)";
|
| - }
|
| - throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.source");
|
| - }
|
| - return REGEXP_SOURCE(this);
|
| -}
|
| -
|
| -
|
| -// ES6 21.2.5.12.
|
| -function RegExpGetSticky() {
|
| - if (!IS_REGEXP(this)) {
|
| - // Compat fix: RegExp.prototype.sticky == undefined; UseCounter tracks it
|
| - // TODO(littledan): Remove this workaround or standardize it
|
| - if (this === GlobalRegExp.prototype) {
|
| - %IncrementUseCounter(kRegExpPrototypeStickyGetter);
|
| - return UNDEFINED;
|
| - }
|
| - throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.sticky");
|
| - }
|
| - return TO_BOOLEAN(REGEXP_STICKY(this));
|
| -}
|
| -%SetForceInlineFlag(RegExpGetSticky);
|
| -
|
| -
|
| -// ES6 21.2.5.15.
|
| -function RegExpGetUnicode() {
|
| - if (!IS_REGEXP(this)) {
|
| - // TODO(littledan): Remove this RegExp compat workaround
|
| - if (this === GlobalRegExp.prototype) {
|
| - %IncrementUseCounter(kRegExpPrototypeUnicodeGetter);
|
| - return UNDEFINED;
|
| - }
|
| - throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.unicode");
|
| - }
|
| - return TO_BOOLEAN(REGEXP_UNICODE(this));
|
| -}
|
| -%SetForceInlineFlag(RegExpGetUnicode);
|
| -
|
| -
|
| -function RegExpSpecies() {
|
| - return this;
|
| -}
|
| -
|
| -
|
| // -------------------------------------------------------------------
|
|
|
| -utils.InstallGetter(GlobalRegExp, speciesSymbol, RegExpSpecies);
|
| -
|
| utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [
|
| "exec", RegExpSubclassExecJS,
|
| "test", RegExpSubclassTest,
|
| @@ -1108,58 +937,8 @@ utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [
|
| splitSymbol, RegExpSubclassSplit,
|
| ]);
|
|
|
| -utils.InstallGetter(GlobalRegExp.prototype, 'flags', RegExpGetFlags);
|
| -utils.InstallGetter(GlobalRegExp.prototype, 'global', RegExpGetGlobal);
|
| -utils.InstallGetter(GlobalRegExp.prototype, 'ignoreCase', RegExpGetIgnoreCase);
|
| -utils.InstallGetter(GlobalRegExp.prototype, 'multiline', RegExpGetMultiline);
|
| -utils.InstallGetter(GlobalRegExp.prototype, 'source', RegExpGetSource);
|
| -utils.InstallGetter(GlobalRegExp.prototype, 'sticky', RegExpGetSticky);
|
| -utils.InstallGetter(GlobalRegExp.prototype, 'unicode', RegExpGetUnicode);
|
| -
|
| -// The properties `input` and `$_` are aliases for each other. When this
|
| -// value is set the value it is set to is coerced to a string.
|
| -// Getter and setter for the input.
|
| -var RegExpGetInput = function() {
|
| - var regExpInput = LAST_INPUT(RegExpLastMatchInfo);
|
| - return IS_UNDEFINED(regExpInput) ? "" : regExpInput;
|
| -};
|
| -var RegExpSetInput = function(string) {
|
| - LAST_INPUT(RegExpLastMatchInfo) = TO_STRING(string);
|
| -};
|
| -
|
| -%OptimizeObjectForAddingMultipleProperties(GlobalRegExp, 22);
|
| -utils.InstallGetterSetter(GlobalRegExp, 'input', RegExpGetInput, RegExpSetInput,
|
| - DONT_DELETE);
|
| -utils.InstallGetterSetter(GlobalRegExp, '$_', RegExpGetInput, RegExpSetInput,
|
| - DONT_ENUM | DONT_DELETE);
|
| -
|
| -
|
| -var NoOpSetter = function(ignored) {};
|
| -
|
| -
|
| -// Static properties set by a successful match.
|
| -utils.InstallGetterSetter(GlobalRegExp, 'lastMatch', RegExpGetLastMatch,
|
| - NoOpSetter, DONT_DELETE);
|
| -utils.InstallGetterSetter(GlobalRegExp, '$&', RegExpGetLastMatch, NoOpSetter,
|
| - DONT_ENUM | DONT_DELETE);
|
| -utils.InstallGetterSetter(GlobalRegExp, 'lastParen', RegExpGetLastParen,
|
| - NoOpSetter, DONT_DELETE);
|
| -utils.InstallGetterSetter(GlobalRegExp, '$+', RegExpGetLastParen, NoOpSetter,
|
| - DONT_ENUM | DONT_DELETE);
|
| -utils.InstallGetterSetter(GlobalRegExp, 'leftContext', RegExpGetLeftContext,
|
| - NoOpSetter, DONT_DELETE);
|
| -utils.InstallGetterSetter(GlobalRegExp, '$`', RegExpGetLeftContext, NoOpSetter,
|
| - DONT_ENUM | DONT_DELETE);
|
| -utils.InstallGetterSetter(GlobalRegExp, 'rightContext', RegExpGetRightContext,
|
| - NoOpSetter, DONT_DELETE);
|
| -utils.InstallGetterSetter(GlobalRegExp, "$'", RegExpGetRightContext, NoOpSetter,
|
| - DONT_ENUM | DONT_DELETE);
|
| -
|
| -for (var i = 1; i < 10; ++i) {
|
| - utils.InstallGetterSetter(GlobalRegExp, '$' + i, RegExpMakeCaptureGetter(i),
|
| - NoOpSetter, DONT_DELETE);
|
| -}
|
| -%ToFastProperties(GlobalRegExp);
|
| +// Temporary until all RegExpLastMatchInfo accesses are ported to C++.
|
| +SET_PRIVATE(GlobalRegExp, lastMatchInfoSymbol, RegExpLastMatchInfo);
|
|
|
| // -------------------------------------------------------------------
|
| // Internal
|
|
|