[coverage] IncBlockCounter should not be side-effect
Incrementing coverage counter was triggering EvalError for evaluateOnCallFrame when throwOnSideEffect is true. R=jgruber@chromium.org, sigurds@chromium.org, yangguo@chromium.org Bug: v8:10856 Change-Id: I0552e19a3a14ff61a9cb626494fb4a21979d535e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2384011 Commit-Queue: Benjamin Coe <bencoe@google.com> Reviewed-by: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Yang Guo <yangguo@chromium.org> Reviewed-by: Sigurd Schneider <sigurds@chromium.org> Cr-Commit-Position: refs/heads/master@{#69628}
This commit is contained in:
parent
c40c8f7d15
commit
6be2f6e26e
@ -473,6 +473,7 @@ bool BytecodeHasNoSideEffect(interpreter::Bytecode bytecode) {
|
||||
case Bytecode::kToNumeric:
|
||||
case Bytecode::kToString:
|
||||
// Misc.
|
||||
case Bytecode::kIncBlockCounter: // Coverage counters.
|
||||
case Bytecode::kForInEnumerate:
|
||||
case Bytecode::kForInPrepare:
|
||||
case Bytecode::kForInContinue:
|
||||
|
@ -0,0 +1,3 @@
|
||||
Tests side-effect-free evaluation with coverage enabled
|
||||
Paused on 'debugger;'
|
||||
f() returns 1
|
43
test/inspector/debugger/side-effect-free-coverage-enabled.js
Normal file
43
test/inspector/debugger/side-effect-free-coverage-enabled.js
Normal file
@ -0,0 +1,43 @@
|
||||
// Copyright 2020 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.
|
||||
|
||||
let {session, contextGroup, Protocol} = InspectorTest.start('Tests side-effect-free evaluation with coverage enabled');
|
||||
|
||||
contextGroup.addScript(`
|
||||
function testFunction()
|
||||
{
|
||||
var o = 0;
|
||||
function f() { return 1; }
|
||||
function g() { o = 2; return o; }
|
||||
f,g;
|
||||
debugger;
|
||||
}
|
||||
//# sourceURL=foo.js`);
|
||||
|
||||
// Side effect free call should not result in EvalError when coverage
|
||||
// is enabled:
|
||||
Protocol.Profiler.enable()
|
||||
Protocol.Profiler.startPreciseCoverage({callCount: true, detailed: true})
|
||||
|
||||
Protocol.Debugger.enable();
|
||||
|
||||
Protocol.Debugger.oncePaused().then(debuggerPaused);
|
||||
|
||||
Protocol.Runtime.evaluate({ "expression": "setTimeout(testFunction, 0)" });
|
||||
|
||||
var topFrameId;
|
||||
|
||||
function debuggerPaused(messageObject)
|
||||
{
|
||||
InspectorTest.log("Paused on 'debugger;'");
|
||||
|
||||
topFrameId = messageObject.params.callFrames[0].callFrameId;
|
||||
Protocol.Debugger.evaluateOnCallFrame({ callFrameId: topFrameId, expression: "f()", throwOnSideEffect: true}).then(evaluatedFirst);
|
||||
}
|
||||
|
||||
function evaluatedFirst(response)
|
||||
{
|
||||
InspectorTest.log("f() returns " + response.result.result.value);
|
||||
InspectorTest.completeTest();
|
||||
}
|
@ -33,6 +33,7 @@
|
||||
'debugger/eval-scopes': [PASS, FAIL],
|
||||
'debugger/scope-skip-variables-with-empty-name': [PASS, FAIL],
|
||||
'debugger/update-call-frame-scopes': [PASS, FAIL],
|
||||
'debugger/side-effect-free-coverage-enabled': [PASS, FAIL],
|
||||
'debugger/side-effect-free-debug-evaluate': [PASS, FAIL],
|
||||
'debugger/evaluate-on-call-frame-in-module': [PASS, FAIL],
|
||||
}], # variant != default
|
||||
|
Loading…
Reference in New Issue
Block a user