53fc4807cd
Previously we'd allow to replace the source of functions that are on the current execution stack under certain conditions, but this has resulted in an endless stream of bugs due to weird edge cases, and so we're now limiting LiveEdit to functions that don't have any activation (including not a suspended generator / async function activation). We might eventually add the ability to LiveEdit functions with activations and have them "upgrade upon next invocation", but that doesn't seem to be an extremely important use case right now. Fixed: chromium:1195927 Change-Id: I87a45ba4d0ddcfbf867bd4e73738d76b2d789e04 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2846892 Auto-Submit: Benedikt Meurer <bmeurer@chromium.org> Commit-Queue: Benedikt Meurer <bmeurer@chromium.org> Reviewed-by: Yang Guo <yangguo@chromium.org> Cr-Commit-Position: refs/heads/master@{#74249}
43 lines
1.1 KiB
JavaScript
43 lines
1.1 KiB
JavaScript
// Copyright 2018 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: --allow-natives-syntax
|
|
|
|
Debug = debug.Debug;
|
|
|
|
function test(i) {
|
|
if (i == 3) {
|
|
return (function* gen() { yield test(i - 1); })().next().value;
|
|
} else if (i > 1) {
|
|
return test(i - 1);
|
|
} else {
|
|
debugger;
|
|
return 5;
|
|
}
|
|
}
|
|
|
|
let patch = null, exception = null;
|
|
|
|
Debug.setListener(listener);
|
|
patch = ['return 5', 'return 3'];
|
|
assertEquals(5, test(2)); // generator on stack
|
|
assertEquals(exception,
|
|
'LiveEdit failed: BLOCKED_BY_ACTIVE_FUNCTION');
|
|
patch = ['return 3', 'return -1'];
|
|
assertEquals(5, test(5)); // there is running generator
|
|
assertEquals(exception,
|
|
'LiveEdit failed: BLOCKED_BY_ACTIVE_FUNCTION');
|
|
Debug.setListener(null);
|
|
|
|
function listener(event) {
|
|
if (event != Debug.DebugEvent.Break || !patch) return;
|
|
try {
|
|
%LiveEditPatchScript(test,
|
|
Debug.scriptSource(test).replace(patch[0], patch[1]));
|
|
} catch (e) {
|
|
exception = e;
|
|
}
|
|
patch = null;
|
|
}
|