dd580e8fdf
When given a sticky regexp s.t. lastIndex > subject.length, the following should happen: 1. exec returns null (= no match) 2. lastIndex is reset to 0. This is usually done by the RegExp.p.exec builtin; but in some cases we take different paths and try to re-implement the parts of exec that we need. One of these cases was in %StringReplaceNonGlobalRegExpWithFunction. Here, we set lastIndex to 0 but then incorrectly called into RegExpImpl::Exec. REI::Exec started matching with lastIndex == 0, which is just plain wrong. With this CL we now correctly omit the REI::Exec call and return null. Bug: chromium:937681, v8:5361 Change-Id: I6bb1114a6b92ed3c6e63ec7f6ec2df4b95a19b4c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1514679 Reviewed-by: Peter Marshall <petermarshall@chromium.org> Commit-Queue: Jakob Gruber <jgruber@chromium.org> Cr-Commit-Position: refs/heads/master@{#60169}
18 lines
549 B
JavaScript
18 lines
549 B
JavaScript
// Copyright 2019 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.
|
|
|
|
const str = 'aaaa';
|
|
|
|
const re0 = /./y;
|
|
|
|
// Twice to go through both runtime and the builtin.
|
|
re0.lastIndex = 9;
|
|
assertEquals(str, re0[Symbol.replace](str, () => 42));
|
|
re0.lastIndex = 9;
|
|
assertEquals(str, re0[Symbol.replace](str, () => 42));
|
|
re0.lastIndex = 9;
|
|
assertEquals(str, re0[Symbol.replace](str, "42"));
|
|
re0.lastIndex = 9;
|
|
assertEquals(str, re0[Symbol.replace](str, "42"));
|