text: // Copyright (C) 2015 the V8 project authors. All rights reserved.
  // This code is governed by the BSD license found in the LICENSE file.
  
  /*---
  description: >
      Behavior when position is decremented during result accumulation
  es6id: 21.2.5.8
  info: |
      16. Repeat, for each result in results,
          [...]
          p. If position ≥ nextSourcePosition, then
             i. NOTE position should not normally move backwards. If it does, it
                is an indication of an ill-behaving RegExp subclass or use of an
                access triggered side-effect to change the global flag or other
                characteristics of rx. In such cases, the corresponding
                substitution is ignored.
             ii. Let accumulatedResult be the String formed by concatenating the
                 code units of the current value of accumulatedResult with the
                 substring of S consisting of the code units from
                 nextSourcePosition (inclusive) up to position (exclusive) and
                 with the code units of replacement.
             iii. Let nextSourcePosition be position + matchLength.
  features: [Symbol.replace]
  ---*/
  
  var r = /./g;
  var callCount = 0;
  r.exec = function() {
    callCount += 1;
  
    if (callCount === 1) {
      return { index: 3, length: 1, 0: 0 };
    } else if (callCount === 2) {
      return { index: 1, length: 1, 0: 0 };
    }
  
    return null;
  };
  
  assert.sameValue(r[Symbol.replace]('abcde', 'X'), 'abcXe');
  assert.sameValue(callCount, 3);
  