blob: 2a03846f945a393c12488f6421ae7df5dd462cb1 [file] [log] [blame]
// 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);