v8/test/mjsunit/debug-optimize.js
yangguo 35c28ce0a7 Debugger: prepare code for debugging on a per-function basis.
Prior to this patch, we enter a global debug mode whenever a break point
is set. By entering this mode, all code is deoptimized and activated
frames are recompiled and redirected to newly compiled debug code.

After this patch, we only deoptimize/redirect for functions we want to
debug. Trigger for this is Debug::EnsureDebugInfo, and having DebugInfo
object attached to the SFI prevents optimization/inlining.

The result is that we can have optimized code for functions without break
points alongside functions that do have break points, which are not
optimized.

R=mstarzinger@chromium.org, ulan@chromium.org
BUG=v8:4132
LOG=Y

Review URL: https://codereview.chromium.org/1233073005

Cr-Commit-Position: refs/heads/master@{#29758}
2015-07-20 14:53:37 +00:00

55 lines
883 B
JavaScript

// Copyright 2015 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: --expose-debug-as debug --allow-natives-syntax --use-inlining
var Debug = debug.Debug;
function f1() {
return 1;
}
function f2() {
return 2;
}
function f3() {
return f1();
}
function f4() {
return 4;
}
function optimize(f) {
f();
f();
%OptimizeFunctionOnNextCall(f);
f();
}
optimize(f1);
optimize(f2);
optimize(f3);
Debug.setListener(function() {});
assertOptimized(f1);
assertOptimized(f2);
assertOptimized(f3);
Debug.setBreakPoint(f1, 1);
// Setting break point deoptimizes f1 and f3 (which inlines f1).
assertUnoptimized(f1);
assertOptimized(f2);
assertUnoptimized(f3);
// We can optimize with break points set.
optimize(f4);
assertOptimized(f4);
Debug.setListener(null);