| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/object.h" | 5 #include "vm/object.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/bigint_operations.h" | 10 #include "vm/bigint_operations.h" |
| (...skipping 12805 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12816 return code_array.Length(); | 12816 return code_array.Length(); |
| 12817 } | 12817 } |
| 12818 | 12818 |
| 12819 | 12819 |
| 12820 RawFunction* Stacktrace::FunctionAtFrame(intptr_t frame_index) const { | 12820 RawFunction* Stacktrace::FunctionAtFrame(intptr_t frame_index) const { |
| 12821 const Array& function_array = Array::Handle(raw_ptr()->function_array_); | 12821 const Array& function_array = Array::Handle(raw_ptr()->function_array_); |
| 12822 return reinterpret_cast<RawFunction*>(function_array.At(frame_index)); | 12822 return reinterpret_cast<RawFunction*>(function_array.At(frame_index)); |
| 12823 } | 12823 } |
| 12824 | 12824 |
| 12825 | 12825 |
| 12826 void Stacktrace::SetFunctionAtFrame(intptr_t frame_index, |
| 12827 const Function& func) const { |
| 12828 const Array& function_array = Array::Handle(raw_ptr()->function_array_); |
| 12829 function_array.SetAt(frame_index, func); |
| 12830 } |
| 12831 |
| 12832 |
| 12826 RawCode* Stacktrace::CodeAtFrame(intptr_t frame_index) const { | 12833 RawCode* Stacktrace::CodeAtFrame(intptr_t frame_index) const { |
| 12827 const Array& code_array = Array::Handle(raw_ptr()->code_array_); | 12834 const Array& code_array = Array::Handle(raw_ptr()->code_array_); |
| 12828 return reinterpret_cast<RawCode*>(code_array.At(frame_index)); | 12835 return reinterpret_cast<RawCode*>(code_array.At(frame_index)); |
| 12829 } | 12836 } |
| 12830 | 12837 |
| 12831 | 12838 |
| 12839 void Stacktrace::SetCodeAtFrame(intptr_t frame_index, |
| 12840 const Code& code) const { |
| 12841 const Array& code_array = Array::Handle(raw_ptr()->code_array_); |
| 12842 code_array.SetAt(frame_index, code); |
| 12843 } |
| 12844 |
| 12845 |
| 12832 RawSmi* Stacktrace::PcOffsetAtFrame(intptr_t frame_index) const { | 12846 RawSmi* Stacktrace::PcOffsetAtFrame(intptr_t frame_index) const { |
| 12833 const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_); | 12847 const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_); |
| 12834 return reinterpret_cast<RawSmi*>(pc_offset_array.At(frame_index)); | 12848 return reinterpret_cast<RawSmi*>(pc_offset_array.At(frame_index)); |
| 12835 } | 12849 } |
| 12836 | 12850 |
| 12837 | 12851 |
| 12852 void Stacktrace::SetPcOffsetAtFrame(intptr_t frame_index, |
| 12853 const Smi& pc_offset) const { |
| 12854 const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_); |
| 12855 pc_offset_array.SetAt(frame_index, pc_offset); |
| 12856 } |
| 12857 |
| 12858 |
| 12838 void Stacktrace::set_function_array(const Array& function_array) const { | 12859 void Stacktrace::set_function_array(const Array& function_array) const { |
| 12839 StorePointer(&raw_ptr()->function_array_, function_array.raw()); | 12860 StorePointer(&raw_ptr()->function_array_, function_array.raw()); |
| 12840 } | 12861 } |
| 12841 | 12862 |
| 12842 | 12863 |
| 12843 void Stacktrace::set_code_array(const Array& code_array) const { | 12864 void Stacktrace::set_code_array(const Array& code_array) const { |
| 12844 StorePointer(&raw_ptr()->code_array_, code_array.raw()); | 12865 StorePointer(&raw_ptr()->code_array_, code_array.raw()); |
| 12845 } | 12866 } |
| 12846 | 12867 |
| 12847 | 12868 |
| 12848 void Stacktrace::set_pc_offset_array(const Array& pc_offset_array) const { | 12869 void Stacktrace::set_pc_offset_array(const Array& pc_offset_array) const { |
| 12849 StorePointer(&raw_ptr()->pc_offset_array_, pc_offset_array.raw()); | 12870 StorePointer(&raw_ptr()->pc_offset_array_, pc_offset_array.raw()); |
| 12850 } | 12871 } |
| 12851 | 12872 |
| 12852 | 12873 |
| 12853 RawStacktrace* Stacktrace::New(const GrowableObjectArray& func_list, | 12874 RawStacktrace* Stacktrace::New(const Array& func_array, |
| 12854 const GrowableObjectArray& code_list, | 12875 const Array& code_array, |
| 12855 const GrowableObjectArray& pc_offset_list, | 12876 const Array& pc_offset_array, |
| 12856 Heap::Space space) { | 12877 Heap::Space space) { |
| 12857 ASSERT(Isolate::Current()->object_store()->stacktrace_class() != | 12878 ASSERT(Isolate::Current()->object_store()->stacktrace_class() != |
| 12858 Class::null()); | 12879 Class::null()); |
| 12859 Stacktrace& result = Stacktrace::Handle(); | 12880 Stacktrace& result = Stacktrace::Handle(); |
| 12860 { | 12881 { |
| 12861 RawObject* raw = Object::Allocate(Stacktrace::kClassId, | 12882 RawObject* raw = Object::Allocate(Stacktrace::kClassId, |
| 12862 Stacktrace::InstanceSize(), | 12883 Stacktrace::InstanceSize(), |
| 12863 space); | 12884 space); |
| 12864 NoGCScope no_gc; | 12885 NoGCScope no_gc; |
| 12865 result ^= raw; | 12886 result ^= raw; |
| 12866 } | 12887 } |
| 12867 // Create arrays for the function, code and pc_offset triplet for each frame. | 12888 result.set_function_array(func_array); |
| 12868 const Array& function_array = Array::Handle(Array::MakeArray(func_list)); | |
| 12869 const Array& code_array = Array::Handle(Array::MakeArray(code_list)); | |
| 12870 const Array& pc_offset_array = | |
| 12871 Array::Handle(Array::MakeArray(pc_offset_list)); | |
| 12872 result.set_function_array(function_array); | |
| 12873 result.set_code_array(code_array); | 12889 result.set_code_array(code_array); |
| 12874 result.set_pc_offset_array(pc_offset_array); | 12890 result.set_pc_offset_array(pc_offset_array); |
| 12875 return result.raw(); | 12891 return result.raw(); |
| 12876 } | 12892 } |
| 12877 | 12893 |
| 12878 | 12894 |
| 12879 void Stacktrace::Append(const GrowableObjectArray& func_list, | 12895 void Stacktrace::Append(const Array& func_list, |
| 12880 const GrowableObjectArray& code_list, | 12896 const Array& code_list, |
| 12881 const GrowableObjectArray& pc_offset_list) const { | 12897 const Array& pc_offset_list) const { |
| 12882 intptr_t old_length = Length(); | 12898 intptr_t old_length = Length(); |
| 12883 intptr_t new_length = old_length + pc_offset_list.Length(); | 12899 intptr_t new_length = old_length + pc_offset_list.Length(); |
| 12884 ASSERT(pc_offset_list.Length() == func_list.Length()); | 12900 ASSERT(pc_offset_list.Length() == func_list.Length()); |
| 12885 ASSERT(pc_offset_list.Length() == code_list.Length()); | 12901 ASSERT(pc_offset_list.Length() == code_list.Length()); |
| 12886 | 12902 |
| 12887 // Grow the arrays for function, code and pc_offset triplet to accommodate | 12903 // Grow the arrays for function, code and pc_offset triplet to accommodate |
| 12888 // the new stack frames. | 12904 // the new stack frames. |
| 12889 Array& function_array = Array::Handle(raw_ptr()->function_array_); | 12905 Array& function_array = Array::Handle(raw_ptr()->function_array_); |
| 12890 Array& code_array = Array::Handle(raw_ptr()->code_array_); | 12906 Array& code_array = Array::Handle(raw_ptr()->code_array_); |
| 12891 Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_); | 12907 Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 12903 function_array.SetAt(i, obj); | 12919 function_array.SetAt(i, obj); |
| 12904 obj = code_list.At(j); | 12920 obj = code_list.At(j); |
| 12905 code_array.SetAt(i, obj); | 12921 code_array.SetAt(i, obj); |
| 12906 obj = pc_offset_list.At(j); | 12922 obj = pc_offset_list.At(j); |
| 12907 pc_offset_array.SetAt(i, obj); | 12923 pc_offset_array.SetAt(i, obj); |
| 12908 } | 12924 } |
| 12909 } | 12925 } |
| 12910 | 12926 |
| 12911 | 12927 |
| 12912 const char* Stacktrace::ToCString() const { | 12928 const char* Stacktrace::ToCString() const { |
| 12929 Isolate* isolate = Isolate::Current(); |
| 12913 Function& function = Function::Handle(); | 12930 Function& function = Function::Handle(); |
| 12914 Code& code = Code::Handle(); | 12931 Code& code = Code::Handle(); |
| 12915 Script& script = Script::Handle(); | 12932 Script& script = Script::Handle(); |
| 12916 String& function_name = String::Handle(); | 12933 String& function_name = String::Handle(); |
| 12917 String& url = String::Handle(); | 12934 String& url = String::Handle(); |
| 12918 | 12935 |
| 12919 // Iterate through the stack frames and create C string description | 12936 // Iterate through the stack frames and create C string description |
| 12920 // for each frame. | 12937 // for each frame. |
| 12921 intptr_t total_len = 0; | 12938 intptr_t total_len = 0; |
| 12922 const char* kFormat = "#%-6d %s (%s:%d:%d)\n"; | 12939 const char* kFormat = "#%-6d %s (%s:%d:%d)\n"; |
| 12923 GrowableArray<char*> frame_strings; | 12940 GrowableArray<char*> frame_strings; |
| 12941 char* chars; |
| 12924 for (intptr_t i = 0; i < Length(); i++) { | 12942 for (intptr_t i = 0; i < Length(); i++) { |
| 12925 function = FunctionAtFrame(i); | 12943 function = FunctionAtFrame(i); |
| 12944 if (function.IsNull()) { |
| 12945 // Check if null function object indicates a stack trace overflow. |
| 12946 if ((i < (Length() - 1)) && |
| 12947 (FunctionAtFrame(i + 1) != Function::null())) { |
| 12948 const char* kTruncated = "...\n...\n"; |
| 12949 intptr_t truncated_len = strlen(kTruncated) + 1; |
| 12950 chars = isolate->current_zone()->Alloc<char>(truncated_len); |
| 12951 OS::SNPrint(chars, truncated_len, "%s", kTruncated); |
| 12952 frame_strings.Add(chars); |
| 12953 } |
| 12954 continue; |
| 12955 } |
| 12926 code = CodeAtFrame(i); | 12956 code = CodeAtFrame(i); |
| 12927 uword pc = code.EntryPoint() + Smi::Value(PcOffsetAtFrame(i)); | 12957 uword pc = code.EntryPoint() + Smi::Value(PcOffsetAtFrame(i)); |
| 12928 intptr_t token_pos = code.GetTokenIndexOfPC(pc); | 12958 intptr_t token_pos = code.GetTokenIndexOfPC(pc); |
| 12929 script = function.script(); | 12959 script = function.script(); |
| 12930 function_name = function.QualifiedUserVisibleName(); | 12960 function_name = function.QualifiedUserVisibleName(); |
| 12931 url = script.url(); | 12961 url = script.url(); |
| 12932 intptr_t line = -1; | 12962 intptr_t line = -1; |
| 12933 intptr_t column = -1; | 12963 intptr_t column = -1; |
| 12934 if (token_pos >= 0) { | 12964 if (token_pos >= 0) { |
| 12935 script.GetTokenLocation(token_pos, &line, &column); | 12965 script.GetTokenLocation(token_pos, &line, &column); |
| 12936 } | 12966 } |
| 12937 intptr_t len = OS::SNPrint(NULL, 0, kFormat, | 12967 intptr_t len = OS::SNPrint(NULL, 0, kFormat, |
| 12938 i, | 12968 i, |
| 12939 function_name.ToCString(), | 12969 function_name.ToCString(), |
| 12940 url.ToCString(), | 12970 url.ToCString(), |
| 12941 line, column); | 12971 line, column); |
| 12942 total_len += len; | 12972 total_len += len; |
| 12943 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | 12973 chars = isolate->current_zone()->Alloc<char>(len + 1); |
| 12944 OS::SNPrint(chars, (len + 1), kFormat, | 12974 OS::SNPrint(chars, (len + 1), kFormat, |
| 12945 i, | 12975 i, |
| 12946 function_name.ToCString(), | 12976 function_name.ToCString(), |
| 12947 url.ToCString(), | 12977 url.ToCString(), |
| 12948 line, column); | 12978 line, column); |
| 12949 frame_strings.Add(chars); | 12979 frame_strings.Add(chars); |
| 12950 } | 12980 } |
| 12951 | 12981 |
| 12952 // Now concatentate the frame descriptions into a single C string. | 12982 // Now concatentate the frame descriptions into a single C string. |
| 12953 char* chars = Isolate::Current()->current_zone()->Alloc<char>(total_len + 1); | 12983 chars = isolate->current_zone()->Alloc<char>(total_len + 1); |
| 12954 intptr_t index = 0; | 12984 intptr_t index = 0; |
| 12955 for (intptr_t i = 0; i < frame_strings.length(); i++) { | 12985 for (intptr_t i = 0; i < frame_strings.length(); i++) { |
| 12956 index += OS::SNPrint((chars + index), | 12986 index += OS::SNPrint((chars + index), |
| 12957 (total_len + 1 - index), | 12987 (total_len + 1 - index), |
| 12958 "%s", | 12988 "%s", |
| 12959 frame_strings[i]); | 12989 frame_strings[i]); |
| 12960 } | 12990 } |
| 12961 return chars; | 12991 return chars; |
| 12962 } | 12992 } |
| 12963 | 12993 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13073 } | 13103 } |
| 13074 return result.raw(); | 13104 return result.raw(); |
| 13075 } | 13105 } |
| 13076 | 13106 |
| 13077 | 13107 |
| 13078 const char* WeakProperty::ToCString() const { | 13108 const char* WeakProperty::ToCString() const { |
| 13079 return "_WeakProperty"; | 13109 return "_WeakProperty"; |
| 13080 } | 13110 } |
| 13081 | 13111 |
| 13082 } // namespace dart | 13112 } // namespace dart |
| OLD | NEW |