Index: src/js/regexp.js |
diff --git a/src/js/regexp.js b/src/js/regexp.js |
index 915a44f0b54daec86f4f005660aa9383c988e34d..c4b01aacf280216deffdcbf3de279d352c26081e 100644 |
--- a/src/js/regexp.js |
+++ b/src/js/regexp.js |
@@ -122,159 +122,6 @@ function RegExpSubclassExec(regexp, string, exec) { |
%SetForceInlineFlag(RegExpSubclassExec); |
-function AtSurrogatePair(subject, index) { |
- if (index + 1 >= subject.length) return false; |
- var first = %_StringCharCodeAt(subject, index); |
- if (first < 0xD800 || first > 0xDBFF) return false; |
- var second = %_StringCharCodeAt(subject, index + 1); |
- return second >= 0xDC00 && second <= 0xDFFF; |
-} |
- |
- |
-// Fast path implementation of RegExp.prototype[Symbol.split] which |
-// doesn't properly call the underlying exec, @@species methods |
-function RegExpSplit(string, limit) { |
- if (!IS_REGEXP(this)) { |
- throw %make_type_error(kIncompatibleMethodReceiver, |
- "RegExp.prototype.@@split", this); |
- } |
- var separator = this; |
- var subject = TO_STRING(string); |
- |
- limit = (IS_UNDEFINED(limit)) ? kMaxUint32 : TO_UINT32(limit); |
- var length = subject.length; |
- |
- if (limit === 0) return []; |
- |
- if (length === 0) { |
- if (DoRegExpExec(separator, subject, 0, 0) !== null) return []; |
- return [subject]; |
- } |
- |
- var currentIndex = 0; |
- var startIndex = 0; |
- var startMatch = 0; |
- var result = new InternalArray(); |
- |
- outer_loop: |
- while (true) { |
- if (startIndex === length) { |
- result[result.length] = %_SubString(subject, currentIndex, length); |
- break; |
- } |
- |
- var matchInfo = DoRegExpExec(separator, subject, startIndex); |
- if (matchInfo === null || length === (startMatch = matchInfo[CAPTURE0])) { |
- result[result.length] = %_SubString(subject, currentIndex, length); |
- break; |
- } |
- var endIndex = matchInfo[CAPTURE1]; |
- |
- // We ignore a zero-length match at the currentIndex. |
- if (startIndex === endIndex && endIndex === currentIndex) { |
- if (REGEXP_UNICODE(this) && AtSurrogatePair(subject, startIndex)) { |
- startIndex += 2; |
- } else { |
- startIndex++; |
- } |
- continue; |
- } |
- |
- result[result.length] = %_SubString(subject, currentIndex, startMatch); |
- |
- if (result.length === limit) break; |
- |
- var matchinfo_len = NUMBER_OF_CAPTURES(matchInfo) + REGEXP_FIRST_CAPTURE; |
- for (var i = REGEXP_FIRST_CAPTURE + 2; i < matchinfo_len; ) { |
- var start = matchInfo[i++]; |
- var end = matchInfo[i++]; |
- if (end != -1) { |
- result[result.length] = %_SubString(subject, start, end); |
- } else { |
- result[result.length] = UNDEFINED; |
- } |
- if (result.length === limit) break outer_loop; |
- } |
- |
- startIndex = currentIndex = endIndex; |
- } |
- |
- var array_result = []; |
- %MoveArrayContents(result, array_result); |
- return array_result; |
-} |
- |
- |
-// ES#sec-regexp.prototype-@@split |
-// RegExp.prototype [ @@split ] ( string, limit ) |
-function RegExpSubclassSplit(string, limit) { |
- if (!IS_RECEIVER(this)) { |
- throw %make_type_error(kIncompatibleMethodReceiver, |
- "RegExp.prototype.@@split", this); |
- } |
- string = TO_STRING(string); |
- var constructor = SpeciesConstructor(this, GlobalRegExp); |
- var flags = TO_STRING(this.flags); |
- |
- // TODO(adamk): this fast path is wrong as we doesn't ensure that 'exec' |
- // is actually a data property on RegExp.prototype. |
- if (IS_REGEXP(this) && constructor === GlobalRegExp) { |
- var exec = this.exec; |
- if (exec === RegExpExecJS) { |
- return %_Call(RegExpSplit, this, string, limit); |
- } |
- } |
- |
- var unicode = %StringIndexOf(flags, 'u', 0) >= 0; |
- var sticky = %StringIndexOf(flags, 'y', 0) >= 0; |
- var newFlags = sticky ? flags : flags + "y"; |
- var splitter = new constructor(this, newFlags); |
- var array = new GlobalArray(); |
- var arrayIndex = 0; |
- var lim = (IS_UNDEFINED(limit)) ? kMaxUint32 : TO_UINT32(limit); |
- var size = string.length; |
- var prevStringIndex = 0; |
- if (lim === 0) return array; |
- var result; |
- if (size === 0) { |
- result = RegExpSubclassExec(splitter, string); |
- if (IS_NULL(result)) %AddElement(array, 0, string); |
- return array; |
- } |
- var stringIndex = prevStringIndex; |
- while (stringIndex < size) { |
- splitter.lastIndex = stringIndex; |
- result = RegExpSubclassExec(splitter, string); |
- if (IS_NULL(result)) { |
- stringIndex += AdvanceStringIndex(string, stringIndex, unicode); |
- } else { |
- var end = MinSimple(TO_LENGTH(splitter.lastIndex), size); |
- if (end === prevStringIndex) { |
- stringIndex += AdvanceStringIndex(string, stringIndex, unicode); |
- } else { |
- %AddElement( |
- array, arrayIndex, |
- %_SubString(string, prevStringIndex, stringIndex)); |
- arrayIndex++; |
- if (arrayIndex === lim) return array; |
- prevStringIndex = end; |
- var numberOfCaptures = MaxSimple(TO_LENGTH(result.length), 0); |
- for (var i = 1; i < numberOfCaptures; i++) { |
- %AddElement(array, arrayIndex, result[i]); |
- arrayIndex++; |
- if (arrayIndex === lim) return array; |
- } |
- stringIndex = prevStringIndex; |
- } |
- } |
- } |
- %AddElement(array, arrayIndex, |
- %_SubString(string, prevStringIndex, size)); |
- return array; |
-} |
-%FunctionRemovePrototype(RegExpSubclassSplit); |
- |
- |
// Legacy implementation of RegExp.prototype[Symbol.replace] which |
// doesn't properly call the underlying exec method. |
@@ -674,7 +521,6 @@ function RegExpSubclassReplace(string, replace) { |
utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [ |
replaceSymbol, RegExpSubclassReplace, |
- splitSymbol, RegExpSubclassSplit, |
]); |
%InstallToContext(["regexp_last_match_info", RegExpLastMatchInfo]); |