| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 protected: | 684 protected: |
| 685 void SetField(int field_position, Handle<Object> value) { | 685 void SetField(int field_position, Handle<Object> value) { |
| 686 SetElementNonStrict(array_, field_position, value); | 686 SetElementNonStrict(array_, field_position, value); |
| 687 } | 687 } |
| 688 void SetSmiValueField(int field_position, int value) { | 688 void SetSmiValueField(int field_position, int value) { |
| 689 SetElementNonStrict(array_, | 689 SetElementNonStrict(array_, |
| 690 field_position, | 690 field_position, |
| 691 Handle<Smi>(Smi::FromInt(value), isolate())); | 691 Handle<Smi>(Smi::FromInt(value), isolate())); |
| 692 } | 692 } |
| 693 Object* GetField(int field_position) { | 693 Object* GetField(int field_position) { |
| 694 return array_->GetElementNoExceptionThrown(field_position); | 694 return array_->GetElementNoExceptionThrown(isolate(), field_position); |
| 695 } | 695 } |
| 696 int GetSmiValueField(int field_position) { | 696 int GetSmiValueField(int field_position) { |
| 697 Object* res = GetField(field_position); | 697 Object* res = GetField(field_position); |
| 698 CHECK(res->IsSmi()); | 698 CHECK(res->IsSmi()); |
| 699 return Smi::cast(res)->value(); | 699 return Smi::cast(res)->value(); |
| 700 } | 700 } |
| 701 | 701 |
| 702 private: | 702 private: |
| 703 Handle<JSArray> array_; | 703 Handle<JSArray> array_; |
| 704 }; | 704 }; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 }; | 781 }; |
| 782 | 782 |
| 783 | 783 |
| 784 // Wraps SharedFunctionInfo along with some of its fields for passing it | 784 // Wraps SharedFunctionInfo along with some of its fields for passing it |
| 785 // back to JavaScript. SharedFunctionInfo object itself is additionally | 785 // back to JavaScript. SharedFunctionInfo object itself is additionally |
| 786 // wrapped into BlindReference for sanitizing reasons. | 786 // wrapped into BlindReference for sanitizing reasons. |
| 787 class SharedInfoWrapper : public JSArrayBasedStruct<SharedInfoWrapper> { | 787 class SharedInfoWrapper : public JSArrayBasedStruct<SharedInfoWrapper> { |
| 788 public: | 788 public: |
| 789 static bool IsInstance(Handle<JSArray> array) { | 789 static bool IsInstance(Handle<JSArray> array) { |
| 790 return array->length() == Smi::FromInt(kSize_) && | 790 return array->length() == Smi::FromInt(kSize_) && |
| 791 array->GetElementNoExceptionThrown(kSharedInfoOffset_)->IsJSValue(); | 791 array->GetElementNoExceptionThrown( |
| 792 array->GetIsolate(), kSharedInfoOffset_)->IsJSValue(); |
| 792 } | 793 } |
| 793 | 794 |
| 794 explicit SharedInfoWrapper(Handle<JSArray> array) | 795 explicit SharedInfoWrapper(Handle<JSArray> array) |
| 795 : JSArrayBasedStruct<SharedInfoWrapper>(array) { | 796 : JSArrayBasedStruct<SharedInfoWrapper>(array) { |
| 796 } | 797 } |
| 797 | 798 |
| 798 void SetProperties(Handle<String> name, int start_position, int end_position, | 799 void SetProperties(Handle<String> name, int start_position, int end_position, |
| 799 Handle<SharedFunctionInfo> info) { | 800 Handle<SharedFunctionInfo> info) { |
| 800 HandleScope scope(isolate()); | 801 HandleScope scope(isolate()); |
| 801 this->SetField(kFunctionNameOffset_, name); | 802 this->SetField(kFunctionNameOffset_, name); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 839 current_parent_index_); | 840 current_parent_index_); |
| 840 current_parent_index_ = len_; | 841 current_parent_index_ = len_; |
| 841 SetElementNonStrict(result_, len_, info.GetJSArray()); | 842 SetElementNonStrict(result_, len_, info.GetJSArray()); |
| 842 len_++; | 843 len_++; |
| 843 } | 844 } |
| 844 | 845 |
| 845 void FunctionDone() { | 846 void FunctionDone() { |
| 846 HandleScope scope(isolate()); | 847 HandleScope scope(isolate()); |
| 847 FunctionInfoWrapper info = | 848 FunctionInfoWrapper info = |
| 848 FunctionInfoWrapper::cast( | 849 FunctionInfoWrapper::cast( |
| 849 result_->GetElementNoExceptionThrown(current_parent_index_)); | 850 result_->GetElementNoExceptionThrown( |
| 851 isolate(), current_parent_index_)); |
| 850 current_parent_index_ = info.GetParentIndex(); | 852 current_parent_index_ = info.GetParentIndex(); |
| 851 } | 853 } |
| 852 | 854 |
| 853 // Saves only function code, because for a script function we | 855 // Saves only function code, because for a script function we |
| 854 // may never create a SharedFunctionInfo object. | 856 // may never create a SharedFunctionInfo object. |
| 855 void FunctionCode(Handle<Code> function_code) { | 857 void FunctionCode(Handle<Code> function_code) { |
| 856 FunctionInfoWrapper info = | 858 FunctionInfoWrapper info = |
| 857 FunctionInfoWrapper::cast( | 859 FunctionInfoWrapper::cast( |
| 858 result_->GetElementNoExceptionThrown(current_parent_index_)); | 860 result_->GetElementNoExceptionThrown( |
| 861 isolate(), current_parent_index_)); |
| 859 info.SetFunctionCode(function_code, | 862 info.SetFunctionCode(function_code, |
| 860 Handle<Object>(isolate()->heap()->null_value(), | 863 Handle<Object>(isolate()->heap()->null_value(), |
| 861 isolate())); | 864 isolate())); |
| 862 } | 865 } |
| 863 | 866 |
| 864 // Saves full information about a function: its code, its scope info | 867 // Saves full information about a function: its code, its scope info |
| 865 // and a SharedFunctionInfo object. | 868 // and a SharedFunctionInfo object. |
| 866 void FunctionInfo(Handle<SharedFunctionInfo> shared, Scope* scope, | 869 void FunctionInfo(Handle<SharedFunctionInfo> shared, Scope* scope, |
| 867 Zone* zone) { | 870 Zone* zone) { |
| 868 if (!shared->IsSharedFunctionInfo()) { | 871 if (!shared->IsSharedFunctionInfo()) { |
| 869 return; | 872 return; |
| 870 } | 873 } |
| 871 FunctionInfoWrapper info = | 874 FunctionInfoWrapper info = |
| 872 FunctionInfoWrapper::cast( | 875 FunctionInfoWrapper::cast( |
| 873 result_->GetElementNoExceptionThrown(current_parent_index_)); | 876 result_->GetElementNoExceptionThrown( |
| 877 isolate(), current_parent_index_)); |
| 874 info.SetFunctionCode(Handle<Code>(shared->code()), | 878 info.SetFunctionCode(Handle<Code>(shared->code()), |
| 875 Handle<Object>(shared->scope_info(), isolate())); | 879 Handle<Object>(shared->scope_info(), isolate())); |
| 876 info.SetSharedFunctionInfo(shared); | 880 info.SetSharedFunctionInfo(shared); |
| 877 | 881 |
| 878 Handle<Object> scope_info_list(SerializeFunctionScope(scope, zone), | 882 Handle<Object> scope_info_list(SerializeFunctionScope(scope, zone), |
| 879 isolate()); | 883 isolate()); |
| 880 info.SetOuterScopeInfo(scope_info_list); | 884 info.SetOuterScopeInfo(scope_info_list); |
| 881 } | 885 } |
| 882 | 886 |
| 883 Handle<JSArray> GetResult() { return result_; } | 887 Handle<JSArray> GetResult() { return result_; } |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 994 if (rethrow_exception.is_null()) { | 998 if (rethrow_exception.is_null()) { |
| 995 return *(listener.GetResult()); | 999 return *(listener.GetResult()); |
| 996 } else { | 1000 } else { |
| 997 isolate->Throw(*rethrow_exception); | 1001 isolate->Throw(*rethrow_exception); |
| 998 return 0; | 1002 return 0; |
| 999 } | 1003 } |
| 1000 } | 1004 } |
| 1001 | 1005 |
| 1002 | 1006 |
| 1003 void LiveEdit::WrapSharedFunctionInfos(Handle<JSArray> array) { | 1007 void LiveEdit::WrapSharedFunctionInfos(Handle<JSArray> array) { |
| 1004 HandleScope scope(array->GetIsolate()); | 1008 Isolate* isolate = array->GetIsolate(); |
| 1009 HandleScope scope(isolate); |
| 1005 int len = GetArrayLength(array); | 1010 int len = GetArrayLength(array); |
| 1006 for (int i = 0; i < len; i++) { | 1011 for (int i = 0; i < len; i++) { |
| 1007 Handle<SharedFunctionInfo> info( | 1012 Handle<SharedFunctionInfo> info( |
| 1008 SharedFunctionInfo::cast(array->GetElementNoExceptionThrown(i))); | 1013 SharedFunctionInfo::cast( |
| 1014 array->GetElementNoExceptionThrown(array->GetIsolate(), i))); |
| 1009 SharedInfoWrapper info_wrapper = SharedInfoWrapper::Create(); | 1015 SharedInfoWrapper info_wrapper = SharedInfoWrapper::Create(); |
| 1010 Handle<String> name_handle(String::cast(info->name())); | 1016 Handle<String> name_handle(String::cast(info->name())); |
| 1011 info_wrapper.SetProperties(name_handle, info->start_position(), | 1017 info_wrapper.SetProperties(name_handle, info->start_position(), |
| 1012 info->end_position(), info); | 1018 info->end_position(), info); |
| 1013 SetElementNonStrict(array, i, info_wrapper.GetJSArray()); | 1019 SetElementNonStrict(array, i, info_wrapper.GetJSArray()); |
| 1014 } | 1020 } |
| 1015 } | 1021 } |
| 1016 | 1022 |
| 1017 | 1023 |
| 1018 // Visitor that finds all references to a particular code object, | 1024 // Visitor that finds all references to a particular code object, |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1353 // their contents and length. It is specified as array of groups of 3 numbers: | 1359 // their contents and length. It is specified as array of groups of 3 numbers: |
| 1354 // (change_begin, change_end, change_end_new_position). | 1360 // (change_begin, change_end, change_end_new_position). |
| 1355 // Each group describes a change in text; groups are sorted by change_begin. | 1361 // Each group describes a change in text; groups are sorted by change_begin. |
| 1356 // Only position in text beyond any changes may be successfully translated. | 1362 // Only position in text beyond any changes may be successfully translated. |
| 1357 // If a positions is inside some region that changed, result is currently | 1363 // If a positions is inside some region that changed, result is currently |
| 1358 // undefined. | 1364 // undefined. |
| 1359 static int TranslatePosition(int original_position, | 1365 static int TranslatePosition(int original_position, |
| 1360 Handle<JSArray> position_change_array) { | 1366 Handle<JSArray> position_change_array) { |
| 1361 int position_diff = 0; | 1367 int position_diff = 0; |
| 1362 int array_len = GetArrayLength(position_change_array); | 1368 int array_len = GetArrayLength(position_change_array); |
| 1369 Isolate* isolate = position_change_array->GetIsolate(); |
| 1363 // TODO(635): binary search may be used here | 1370 // TODO(635): binary search may be used here |
| 1364 for (int i = 0; i < array_len; i += 3) { | 1371 for (int i = 0; i < array_len; i += 3) { |
| 1365 Object* element = position_change_array->GetElementNoExceptionThrown(i); | 1372 Object* element = |
| 1373 position_change_array->GetElementNoExceptionThrown(isolate, i); |
| 1366 CHECK(element->IsSmi()); | 1374 CHECK(element->IsSmi()); |
| 1367 int chunk_start = Smi::cast(element)->value(); | 1375 int chunk_start = Smi::cast(element)->value(); |
| 1368 if (original_position < chunk_start) { | 1376 if (original_position < chunk_start) { |
| 1369 break; | 1377 break; |
| 1370 } | 1378 } |
| 1371 element = position_change_array->GetElementNoExceptionThrown(i + 1); | 1379 element = position_change_array->GetElementNoExceptionThrown(isolate, |
| 1380 i + 1); |
| 1372 CHECK(element->IsSmi()); | 1381 CHECK(element->IsSmi()); |
| 1373 int chunk_end = Smi::cast(element)->value(); | 1382 int chunk_end = Smi::cast(element)->value(); |
| 1374 // Position mustn't be inside a chunk. | 1383 // Position mustn't be inside a chunk. |
| 1375 ASSERT(original_position >= chunk_end); | 1384 ASSERT(original_position >= chunk_end); |
| 1376 element = position_change_array->GetElementNoExceptionThrown(i + 2); | 1385 element = position_change_array->GetElementNoExceptionThrown(isolate, |
| 1386 i + 2); |
| 1377 CHECK(element->IsSmi()); | 1387 CHECK(element->IsSmi()); |
| 1378 int chunk_changed_end = Smi::cast(element)->value(); | 1388 int chunk_changed_end = Smi::cast(element)->value(); |
| 1379 position_diff = chunk_changed_end - chunk_end; | 1389 position_diff = chunk_changed_end - chunk_end; |
| 1380 } | 1390 } |
| 1381 | 1391 |
| 1382 return original_position + position_diff; | 1392 return original_position + position_diff; |
| 1383 } | 1393 } |
| 1384 | 1394 |
| 1385 | 1395 |
| 1386 // Auto-growing buffer for writing relocation info code section. This buffer | 1396 // Auto-growing buffer for writing relocation info code section. This buffer |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1623 Handle<JSArray> result, | 1633 Handle<JSArray> result, |
| 1624 StackFrame* frame, | 1634 StackFrame* frame, |
| 1625 LiveEdit::FunctionPatchabilityStatus status) { | 1635 LiveEdit::FunctionPatchabilityStatus status) { |
| 1626 if (!frame->is_java_script()) return false; | 1636 if (!frame->is_java_script()) return false; |
| 1627 | 1637 |
| 1628 Handle<JSFunction> function(JavaScriptFrame::cast(frame)->function()); | 1638 Handle<JSFunction> function(JavaScriptFrame::cast(frame)->function()); |
| 1629 | 1639 |
| 1630 Isolate* isolate = shared_info_array->GetIsolate(); | 1640 Isolate* isolate = shared_info_array->GetIsolate(); |
| 1631 int len = GetArrayLength(shared_info_array); | 1641 int len = GetArrayLength(shared_info_array); |
| 1632 for (int i = 0; i < len; i++) { | 1642 for (int i = 0; i < len; i++) { |
| 1633 Object* element = shared_info_array->GetElementNoExceptionThrown(i); | 1643 Object* element = |
| 1644 shared_info_array->GetElementNoExceptionThrown(isolate, i); |
| 1634 CHECK(element->IsJSValue()); | 1645 CHECK(element->IsJSValue()); |
| 1635 Handle<JSValue> jsvalue(JSValue::cast(element)); | 1646 Handle<JSValue> jsvalue(JSValue::cast(element)); |
| 1636 Handle<SharedFunctionInfo> shared = | 1647 Handle<SharedFunctionInfo> shared = |
| 1637 UnwrapSharedFunctionInfoFromJSValue(jsvalue); | 1648 UnwrapSharedFunctionInfoFromJSValue(jsvalue); |
| 1638 | 1649 |
| 1639 if (function->shared() == *shared || IsInlined(*function, *shared)) { | 1650 if (function->shared() == *shared || IsInlined(*function, *shared)) { |
| 1640 SetElementNonStrict(result, i, Handle<Smi>(Smi::FromInt(status), | 1651 SetElementNonStrict(result, i, Handle<Smi>(Smi::FromInt(status), |
| 1641 isolate)); | 1652 isolate)); |
| 1642 return true; | 1653 return true; |
| 1643 } | 1654 } |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1942 DropActivationsInActiveThreadImpl(target, do_drop); | 1953 DropActivationsInActiveThreadImpl(target, do_drop); |
| 1943 if (message) { | 1954 if (message) { |
| 1944 return message; | 1955 return message; |
| 1945 } | 1956 } |
| 1946 | 1957 |
| 1947 Isolate* isolate = shared_info_array->GetIsolate(); | 1958 Isolate* isolate = shared_info_array->GetIsolate(); |
| 1948 int array_len = GetArrayLength(shared_info_array); | 1959 int array_len = GetArrayLength(shared_info_array); |
| 1949 | 1960 |
| 1950 // Replace "blocked on active" with "replaced on active" status. | 1961 // Replace "blocked on active" with "replaced on active" status. |
| 1951 for (int i = 0; i < array_len; i++) { | 1962 for (int i = 0; i < array_len; i++) { |
| 1952 if (result->GetElement(i) == | 1963 if (result->GetElement(result->GetIsolate(), i) == |
| 1953 Smi::FromInt(LiveEdit::FUNCTION_BLOCKED_ON_ACTIVE_STACK)) { | 1964 Smi::FromInt(LiveEdit::FUNCTION_BLOCKED_ON_ACTIVE_STACK)) { |
| 1954 Handle<Object> replaced( | 1965 Handle<Object> replaced( |
| 1955 Smi::FromInt(LiveEdit::FUNCTION_REPLACED_ON_ACTIVE_STACK), isolate); | 1966 Smi::FromInt(LiveEdit::FUNCTION_REPLACED_ON_ACTIVE_STACK), isolate); |
| 1956 SetElementNonStrict(result, i, replaced); | 1967 SetElementNonStrict(result, i, replaced); |
| 1957 } | 1968 } |
| 1958 } | 1969 } |
| 1959 return NULL; | 1970 return NULL; |
| 1960 } | 1971 } |
| 1961 | 1972 |
| 1962 | 1973 |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2128 | 2139 |
| 2129 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { | 2140 bool LiveEditFunctionTracker::IsActive(Isolate* isolate) { |
| 2130 return false; | 2141 return false; |
| 2131 } | 2142 } |
| 2132 | 2143 |
| 2133 #endif // ENABLE_DEBUGGER_SUPPORT | 2144 #endif // ENABLE_DEBUGGER_SUPPORT |
| 2134 | 2145 |
| 2135 | 2146 |
| 2136 | 2147 |
| 2137 } } // namespace v8::internal | 2148 } } // namespace v8::internal |
| OLD | NEW |