| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 | 5 |
| 6 #include "src/v8.h" | 6 #include "src/v8.h" |
| 7 | 7 |
| 8 #include "src/liveedit.h" | 8 #include "src/liveedit.h" |
| 9 | 9 |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 1730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1741 const char* GetNotFoundMessage() const { | 1741 const char* GetNotFoundMessage() const { |
| 1742 return NULL; | 1742 return NULL; |
| 1743 } | 1743 } |
| 1744 private: | 1744 private: |
| 1745 Handle<JSArray> m_shared_info_array; | 1745 Handle<JSArray> m_shared_info_array; |
| 1746 Handle<JSArray> m_result; | 1746 Handle<JSArray> m_result; |
| 1747 }; | 1747 }; |
| 1748 | 1748 |
| 1749 | 1749 |
| 1750 // Drops all call frame matched by target and all frames above them. | 1750 // Drops all call frame matched by target and all frames above them. |
| 1751 template<typename TARGET> | 1751 template <typename TARGET> |
| 1752 static const char* DropActivationsInActiveThreadImpl( | 1752 static const char* DropActivationsInActiveThreadImpl(Isolate* isolate, |
| 1753 Isolate* isolate, | 1753 TARGET& target, // NOLINT |
| 1754 TARGET& target, // NOLINT | 1754 bool do_drop) { |
| 1755 bool do_drop) { | |
| 1756 Debug* debug = isolate->debug(); | 1755 Debug* debug = isolate->debug(); |
| 1757 Zone zone(isolate); | 1756 Zone zone; |
| 1758 Vector<StackFrame*> frames = CreateStackMap(isolate, &zone); | 1757 Vector<StackFrame*> frames = CreateStackMap(isolate, &zone); |
| 1759 | 1758 |
| 1760 | 1759 |
| 1761 int top_frame_index = -1; | 1760 int top_frame_index = -1; |
| 1762 int frame_index = 0; | 1761 int frame_index = 0; |
| 1763 for (; frame_index < frames.length(); frame_index++) { | 1762 for (; frame_index < frames.length(); frame_index++) { |
| 1764 StackFrame* frame = frames[frame_index]; | 1763 StackFrame* frame = frames[frame_index]; |
| 1765 if (frame->id() == debug->break_frame_id()) { | 1764 if (frame->id() == debug->break_frame_id()) { |
| 1766 top_frame_index = frame_index; | 1765 top_frame_index = frame_index; |
| 1767 break; | 1766 break; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1851 new_id, drop_mode, restarter_frame_function_pointer); | 1850 new_id, drop_mode, restarter_frame_function_pointer); |
| 1852 return NULL; | 1851 return NULL; |
| 1853 } | 1852 } |
| 1854 | 1853 |
| 1855 | 1854 |
| 1856 // Fills result array with statuses of functions. Modifies the stack | 1855 // Fills result array with statuses of functions. Modifies the stack |
| 1857 // removing all listed function if possible and if do_drop is true. | 1856 // removing all listed function if possible and if do_drop is true. |
| 1858 static const char* DropActivationsInActiveThread( | 1857 static const char* DropActivationsInActiveThread( |
| 1859 Handle<JSArray> shared_info_array, Handle<JSArray> result, bool do_drop) { | 1858 Handle<JSArray> shared_info_array, Handle<JSArray> result, bool do_drop) { |
| 1860 MultipleFunctionTarget target(shared_info_array, result); | 1859 MultipleFunctionTarget target(shared_info_array, result); |
| 1860 Isolate* isolate = shared_info_array->GetIsolate(); |
| 1861 | 1861 |
| 1862 const char* message = DropActivationsInActiveThreadImpl( | 1862 const char* message = |
| 1863 shared_info_array->GetIsolate(), target, do_drop); | 1863 DropActivationsInActiveThreadImpl(isolate, target, do_drop); |
| 1864 if (message) { | 1864 if (message) { |
| 1865 return message; | 1865 return message; |
| 1866 } | 1866 } |
| 1867 | 1867 |
| 1868 Isolate* isolate = shared_info_array->GetIsolate(); | |
| 1869 int array_len = GetArrayLength(shared_info_array); | 1868 int array_len = GetArrayLength(shared_info_array); |
| 1870 | 1869 |
| 1871 // Replace "blocked on active" with "replaced on active" status. | 1870 // Replace "blocked on active" with "replaced on active" status. |
| 1872 for (int i = 0; i < array_len; i++) { | 1871 for (int i = 0; i < array_len; i++) { |
| 1873 Handle<Object> obj = | 1872 Handle<Object> obj = |
| 1874 Object::GetElement(isolate, result, i).ToHandleChecked(); | 1873 Object::GetElement(isolate, result, i).ToHandleChecked(); |
| 1875 if (*obj == Smi::FromInt(LiveEdit::FUNCTION_BLOCKED_ON_ACTIVE_STACK)) { | 1874 if (*obj == Smi::FromInt(LiveEdit::FUNCTION_BLOCKED_ON_ACTIVE_STACK)) { |
| 1876 Handle<Object> replaced( | 1875 Handle<Object> replaced( |
| 1877 Smi::FromInt(LiveEdit::FUNCTION_REPLACED_ON_ACTIVE_STACK), isolate); | 1876 Smi::FromInt(LiveEdit::FUNCTION_REPLACED_ON_ACTIVE_STACK), isolate); |
| 1878 SetElementSloppy(result, i, replaced); | 1877 SetElementSloppy(result, i, replaced); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2020 JavaScriptFrame* m_frame; | 2019 JavaScriptFrame* m_frame; |
| 2021 LiveEdit::FunctionPatchabilityStatus m_saved_status; | 2020 LiveEdit::FunctionPatchabilityStatus m_saved_status; |
| 2022 }; | 2021 }; |
| 2023 | 2022 |
| 2024 | 2023 |
| 2025 // Finds a drops required frame and all frames above. | 2024 // Finds a drops required frame and all frames above. |
| 2026 // Returns error message or NULL. | 2025 // Returns error message or NULL. |
| 2027 const char* LiveEdit::RestartFrame(JavaScriptFrame* frame) { | 2026 const char* LiveEdit::RestartFrame(JavaScriptFrame* frame) { |
| 2028 SingleFrameTarget target(frame); | 2027 SingleFrameTarget target(frame); |
| 2029 | 2028 |
| 2030 const char* result = DropActivationsInActiveThreadImpl( | 2029 const char* result = |
| 2031 frame->isolate(), target, true); | 2030 DropActivationsInActiveThreadImpl(frame->isolate(), target, true); |
| 2032 if (result != NULL) { | 2031 if (result != NULL) { |
| 2033 return result; | 2032 return result; |
| 2034 } | 2033 } |
| 2035 if (target.saved_status() == LiveEdit::FUNCTION_BLOCKED_UNDER_NATIVE_CODE) { | 2034 if (target.saved_status() == LiveEdit::FUNCTION_BLOCKED_UNDER_NATIVE_CODE) { |
| 2036 return "Function is blocked under native code"; | 2035 return "Function is blocked under native code"; |
| 2037 } | 2036 } |
| 2038 if (target.saved_status() == LiveEdit::FUNCTION_BLOCKED_UNDER_GENERATOR) { | 2037 if (target.saved_status() == LiveEdit::FUNCTION_BLOCKED_UNDER_GENERATOR) { |
| 2039 return "Function is blocked under a generator activation"; | 2038 return "Function is blocked under a generator activation"; |
| 2040 } | 2039 } |
| 2041 return NULL; | 2040 return NULL; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2071 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) { | 2070 void LiveEditFunctionTracker::RecordRootFunctionInfo(Handle<Code> code) { |
| 2072 isolate_->active_function_info_listener()->FunctionCode(code); | 2071 isolate_->active_function_info_listener()->FunctionCode(code); |
| 2073 } | 2072 } |
| 2074 | 2073 |
| 2075 | 2074 |
| 2076 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { | 2075 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { |
| 2077 return isolate->active_function_info_listener() != NULL; | 2076 return isolate->active_function_info_listener() != NULL; |
| 2078 } | 2077 } |
| 2079 | 2078 |
| 2080 } } // namespace v8::internal | 2079 } } // namespace v8::internal |
| OLD | NEW |