| 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 #include "src/debug/liveedit.h" | 5 #include "src/debug/liveedit.h" |
| 6 | 6 |
| 7 #include "src/ast/scopeinfo.h" | 7 #include "src/ast/scopeinfo.h" |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
| (...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 fun->end_position(), fun->parameter_count(), | 703 fun->end_position(), fun->parameter_count(), |
| 704 fun->materialized_literal_count(), | 704 fun->materialized_literal_count(), |
| 705 current_parent_index_); | 705 current_parent_index_); |
| 706 current_parent_index_ = len_; | 706 current_parent_index_ = len_; |
| 707 SetElementSloppy(result_, len_, info.GetJSArray()); | 707 SetElementSloppy(result_, len_, info.GetJSArray()); |
| 708 len_++; | 708 len_++; |
| 709 } | 709 } |
| 710 | 710 |
| 711 void FunctionDone() { | 711 void FunctionDone() { |
| 712 HandleScope scope(isolate()); | 712 HandleScope scope(isolate()); |
| 713 FunctionInfoWrapper info = | 713 FunctionInfoWrapper info = FunctionInfoWrapper::cast( |
| 714 FunctionInfoWrapper::cast( | 714 *JSReceiver::GetElement(isolate(), result_, current_parent_index_) |
| 715 *Object::GetElement( | 715 .ToHandleChecked()); |
| 716 isolate(), result_, current_parent_index_).ToHandleChecked()); | |
| 717 current_parent_index_ = info.GetParentIndex(); | 716 current_parent_index_ = info.GetParentIndex(); |
| 718 } | 717 } |
| 719 | 718 |
| 720 // Saves only function code, because for a script function we | 719 // Saves only function code, because for a script function we |
| 721 // may never create a SharedFunctionInfo object. | 720 // may never create a SharedFunctionInfo object. |
| 722 void FunctionCode(Handle<Code> function_code) { | 721 void FunctionCode(Handle<Code> function_code) { |
| 723 FunctionInfoWrapper info = | 722 FunctionInfoWrapper info = FunctionInfoWrapper::cast( |
| 724 FunctionInfoWrapper::cast( | 723 *JSReceiver::GetElement(isolate(), result_, current_parent_index_) |
| 725 *Object::GetElement( | 724 .ToHandleChecked()); |
| 726 isolate(), result_, current_parent_index_).ToHandleChecked()); | |
| 727 info.SetFunctionCode(function_code, | 725 info.SetFunctionCode(function_code, |
| 728 Handle<HeapObject>(isolate()->heap()->null_value())); | 726 Handle<HeapObject>(isolate()->heap()->null_value())); |
| 729 } | 727 } |
| 730 | 728 |
| 731 // Saves full information about a function: its code, its scope info | 729 // Saves full information about a function: its code, its scope info |
| 732 // and a SharedFunctionInfo object. | 730 // and a SharedFunctionInfo object. |
| 733 void FunctionInfo(Handle<SharedFunctionInfo> shared, Scope* scope, | 731 void FunctionInfo(Handle<SharedFunctionInfo> shared, Scope* scope, |
| 734 Zone* zone) { | 732 Zone* zone) { |
| 735 if (!shared->IsSharedFunctionInfo()) { | 733 if (!shared->IsSharedFunctionInfo()) { |
| 736 return; | 734 return; |
| 737 } | 735 } |
| 738 FunctionInfoWrapper info = | 736 FunctionInfoWrapper info = FunctionInfoWrapper::cast( |
| 739 FunctionInfoWrapper::cast( | 737 *JSReceiver::GetElement(isolate(), result_, current_parent_index_) |
| 740 *Object::GetElement( | 738 .ToHandleChecked()); |
| 741 isolate(), result_, current_parent_index_).ToHandleChecked()); | |
| 742 info.SetFunctionCode(Handle<Code>(shared->code()), | 739 info.SetFunctionCode(Handle<Code>(shared->code()), |
| 743 Handle<HeapObject>(shared->scope_info())); | 740 Handle<HeapObject>(shared->scope_info())); |
| 744 info.SetSharedFunctionInfo(shared); | 741 info.SetSharedFunctionInfo(shared); |
| 745 | 742 |
| 746 Handle<Object> scope_info_list = SerializeFunctionScope(scope, zone); | 743 Handle<Object> scope_info_list = SerializeFunctionScope(scope, zone); |
| 747 info.SetFunctionScopeInfo(scope_info_list); | 744 info.SetFunctionScopeInfo(scope_info_list); |
| 748 } | 745 } |
| 749 | 746 |
| 750 Handle<JSArray> GetResult() { return result_; } | 747 Handle<JSArray> GetResult() { return result_; } |
| 751 | 748 |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1178 // If a positions is inside some region that changed, result is currently | 1175 // If a positions is inside some region that changed, result is currently |
| 1179 // undefined. | 1176 // undefined. |
| 1180 static int TranslatePosition(int original_position, | 1177 static int TranslatePosition(int original_position, |
| 1181 Handle<JSArray> position_change_array) { | 1178 Handle<JSArray> position_change_array) { |
| 1182 int position_diff = 0; | 1179 int position_diff = 0; |
| 1183 int array_len = GetArrayLength(position_change_array); | 1180 int array_len = GetArrayLength(position_change_array); |
| 1184 Isolate* isolate = position_change_array->GetIsolate(); | 1181 Isolate* isolate = position_change_array->GetIsolate(); |
| 1185 // TODO(635): binary search may be used here | 1182 // TODO(635): binary search may be used here |
| 1186 for (int i = 0; i < array_len; i += 3) { | 1183 for (int i = 0; i < array_len; i += 3) { |
| 1187 HandleScope scope(isolate); | 1184 HandleScope scope(isolate); |
| 1188 Handle<Object> element = Object::GetElement( | 1185 Handle<Object> element = |
| 1189 isolate, position_change_array, i).ToHandleChecked(); | 1186 JSReceiver::GetElement(isolate, position_change_array, i) |
| 1187 .ToHandleChecked(); |
| 1190 CHECK(element->IsSmi()); | 1188 CHECK(element->IsSmi()); |
| 1191 int chunk_start = Handle<Smi>::cast(element)->value(); | 1189 int chunk_start = Handle<Smi>::cast(element)->value(); |
| 1192 if (original_position < chunk_start) { | 1190 if (original_position < chunk_start) { |
| 1193 break; | 1191 break; |
| 1194 } | 1192 } |
| 1195 element = Object::GetElement( | 1193 element = JSReceiver::GetElement(isolate, position_change_array, i + 1) |
| 1196 isolate, position_change_array, i + 1).ToHandleChecked(); | 1194 .ToHandleChecked(); |
| 1197 CHECK(element->IsSmi()); | 1195 CHECK(element->IsSmi()); |
| 1198 int chunk_end = Handle<Smi>::cast(element)->value(); | 1196 int chunk_end = Handle<Smi>::cast(element)->value(); |
| 1199 // Position mustn't be inside a chunk. | 1197 // Position mustn't be inside a chunk. |
| 1200 DCHECK(original_position >= chunk_end); | 1198 DCHECK(original_position >= chunk_end); |
| 1201 element = Object::GetElement( | 1199 element = JSReceiver::GetElement(isolate, position_change_array, i + 2) |
| 1202 isolate, position_change_array, i + 2).ToHandleChecked(); | 1200 .ToHandleChecked(); |
| 1203 CHECK(element->IsSmi()); | 1201 CHECK(element->IsSmi()); |
| 1204 int chunk_changed_end = Handle<Smi>::cast(element)->value(); | 1202 int chunk_changed_end = Handle<Smi>::cast(element)->value(); |
| 1205 position_diff = chunk_changed_end - chunk_end; | 1203 position_diff = chunk_changed_end - chunk_end; |
| 1206 } | 1204 } |
| 1207 | 1205 |
| 1208 return original_position + position_diff; | 1206 return original_position + position_diff; |
| 1209 } | 1207 } |
| 1210 | 1208 |
| 1211 | 1209 |
| 1212 // Auto-growing buffer for writing relocation info code section. This buffer | 1210 // Auto-growing buffer for writing relocation info code section. This buffer |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 LiveEdit::FunctionPatchabilityStatus status) { | 1439 LiveEdit::FunctionPatchabilityStatus status) { |
| 1442 if (!frame->is_java_script()) return false; | 1440 if (!frame->is_java_script()) return false; |
| 1443 | 1441 |
| 1444 Handle<JSFunction> function(JavaScriptFrame::cast(frame)->function()); | 1442 Handle<JSFunction> function(JavaScriptFrame::cast(frame)->function()); |
| 1445 | 1443 |
| 1446 Isolate* isolate = shared_info_array->GetIsolate(); | 1444 Isolate* isolate = shared_info_array->GetIsolate(); |
| 1447 int len = GetArrayLength(shared_info_array); | 1445 int len = GetArrayLength(shared_info_array); |
| 1448 for (int i = 0; i < len; i++) { | 1446 for (int i = 0; i < len; i++) { |
| 1449 HandleScope scope(isolate); | 1447 HandleScope scope(isolate); |
| 1450 Handle<Object> element = | 1448 Handle<Object> element = |
| 1451 Object::GetElement(isolate, shared_info_array, i).ToHandleChecked(); | 1449 JSReceiver::GetElement(isolate, shared_info_array, i).ToHandleChecked(); |
| 1452 Handle<JSValue> jsvalue = Handle<JSValue>::cast(element); | 1450 Handle<JSValue> jsvalue = Handle<JSValue>::cast(element); |
| 1453 Handle<SharedFunctionInfo> shared = | 1451 Handle<SharedFunctionInfo> shared = |
| 1454 UnwrapSharedFunctionInfoFromJSValue(jsvalue); | 1452 UnwrapSharedFunctionInfoFromJSValue(jsvalue); |
| 1455 | 1453 |
| 1456 if (function->Inlines(*shared)) { | 1454 if (function->Inlines(*shared)) { |
| 1457 SetElementSloppy(result, i, Handle<Smi>(Smi::FromInt(status), isolate)); | 1455 SetElementSloppy(result, i, Handle<Smi>(Smi::FromInt(status), isolate)); |
| 1458 return true; | 1456 return true; |
| 1459 } | 1457 } |
| 1460 } | 1458 } |
| 1461 return false; | 1459 return false; |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1654 if (!frame->is_java_script()) return false; | 1652 if (!frame->is_java_script()) return false; |
| 1655 JavaScriptFrame* jsframe = JavaScriptFrame::cast(frame); | 1653 JavaScriptFrame* jsframe = JavaScriptFrame::cast(frame); |
| 1656 Handle<SharedFunctionInfo> old_shared(jsframe->function()->shared()); | 1654 Handle<SharedFunctionInfo> old_shared(jsframe->function()->shared()); |
| 1657 Isolate* isolate = old_shared->GetIsolate(); | 1655 Isolate* isolate = old_shared->GetIsolate(); |
| 1658 int len = GetArrayLength(old_shared_array_); | 1656 int len = GetArrayLength(old_shared_array_); |
| 1659 // Find corresponding new shared function info and return whether it | 1657 // Find corresponding new shared function info and return whether it |
| 1660 // references new.target. | 1658 // references new.target. |
| 1661 for (int i = 0; i < len; i++) { | 1659 for (int i = 0; i < len; i++) { |
| 1662 HandleScope scope(isolate); | 1660 HandleScope scope(isolate); |
| 1663 Handle<Object> old_element = | 1661 Handle<Object> old_element = |
| 1664 Object::GetElement(isolate, old_shared_array_, i).ToHandleChecked(); | 1662 JSReceiver::GetElement(isolate, old_shared_array_, i) |
| 1663 .ToHandleChecked(); |
| 1665 if (!old_shared.is_identical_to(UnwrapSharedFunctionInfoFromJSValue( | 1664 if (!old_shared.is_identical_to(UnwrapSharedFunctionInfoFromJSValue( |
| 1666 Handle<JSValue>::cast(old_element)))) { | 1665 Handle<JSValue>::cast(old_element)))) { |
| 1667 continue; | 1666 continue; |
| 1668 } | 1667 } |
| 1669 | 1668 |
| 1670 Handle<Object> new_element = | 1669 Handle<Object> new_element = |
| 1671 Object::GetElement(isolate, new_shared_array_, i).ToHandleChecked(); | 1670 JSReceiver::GetElement(isolate, new_shared_array_, i) |
| 1671 .ToHandleChecked(); |
| 1672 if (new_element->IsUndefined()) return false; | 1672 if (new_element->IsUndefined()) return false; |
| 1673 Handle<SharedFunctionInfo> new_shared = | 1673 Handle<SharedFunctionInfo> new_shared = |
| 1674 UnwrapSharedFunctionInfoFromJSValue( | 1674 UnwrapSharedFunctionInfoFromJSValue( |
| 1675 Handle<JSValue>::cast(new_element)); | 1675 Handle<JSValue>::cast(new_element)); |
| 1676 if (new_shared->scope_info()->HasNewTarget()) { | 1676 if (new_shared->scope_info()->HasNewTarget()) { |
| 1677 SetElementSloppy( | 1677 SetElementSloppy( |
| 1678 result_, i, | 1678 result_, i, |
| 1679 Handle<Smi>( | 1679 Handle<Smi>( |
| 1680 Smi::FromInt( | 1680 Smi::FromInt( |
| 1681 LiveEdit::FUNCTION_BLOCKED_NO_NEW_TARGET_ON_RESTART), | 1681 LiveEdit::FUNCTION_BLOCKED_NO_NEW_TARGET_ON_RESTART), |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1814 DropActivationsInActiveThreadImpl(isolate, target, do_drop); | 1814 DropActivationsInActiveThreadImpl(isolate, target, do_drop); |
| 1815 if (message) { | 1815 if (message) { |
| 1816 return message; | 1816 return message; |
| 1817 } | 1817 } |
| 1818 | 1818 |
| 1819 int array_len = GetArrayLength(old_shared_array); | 1819 int array_len = GetArrayLength(old_shared_array); |
| 1820 | 1820 |
| 1821 // Replace "blocked on active" with "replaced on active" status. | 1821 // Replace "blocked on active" with "replaced on active" status. |
| 1822 for (int i = 0; i < array_len; i++) { | 1822 for (int i = 0; i < array_len; i++) { |
| 1823 Handle<Object> obj = | 1823 Handle<Object> obj = |
| 1824 Object::GetElement(isolate, result, i).ToHandleChecked(); | 1824 JSReceiver::GetElement(isolate, result, i).ToHandleChecked(); |
| 1825 if (*obj == Smi::FromInt(LiveEdit::FUNCTION_BLOCKED_ON_ACTIVE_STACK)) { | 1825 if (*obj == Smi::FromInt(LiveEdit::FUNCTION_BLOCKED_ON_ACTIVE_STACK)) { |
| 1826 Handle<Object> replaced( | 1826 Handle<Object> replaced( |
| 1827 Smi::FromInt(LiveEdit::FUNCTION_REPLACED_ON_ACTIVE_STACK), isolate); | 1827 Smi::FromInt(LiveEdit::FUNCTION_REPLACED_ON_ACTIVE_STACK), isolate); |
| 1828 SetElementSloppy(result, i, replaced); | 1828 SetElementSloppy(result, i, replaced); |
| 1829 } | 1829 } |
| 1830 } | 1830 } |
| 1831 return NULL; | 1831 return NULL; |
| 1832 } | 1832 } |
| 1833 | 1833 |
| 1834 | 1834 |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2035 isolate_->active_function_info_listener()->FunctionCode(code); | 2035 isolate_->active_function_info_listener()->FunctionCode(code); |
| 2036 } | 2036 } |
| 2037 | 2037 |
| 2038 | 2038 |
| 2039 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { | 2039 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { |
| 2040 return isolate->active_function_info_listener() != NULL; | 2040 return isolate->active_function_info_listener() != NULL; |
| 2041 } | 2041 } |
| 2042 | 2042 |
| 2043 } // namespace internal | 2043 } // namespace internal |
| 2044 } // namespace v8 | 2044 } // namespace v8 |
| OLD | NEW |