Commit 6be2f6e2 authored by bcoe's avatar bcoe Committed by Commit Bot

[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: 's avatarJakob Gruber <jgruber@chromium.org>
Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Reviewed-by: 's avatarSigurd Schneider <sigurds@chromium.org>
Cr-Commit-Position: refs/heads/master@{#69628}
parent c40c8f7d
...@@ -473,6 +473,7 @@ bool BytecodeHasNoSideEffect(interpreter::Bytecode bytecode) { ...@@ -473,6 +473,7 @@ bool BytecodeHasNoSideEffect(interpreter::Bytecode bytecode) {
case Bytecode::kToNumeric: case Bytecode::kToNumeric:
case Bytecode::kToString: case Bytecode::kToString:
// Misc. // Misc.
case Bytecode::kIncBlockCounter: // Coverage counters.
case Bytecode::kForInEnumerate: case Bytecode::kForInEnumerate:
case Bytecode::kForInPrepare: case Bytecode::kForInPrepare:
case Bytecode::kForInContinue: case Bytecode::kForInContinue:
......
Tests side-effect-free evaluation with coverage enabled
Paused on 'debugger;'
f() returns 1
// 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 @@ ...@@ -33,6 +33,7 @@
'debugger/eval-scopes': [PASS, FAIL], 'debugger/eval-scopes': [PASS, FAIL],
'debugger/scope-skip-variables-with-empty-name': [PASS, FAIL], 'debugger/scope-skip-variables-with-empty-name': [PASS, FAIL],
'debugger/update-call-frame-scopes': [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/side-effect-free-debug-evaluate': [PASS, FAIL],
'debugger/evaluate-on-call-frame-in-module': [PASS, FAIL], 'debugger/evaluate-on-call-frame-in-module': [PASS, FAIL],
}], # variant != default }], # variant != default
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment