whole_func_string: function RegExpSplit(string, limit) {
    // TODO(yangguo): allow non-regexp receivers.
    if (!IS_REGEXP(this)) {
      throw MakeTypeError(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;
  }
func_code_string: function RegExpSplit(string, limit) {
    // TODO(yangguo): allow non-regexp receivers.
    if (!IS_REGEXP(this)) {
      throw MakeTypeError(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;
  }
func_documentation_string: Legacy implementation of RegExp.prototype[Symbol.split] which doesn't properly call the underlying exec, @@species methods