Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(125)

Unified Diff: src/liveedit.cc

Issue 273433002: Revert "Prevent liveedit on or under generators with open activations" (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/liveedit.h ('k') | src/liveedit-debugger.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/liveedit.cc
diff --git a/src/liveedit.cc b/src/liveedit.cc
index c3dd872352b17364a48ba96991726ca9b23a2c30..e6bb4b29a636297d25d1d69c9ca7ff3a7b1edb52 100644
--- a/src/liveedit.cc
+++ b/src/liveedit.cc
@@ -1682,6 +1682,11 @@ static const char* DropFrames(Vector<StackFrame*> frames,
}
+static bool IsDropableFrame(StackFrame* frame) {
+ return !frame->is_exit();
+}
+
+
// Describes a set of call frames that execute any of listed functions.
// Finding no such frames does not mean error.
class MultipleFunctionTarget {
@@ -1735,20 +1740,12 @@ static const char* DropActivationsInActiveThreadImpl(
bool target_frame_found = false;
int bottom_js_frame_index = top_frame_index;
- bool non_droppable_frame_found = false;
- LiveEdit::FunctionPatchabilityStatus non_droppable_reason;
+ bool c_code_found = false;
for (; frame_index < frames.length(); frame_index++) {
StackFrame* frame = frames[frame_index];
- if (frame->is_exit()) {
- non_droppable_frame_found = true;
- non_droppable_reason = LiveEdit::FUNCTION_BLOCKED_UNDER_NATIVE_CODE;
- break;
- }
- if (!frame->is_java_script()) continue;
- if (JavaScriptFrame::cast(frame)->function()->shared()->is_generator()) {
- non_droppable_frame_found = true;
- non_droppable_reason = LiveEdit::FUNCTION_BLOCKED_UNDER_GENERATOR;
+ if (!IsDropableFrame(frame)) {
+ c_code_found = true;
break;
}
if (target.MatchActivation(
@@ -1758,15 +1755,15 @@ static const char* DropActivationsInActiveThreadImpl(
}
}
- if (non_droppable_frame_found) {
- // There is a C or generator frame on stack. We can't drop C frames, and we
- // can't restart generators. Check that there are no target frames below
- // them.
+ if (c_code_found) {
+ // There is a C frames on stack. Check that there are no target frames
+ // below them.
for (; frame_index < frames.length(); frame_index++) {
StackFrame* frame = frames[frame_index];
if (frame->is_java_script()) {
- if (target.MatchActivation(frame, non_droppable_reason)) {
- // Fail.
+ if (target.MatchActivation(
+ frame, LiveEdit::FUNCTION_BLOCKED_UNDER_NATIVE_CODE)) {
+ // Cannot drop frame under C frames.
return NULL;
}
}
@@ -1836,47 +1833,6 @@ static const char* DropActivationsInActiveThread(
}
-bool LiveEdit::FindActiveGenerators(Handle<FixedArray> shared_info_array,
- Handle<FixedArray> result,
- int len) {
- Isolate* isolate = shared_info_array->GetIsolate();
- Heap* heap = isolate->heap();
- heap->EnsureHeapIsIterable();
- bool found_suspended_activations = false;
-
- ASSERT_LE(len, result->length());
-
- DisallowHeapAllocation no_allocation;
-
- FunctionPatchabilityStatus active = FUNCTION_BLOCKED_ACTIVE_GENERATOR;
-
- HeapIterator iterator(heap);
- HeapObject* obj = NULL;
- while ((obj = iterator.next()) != NULL) {
- if (!obj->IsJSGeneratorObject()) continue;
-
- JSGeneratorObject* gen = JSGeneratorObject::cast(obj);
- if (gen->is_closed()) continue;
-
- HandleScope scope(isolate);
-
- for (int i = 0; i < len; i++) {
- Handle<JSValue> jsvalue =
- Handle<JSValue>::cast(FixedArray::get(shared_info_array, i));
- Handle<SharedFunctionInfo> shared =
- UnwrapSharedFunctionInfoFromJSValue(jsvalue);
-
- if (gen->function()->shared() == *shared) {
- result->set(i, Smi::FromInt(active));
- found_suspended_activations = true;
- }
- }
- }
-
- return found_suspended_activations;
-}
-
-
class InactiveThreadActivationsChecker : public ThreadVisitor {
public:
InactiveThreadActivationsChecker(Handle<JSArray> shared_info_array,
@@ -1907,29 +1863,18 @@ Handle<JSArray> LiveEdit::CheckAndDropActivations(
Isolate* isolate = shared_info_array->GetIsolate();
int len = GetArrayLength(shared_info_array);
- CHECK(shared_info_array->HasFastElements());
- Handle<FixedArray> shared_info_array_elements(
- FixedArray::cast(shared_info_array->elements()));
-
Handle<JSArray> result = isolate->factory()->NewJSArray(len);
- Handle<FixedArray> result_elements =
- JSObject::EnsureWritableFastElements(result);
// Fill the default values.
for (int i = 0; i < len; i++) {
- FunctionPatchabilityStatus status = FUNCTION_AVAILABLE_FOR_PATCH;
- result_elements->set(i, Smi::FromInt(status));
+ SetElementSloppy(
+ result,
+ i,
+ Handle<Smi>(Smi::FromInt(FUNCTION_AVAILABLE_FOR_PATCH), isolate));
}
- // Scan the heap for active generators -- those that are either currently
- // running (as we wouldn't want to restart them, because we don't know where
- // to restart them from) or suspended. Fail if any one corresponds to the set
- // of functions being edited.
- if (FindActiveGenerators(shared_info_array_elements, result_elements, len)) {
- return result;
- }
- // Check inactive threads. Fail if some functions are blocked there.
+ // First check inactive threads. Fail if some functions are blocked there.
InactiveThreadActivationsChecker inactive_threads_checker(shared_info_array,
result);
isolate->thread_manager()->IterateArchivedThreads(
@@ -1992,9 +1937,6 @@ const char* LiveEdit::RestartFrame(JavaScriptFrame* frame) {
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 NULL;
}
« no previous file with comments | « src/liveedit.h ('k') | src/liveedit-debugger.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698