// Copyright 2016 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. // Ensure that we have the correct number of accesses to exec in split, and // that exec is called at the correct point in time. var lastIndexHasBeenSet = false; var countOfExecGets = 0; // Force the slow path and make sure the created splitter object has our // overwritten exec method (@@split does not call exec on the original regexp // but on a newly-created splitter which is guaranteed to be sticky). class ObservableExecRegExp extends RegExp { constructor(pattern, flags) { super(pattern, flags); this.lastIndex = 42; const re = this; Object.defineProperty(this, "exec", { get: function() { // Ensure exec is first accessed after lastIndex has been reset to // satisfy the spec. assertTrue(re.lastIndex != 42); countOfExecGets++; return RegExp.prototype.exec; } }); } } var re = new ObservableExecRegExp(/x/); assertEquals(42, re.lastIndex); assertEquals(0, countOfExecGets); var result = "axbxc".split(re); assertEquals(5, countOfExecGets); assertEquals(["a", "b", "c"], result);