OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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/exceptions.h" | 5 #include "vm/exceptions.h" |
6 | 6 |
7 #include "platform/address_sanitizer.h" | 7 #include "platform/address_sanitizer.h" |
8 | 8 |
9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 const GrowableObjectArray& pc_offset_list_; | 57 const GrowableObjectArray& pc_offset_list_; |
58 | 58 |
59 DISALLOW_COPY_AND_ASSIGN(RegularStacktraceBuilder); | 59 DISALLOW_COPY_AND_ASSIGN(RegularStacktraceBuilder); |
60 }; | 60 }; |
61 | 61 |
62 | 62 |
63 class PreallocatedStacktraceBuilder : public StacktraceBuilder { | 63 class PreallocatedStacktraceBuilder : public StacktraceBuilder { |
64 public: | 64 public: |
65 explicit PreallocatedStacktraceBuilder(const Instance& stacktrace) | 65 explicit PreallocatedStacktraceBuilder(const Instance& stacktrace) |
66 : stacktrace_(Stacktrace::Cast(stacktrace)), | 66 : stacktrace_(Stacktrace::Cast(stacktrace)), |
67 cur_index_(0) { | 67 cur_index_(0), |
| 68 dropped_frames_(0) { |
68 ASSERT(stacktrace_.raw() == | 69 ASSERT(stacktrace_.raw() == |
69 Isolate::Current()->object_store()->preallocated_stack_trace()); | 70 Isolate::Current()->object_store()->preallocated_stack_trace()); |
70 } | 71 } |
71 ~PreallocatedStacktraceBuilder() { } | 72 ~PreallocatedStacktraceBuilder() { } |
72 | 73 |
73 virtual void AddFrame(const Code& code, const Smi& offset); | 74 virtual void AddFrame(const Code& code, const Smi& offset); |
74 | 75 |
75 private: | 76 private: |
76 static const int kNumTopframes = Stacktrace::kPreallocatedStackdepth / 2; | 77 static const int kNumTopframes = Stacktrace::kPreallocatedStackdepth / 2; |
77 | 78 |
78 const Stacktrace& stacktrace_; | 79 const Stacktrace& stacktrace_; |
79 intptr_t cur_index_; | 80 intptr_t cur_index_; |
| 81 intptr_t dropped_frames_; |
80 | 82 |
81 DISALLOW_COPY_AND_ASSIGN(PreallocatedStacktraceBuilder); | 83 DISALLOW_COPY_AND_ASSIGN(PreallocatedStacktraceBuilder); |
82 }; | 84 }; |
83 | 85 |
84 | 86 |
85 void PreallocatedStacktraceBuilder::AddFrame(const Code& code, | 87 void PreallocatedStacktraceBuilder::AddFrame(const Code& code, |
86 const Smi& offset) { | 88 const Smi& offset) { |
87 if (cur_index_ >= Stacktrace::kPreallocatedStackdepth) { | 89 if (cur_index_ >= Stacktrace::kPreallocatedStackdepth) { |
88 // The number of frames is overflowing the preallocated stack trace object. | 90 // The number of frames is overflowing the preallocated stack trace object. |
89 Code& frame_code = Code::Handle(); | 91 Code& frame_code = Code::Handle(); |
90 Smi& frame_offset = Smi::Handle(); | 92 Smi& frame_offset = Smi::Handle(); |
91 intptr_t start = Stacktrace::kPreallocatedStackdepth - (kNumTopframes - 1); | 93 intptr_t start = Stacktrace::kPreallocatedStackdepth - (kNumTopframes - 1); |
92 intptr_t null_slot = start - 2; | 94 intptr_t null_slot = start - 2; |
| 95 // We are going to drop one frame. |
| 96 dropped_frames_++; |
93 // Add an empty slot to indicate the overflow so that the toString | 97 // Add an empty slot to indicate the overflow so that the toString |
94 // method can account for the overflow. | 98 // method can account for the overflow. |
95 if (stacktrace_.FunctionAtFrame(null_slot) != Function::null()) { | 99 if (stacktrace_.FunctionAtFrame(null_slot) != Function::null()) { |
96 stacktrace_.SetCodeAtFrame(null_slot, frame_code); | 100 stacktrace_.SetCodeAtFrame(null_slot, frame_code); |
| 101 // We drop an extra frame here too. |
| 102 dropped_frames_++; |
97 } | 103 } |
| 104 // Encode the number of dropped frames into the pc offset. |
| 105 frame_offset ^= Smi::New(dropped_frames_); |
| 106 stacktrace_.SetPcOffsetAtFrame(null_slot, frame_offset); |
98 // Move frames one slot down so that we can accomodate the new frame. | 107 // Move frames one slot down so that we can accomodate the new frame. |
99 for (intptr_t i = start; i < Stacktrace::kPreallocatedStackdepth; i++) { | 108 for (intptr_t i = start; i < Stacktrace::kPreallocatedStackdepth; i++) { |
100 intptr_t prev = (i - 1); | 109 intptr_t prev = (i - 1); |
101 frame_code = stacktrace_.CodeAtFrame(i); | 110 frame_code = stacktrace_.CodeAtFrame(i); |
102 frame_offset = stacktrace_.PcOffsetAtFrame(i); | 111 frame_offset = stacktrace_.PcOffsetAtFrame(i); |
103 stacktrace_.SetCodeAtFrame(prev, frame_code); | 112 stacktrace_.SetCodeAtFrame(prev, frame_code); |
104 stacktrace_.SetPcOffsetAtFrame(prev, frame_offset); | 113 stacktrace_.SetPcOffsetAtFrame(prev, frame_offset); |
105 } | 114 } |
106 cur_index_ = (Stacktrace::kPreallocatedStackdepth - 1); | 115 cur_index_ = (Stacktrace::kPreallocatedStackdepth - 1); |
107 } | 116 } |
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 } | 667 } |
659 | 668 |
660 return DartLibraryCalls::InstanceCreate(library, | 669 return DartLibraryCalls::InstanceCreate(library, |
661 *class_name, | 670 *class_name, |
662 *constructor_name, | 671 *constructor_name, |
663 arguments); | 672 arguments); |
664 } | 673 } |
665 | 674 |
666 | 675 |
667 } // namespace dart | 676 } // namespace dart |
OLD | NEW |