Commit c46aa5bc authored by Alexey Kozyatinskiy's avatar Alexey Kozyatinskiy Committed by Commit Bot

[debug] removed live_edit flag and reimplemented LiveEdit::RestartFrame

It looks like we do not need live_edit flag.

R=dgozman@chromium.org,yangguo@chromium.org

Bug: v8:7862
Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng
Change-Id: I2b635f7d24138894b7a0f94fc90293d50e40f22c
Reviewed-on: https://chromium-review.googlesource.com/1108386
Commit-Queue: Aleksey Kozyatinskiy <kozyatinskiy@chromium.org>
Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#53980}
parent cf2f6a57
...@@ -9139,11 +9139,6 @@ v8_inspector::V8Inspector* debug::GetInspector(Isolate* isolate) { ...@@ -9139,11 +9139,6 @@ v8_inspector::V8Inspector* debug::GetInspector(Isolate* isolate) {
return reinterpret_cast<i::Isolate*>(isolate)->inspector(); return reinterpret_cast<i::Isolate*>(isolate)->inspector();
} }
void debug::SetLiveEditEnabled(Isolate* isolate, bool enable) {
i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate);
internal_isolate->debug()->set_live_edit_enabled(enable);
}
void debug::SetBreakOnNextFunctionCall(Isolate* isolate) { void debug::SetBreakOnNextFunctionCall(Isolate* isolate) {
reinterpret_cast<i::Isolate*>(isolate)->debug()->SetBreakOnNextFunctionCall(); reinterpret_cast<i::Isolate*>(isolate)->debug()->SetBreakOnNextFunctionCall();
} }
......
...@@ -2350,8 +2350,6 @@ class InspectorClient : public v8_inspector::V8InspectorClient { ...@@ -2350,8 +2350,6 @@ class InspectorClient : public v8_inspector::V8InspectorClient {
.ToLocalChecked(); .ToLocalChecked();
CHECK(context->Global()->Set(context, function_name, function).FromJust()); CHECK(context->Global()->Set(context, function_name, function).FromJust());
v8::debug::SetLiveEditEnabled(isolate_, true);
context_.Reset(isolate_, context); context_.Reset(isolate_, context);
} }
......
...@@ -34,13 +34,6 @@ int GetContextId(Local<Context> context); ...@@ -34,13 +34,6 @@ int GetContextId(Local<Context> context);
void SetInspector(Isolate* isolate, v8_inspector::V8Inspector*); void SetInspector(Isolate* isolate, v8_inspector::V8Inspector*);
v8_inspector::V8Inspector* GetInspector(Isolate* isolate); v8_inspector::V8Inspector* GetInspector(Isolate* isolate);
/**
* Enable/disable LiveEdit functionality for the given Isolate
* (default Isolate if not provided). V8 will abort if LiveEdit is
* unexpectedly used. LiveEdit is enabled by default.
*/
V8_EXPORT_PRIVATE void SetLiveEditEnabled(Isolate* isolate, bool enable);
// Schedule a debugger break to happen when function is called inside given // Schedule a debugger break to happen when function is called inside given
// isolate. // isolate.
void SetBreakOnNextFunctionCall(Isolate* isolate); void SetBreakOnNextFunctionCall(Isolate* isolate);
......
...@@ -83,7 +83,6 @@ Debug::Debug(Isolate* isolate) ...@@ -83,7 +83,6 @@ Debug::Debug(Isolate* isolate)
is_active_(false), is_active_(false),
hook_on_function_call_(false), hook_on_function_call_(false),
is_suppressed_(false), is_suppressed_(false),
live_edit_enabled_(false),
break_disabled_(false), break_disabled_(false),
break_points_active_(true), break_points_active_(true),
break_on_exception_(false), break_on_exception_(false),
...@@ -1912,17 +1911,16 @@ bool Debug::SetScriptSource(Handle<Script> script, Handle<String> source, ...@@ -1912,17 +1911,16 @@ bool Debug::SetScriptSource(Handle<Script> script, Handle<String> source,
thread_local_.break_frame_id_ = frame_id; thread_local_.break_frame_id_ = frame_id;
} }
set_live_edit_enabled(true);
Handle<Object> script_wrapper = Script::GetWrapper(script); Handle<Object> script_wrapper = Script::GetWrapper(script);
Handle<Object> argv[] = {script_wrapper, source, Handle<Object> argv[] = {script_wrapper, source,
isolate_->factory()->ToBoolean(preview), isolate_->factory()->ToBoolean(preview),
isolate_->factory()->NewJSArray(0)}; isolate_->factory()->NewJSArray(0)};
Handle<Object> result; Handle<Object> result;
MaybeHandle<Object> maybe_exception; MaybeHandle<Object> maybe_exception;
running_live_edit_ = true;
if (!CallFunction("SetScriptSource", arraysize(argv), argv, &maybe_exception) if (!CallFunction("SetScriptSource", arraysize(argv), argv, &maybe_exception)
.ToHandle(&result)) { .ToHandle(&result)) {
Handle<Object> pending_exception = maybe_exception.ToHandleChecked(); Handle<Object> pending_exception = maybe_exception.ToHandleChecked();
set_live_edit_enabled(false);
if (pending_exception->IsJSObject()) { if (pending_exception->IsJSObject()) {
Handle<JSObject> exception = Handle<JSObject>::cast(pending_exception); Handle<JSObject> exception = Handle<JSObject>::cast(pending_exception);
Handle<String> message = Handle<String>::cast( Handle<String> message = Handle<String>::cast(
...@@ -1947,15 +1945,16 @@ bool Debug::SetScriptSource(Handle<Script> script, Handle<String> source, ...@@ -1947,15 +1945,16 @@ bool Debug::SetScriptSource(Handle<Script> script, Handle<String> source,
output->message = Utils::ToLocal(error); output->message = Utils::ToLocal(error);
} }
} }
running_live_edit_ = false;
return false; return false;
} }
set_live_edit_enabled(false);
Handle<Object> stack_changed_value = Handle<Object> stack_changed_value =
JSReceiver::GetProperty(isolate_, Handle<JSObject>::cast(result), JSReceiver::GetProperty(isolate_, Handle<JSObject>::cast(result),
"stack_modified") "stack_modified")
.ToHandleChecked(); .ToHandleChecked();
output->stack_changed = stack_changed_value->IsTrue(isolate_); output->stack_changed = stack_changed_value->IsTrue(isolate_);
output->status = debug::LiveEditResult::OK; output->status = debug::LiveEditResult::OK;
running_live_edit_ = false;
return true; return true;
} }
...@@ -1984,7 +1983,7 @@ void Debug::ProcessCompileEvent(bool has_compile_error, Handle<Script> script) { ...@@ -1984,7 +1983,7 @@ void Debug::ProcessCompileEvent(bool has_compile_error, Handle<Script> script) {
DisableBreak no_recursive_break(this); DisableBreak no_recursive_break(this);
AllowJavascriptExecution allow_script(isolate_); AllowJavascriptExecution allow_script(isolate_);
debug_delegate_->ScriptCompiled(ToApiHandle<debug::Script>(script), debug_delegate_->ScriptCompiled(ToApiHandle<debug::Script>(script),
live_edit_enabled(), has_compile_error); running_live_edit_, has_compile_error);
} }
......
...@@ -348,11 +348,6 @@ class Debug { ...@@ -348,11 +348,6 @@ class Debug {
} }
inline Handle<Context> debug_context() { return debug_context_; } inline Handle<Context> debug_context() { return debug_context_; }
void set_live_edit_enabled(bool v) { live_edit_enabled_ = v; }
bool live_edit_enabled() const {
return FLAG_enable_liveedit && live_edit_enabled_;
}
inline bool is_active() const { return is_active_; } inline bool is_active() const { return is_active_; }
inline bool is_loaded() const { return !debug_context_.is_null(); } inline bool is_loaded() const { return !debug_context_.is_null(); }
inline bool in_debug_scope() const { inline bool in_debug_scope() const {
...@@ -499,8 +494,8 @@ class Debug { ...@@ -499,8 +494,8 @@ class Debug {
bool hook_on_function_call_; bool hook_on_function_call_;
// Suppress debug events. // Suppress debug events.
bool is_suppressed_; bool is_suppressed_;
// LiveEdit is enabled. // Running liveedit.
bool live_edit_enabled_; bool running_live_edit_ = false;
// Do not trigger debug break events. // Do not trigger debug break events.
bool break_disabled_; bool break_disabled_;
// Do not break on break points. // Do not break on break points.
......
...@@ -1419,63 +1419,37 @@ Handle<JSArray> LiveEdit::CheckAndDropActivations( ...@@ -1419,63 +1419,37 @@ Handle<JSArray> LiveEdit::CheckAndDropActivations(
return result; return result;
} }
bool LiveEdit::RestartFrame(JavaScriptFrame* frame) {
// Describes a single callframe a target. Not finding this frame if (!LiveEdit::kFrameDropperSupported) return false;
// means an error. Isolate* isolate = frame->isolate();
class SingleFrameTarget { Zone zone(isolate->allocator(), ZONE_NAME);
public: Vector<StackFrame*> frames = CreateStackMap(isolate, &zone);
explicit SingleFrameTarget(JavaScriptFrame* frame) StackFrame::Id break_frame_id = isolate->debug()->break_frame_id();
: m_frame(frame), bool break_frame_found = break_frame_id == StackFrame::NO_ID;
m_saved_status(LiveEdit::FUNCTION_AVAILABLE_FOR_PATCH) {} for (StackFrame* current : frames) {
break_frame_found = break_frame_found || break_frame_id == current->id();
bool MatchActivation(StackFrame* frame, if (current->fp() == frame->fp()) {
LiveEdit::FunctionPatchabilityStatus status) { if (break_frame_found) {
if (frame->fp() == m_frame->fp()) { isolate->debug()->ScheduleFrameRestart(current);
m_saved_status = status;
return true; return true;
} } else {
return false; return false;
} }
const char* GetNotFoundMessage() const {
return "Failed to found requested frame";
} }
LiveEdit::FunctionPatchabilityStatus saved_status() { if (!break_frame_found) continue;
return m_saved_status; if (current->is_exit() || current->is_builtin_exit()) {
} return false;
void set_status(LiveEdit::FunctionPatchabilityStatus status) {
m_saved_status = status;
}
bool FrameUsesNewTarget(StackFrame* frame) {
if (!frame->is_java_script()) return false;
JavaScriptFrame* jsframe = JavaScriptFrame::cast(frame);
Handle<SharedFunctionInfo> shared(jsframe->function()->shared(),
jsframe->isolate());
return shared->scope_info()->HasNewTarget();
} }
if (!current->is_java_script()) continue;
private: std::vector<Handle<SharedFunctionInfo>> shareds;
JavaScriptFrame* m_frame; JavaScriptFrame::cast(current)->GetFunctions(&shareds);
LiveEdit::FunctionPatchabilityStatus m_saved_status; for (auto& shared : shareds) {
}; if (IsResumableFunction(shared->kind())) {
return false;
// Finds a drops required frame and all frames above.
// Returns error message or nullptr.
const char* LiveEdit::RestartFrame(JavaScriptFrame* frame) {
SingleFrameTarget target(frame);
const char* result =
DropActivationsInActiveThreadImpl(frame->isolate(), target, true);
if (result != nullptr) {
return result;
} }
if (target.saved_status() == LiveEdit::FUNCTION_BLOCKED_UNDER_NATIVE_CODE) {
return "Function is blocked under native code";
} }
if (target.saved_status() == LiveEdit::FUNCTION_BLOCKED_UNDER_GENERATOR) {
return "Function is blocked under a generator activation";
} }
return nullptr; return false;
} }
Handle<JSArray> LiveEditFunctionTracker::Collect(FunctionLiteral* node, Handle<JSArray> LiveEditFunctionTracker::Collect(FunctionLiteral* node,
......
...@@ -135,8 +135,7 @@ class LiveEdit : AllStatic { ...@@ -135,8 +135,7 @@ class LiveEdit : AllStatic {
bool do_drop); bool do_drop);
// Restarts the call frame and completely drops all frames above it. // Restarts the call frame and completely drops all frames above it.
// Return error message or nullptr. static bool RestartFrame(JavaScriptFrame* frame);
static const char* RestartFrame(JavaScriptFrame* frame);
static void CompareStrings(Isolate* isolate, Handle<String> a, static void CompareStrings(Isolate* isolate, Handle<String> a,
Handle<String> b, Handle<String> b,
......
...@@ -911,7 +911,6 @@ DEFINE_IMPLICATION(trace_array_abuse, trace_js_array_abuse) ...@@ -911,7 +911,6 @@ DEFINE_IMPLICATION(trace_array_abuse, trace_js_array_abuse)
DEFINE_IMPLICATION(trace_array_abuse, trace_external_array_abuse) DEFINE_IMPLICATION(trace_array_abuse, trace_external_array_abuse)
// debugger // debugger
DEFINE_BOOL(enable_liveedit, true, "enable liveedit experimental feature")
DEFINE_BOOL( DEFINE_BOOL(
trace_side_effect_free_debug_evaluate, false, trace_side_effect_free_debug_evaluate, false,
"print debug messages for side-effect-free debug-evaluate for testing") "print debug messages for side-effect-free debug-evaluate for testing")
......
...@@ -20,7 +20,6 @@ namespace internal { ...@@ -20,7 +20,6 @@ namespace internal {
// in OpaqueReferences. // in OpaqueReferences.
RUNTIME_FUNCTION(Runtime_LiveEditFindSharedFunctionInfosForScript) { RUNTIME_FUNCTION(Runtime_LiveEditFindSharedFunctionInfosForScript) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(1, args.length()); DCHECK_EQ(1, args.length());
CONVERT_ARG_CHECKED(JSValue, script_value, 0); CONVERT_ARG_CHECKED(JSValue, script_value, 0);
...@@ -63,7 +62,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFindSharedFunctionInfosForScript) { ...@@ -63,7 +62,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFindSharedFunctionInfosForScript) {
// with the function itself going first. The root function is a script function. // with the function itself going first. The root function is a script function.
RUNTIME_FUNCTION(Runtime_LiveEditGatherCompileInfo) { RUNTIME_FUNCTION(Runtime_LiveEditGatherCompileInfo) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(2, args.length()); DCHECK_EQ(2, args.length());
CONVERT_ARG_CHECKED(JSValue, script, 0); CONVERT_ARG_CHECKED(JSValue, script, 0);
CONVERT_ARG_HANDLE_CHECKED(String, source, 1); CONVERT_ARG_HANDLE_CHECKED(String, source, 1);
...@@ -81,7 +79,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditGatherCompileInfo) { ...@@ -81,7 +79,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditGatherCompileInfo) {
// the script with its original source and sends notification to debugger. // the script with its original source and sends notification to debugger.
RUNTIME_FUNCTION(Runtime_LiveEditReplaceScript) { RUNTIME_FUNCTION(Runtime_LiveEditReplaceScript) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(3, args.length()); DCHECK_EQ(3, args.length());
CONVERT_ARG_CHECKED(JSValue, original_script_value, 0); CONVERT_ARG_CHECKED(JSValue, original_script_value, 0);
CONVERT_ARG_HANDLE_CHECKED(String, new_source, 1); CONVERT_ARG_HANDLE_CHECKED(String, new_source, 1);
...@@ -105,7 +102,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditReplaceScript) { ...@@ -105,7 +102,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditReplaceScript) {
// SharedFunctionInfos. // SharedFunctionInfos.
RUNTIME_FUNCTION(Runtime_LiveEditFixupScript) { RUNTIME_FUNCTION(Runtime_LiveEditFixupScript) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(args.length(), 2); DCHECK_EQ(args.length(), 2);
CONVERT_ARG_CHECKED(JSValue, script_value, 0); CONVERT_ARG_CHECKED(JSValue, script_value, 0);
CONVERT_INT32_ARG_CHECKED(max_function_literal_id, 1); CONVERT_INT32_ARG_CHECKED(max_function_literal_id, 1);
...@@ -119,7 +115,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFixupScript) { ...@@ -119,7 +115,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFixupScript) {
RUNTIME_FUNCTION(Runtime_LiveEditFunctionSourceUpdated) { RUNTIME_FUNCTION(Runtime_LiveEditFunctionSourceUpdated) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(args.length(), 2); DCHECK_EQ(args.length(), 2);
CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 0); CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 0);
CONVERT_INT32_ARG_CHECKED(new_function_literal_id, 1); CONVERT_INT32_ARG_CHECKED(new_function_literal_id, 1);
...@@ -133,7 +128,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFunctionSourceUpdated) { ...@@ -133,7 +128,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFunctionSourceUpdated) {
// Replaces code of SharedFunctionInfo with a new one. // Replaces code of SharedFunctionInfo with a new one.
RUNTIME_FUNCTION(Runtime_LiveEditReplaceFunctionCode) { RUNTIME_FUNCTION(Runtime_LiveEditReplaceFunctionCode) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(2, args.length()); DCHECK_EQ(2, args.length());
CONVERT_ARG_HANDLE_CHECKED(JSArray, new_compile_info, 0); CONVERT_ARG_HANDLE_CHECKED(JSArray, new_compile_info, 0);
CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 1); CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 1);
...@@ -147,7 +141,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditReplaceFunctionCode) { ...@@ -147,7 +141,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditReplaceFunctionCode) {
// Connects SharedFunctionInfo to another script. // Connects SharedFunctionInfo to another script.
RUNTIME_FUNCTION(Runtime_LiveEditFunctionSetScript) { RUNTIME_FUNCTION(Runtime_LiveEditFunctionSetScript) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(2, args.length()); DCHECK_EQ(2, args.length());
CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0);
CONVERT_ARG_HANDLE_CHECKED(Object, script_object, 1); CONVERT_ARG_HANDLE_CHECKED(Object, script_object, 1);
...@@ -174,7 +167,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFunctionSetScript) { ...@@ -174,7 +167,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditFunctionSetScript) {
// with a substitution one. // with a substitution one.
RUNTIME_FUNCTION(Runtime_LiveEditReplaceRefToNestedFunction) { RUNTIME_FUNCTION(Runtime_LiveEditReplaceRefToNestedFunction) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(3, args.length()); DCHECK_EQ(3, args.length());
CONVERT_ARG_HANDLE_CHECKED(JSValue, parent_wrapper, 0); CONVERT_ARG_HANDLE_CHECKED(JSValue, parent_wrapper, 0);
...@@ -197,7 +189,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditReplaceRefToNestedFunction) { ...@@ -197,7 +189,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditReplaceRefToNestedFunction) {
// Each group describes a change in text; groups are sorted by change_begin. // Each group describes a change in text; groups are sorted by change_begin.
RUNTIME_FUNCTION(Runtime_LiveEditPatchFunctionPositions) { RUNTIME_FUNCTION(Runtime_LiveEditPatchFunctionPositions) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(2, args.length()); DCHECK_EQ(2, args.length());
CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0); CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0);
CONVERT_ARG_HANDLE_CHECKED(JSArray, position_change_array, 1); CONVERT_ARG_HANDLE_CHECKED(JSArray, position_change_array, 1);
...@@ -214,7 +205,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditPatchFunctionPositions) { ...@@ -214,7 +205,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditPatchFunctionPositions) {
// LiveEdit::FunctionPatchabilityStatus type. // LiveEdit::FunctionPatchabilityStatus type.
RUNTIME_FUNCTION(Runtime_LiveEditCheckAndDropActivations) { RUNTIME_FUNCTION(Runtime_LiveEditCheckAndDropActivations) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(3, args.length()); DCHECK_EQ(3, args.length());
CONVERT_ARG_HANDLE_CHECKED(JSArray, old_shared_array, 0); CONVERT_ARG_HANDLE_CHECKED(JSArray, old_shared_array, 0);
CONVERT_ARG_HANDLE_CHECKED(JSArray, new_shared_array, 1); CONVERT_ARG_HANDLE_CHECKED(JSArray, new_shared_array, 1);
...@@ -252,7 +242,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditCheckAndDropActivations) { ...@@ -252,7 +242,6 @@ RUNTIME_FUNCTION(Runtime_LiveEditCheckAndDropActivations) {
// of diff chunks. // of diff chunks.
RUNTIME_FUNCTION(Runtime_LiveEditCompareStrings) { RUNTIME_FUNCTION(Runtime_LiveEditCompareStrings) {
HandleScope scope(isolate); HandleScope scope(isolate);
CHECK(isolate->debug()->live_edit_enabled());
DCHECK_EQ(2, args.length()); DCHECK_EQ(2, args.length());
CONVERT_ARG_HANDLE_CHECKED(String, s1, 0); CONVERT_ARG_HANDLE_CHECKED(String, s1, 0);
CONVERT_ARG_HANDLE_CHECKED(String, s2, 1); CONVERT_ARG_HANDLE_CHECKED(String, s2, 1);
......
...@@ -3660,24 +3660,6 @@ TEST(DebuggerCreatesContextIffActive) { ...@@ -3660,24 +3660,6 @@ TEST(DebuggerCreatesContextIffActive) {
v8::debug::SetDebugDelegate(env->GetIsolate(), nullptr); v8::debug::SetDebugDelegate(env->GetIsolate(), nullptr);
} }
TEST(LiveEditEnabled) {
v8::internal::FLAG_allow_natives_syntax = true;
LocalContext env;
v8::HandleScope scope(env->GetIsolate());
v8::debug::SetLiveEditEnabled(env->GetIsolate(), true);
CompileRun("%LiveEditCompareStrings('', '')");
}
TEST(LiveEditDisabled) {
v8::internal::FLAG_allow_natives_syntax = true;
LocalContext env;
v8::HandleScope scope(env->GetIsolate());
v8::debug::SetLiveEditEnabled(env->GetIsolate(), false);
CompileRun("%LiveEditCompareStrings('', '')");
}
class DebugBreakStackTraceListener : public v8::debug::DebugDelegate { class DebugBreakStackTraceListener : public v8::debug::DebugDelegate {
public: public:
void BreakProgramRequested(v8::Local<v8::Context> paused_context, void BreakProgramRequested(v8::Local<v8::Context> paused_context,
......
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