d74a9fd595
The RegExp replace implementation is a bit of a mess. Here, we first try to handle parts of RegExp.p.exec, and then call directly into the raw irregexp code (skipping RegExp.p.exec). We got parts of this wrong: when lastIndex > string.length and the regexp instance is sticky, two things should happen. 1. The match should fail, and 2. lastIndex should be reset to 0. On the fast path, we did the latter but not the former, instead running exec with a lastIndex of 0. This CL omits the irregexp call in this case, and defaults to a failed match instead. Bug: chromium:875493 Change-Id: I8c959610d267575e37686076a3fd5dfde322f0ca Reviewed-on: https://chromium-review.googlesource.com/1180889 Commit-Queue: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Mathias Bynens <mathias@chromium.org> Cr-Commit-Position: refs/heads/master@{#55207}
21 lines
467 B
JavaScript
21 lines
467 B
JavaScript
// Copyright 2018 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --allow-natives-syntax
|
|
|
|
function test() {
|
|
const re = /./y;
|
|
re.lastIndex = 3;
|
|
const str = 'fg';
|
|
return re[Symbol.replace](str, '$');
|
|
}
|
|
|
|
%SetForceSlowPath(false);
|
|
const fast = test();
|
|
%SetForceSlowPath(true);
|
|
const slow = test();
|
|
%SetForceSlowPath(false);
|
|
|
|
assertEquals(slow, fast);
|