Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Side by Side Diff: runtime/vm/exceptions.cc

Issue 2845053003: Fix asserts in StackFrameIterator which were effectively disabled (Closed)
Patch Set: remote two assertions which cannot be made Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "lib/stacktrace.h" 9 #include "lib/stacktrace.h"
10 10
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 } 121 }
122 cur_index_ = (StackTrace::kPreallocatedStackdepth - 1); 122 cur_index_ = (StackTrace::kPreallocatedStackdepth - 1);
123 } 123 }
124 stacktrace_.SetCodeAtFrame(cur_index_, code); 124 stacktrace_.SetCodeAtFrame(cur_index_, code);
125 stacktrace_.SetPcOffsetAtFrame(cur_index_, offset); 125 stacktrace_.SetPcOffsetAtFrame(cur_index_, offset);
126 cur_index_ += 1; 126 cur_index_ += 1;
127 } 127 }
128 128
129 129
130 static void BuildStackTrace(StackTraceBuilder* builder) { 130 static void BuildStackTrace(StackTraceBuilder* builder) {
131 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames); 131 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
132 Thread::Current(), false);
132 StackFrame* frame = frames.NextFrame(); 133 StackFrame* frame = frames.NextFrame();
133 ASSERT(frame != NULL); // We expect to find a dart invocation frame. 134 ASSERT(frame != NULL); // We expect to find a dart invocation frame.
134 Code& code = Code::Handle(); 135 Code& code = Code::Handle();
135 Smi& offset = Smi::Handle(); 136 Smi& offset = Smi::Handle();
136 while (frame != NULL) { 137 while (frame != NULL) {
137 if (frame->IsDartFrame()) { 138 if (frame->IsDartFrame()) {
138 code = frame->LookupDartCode(); 139 code = frame->LookupDartCode();
139 ASSERT(code.ContainsInstructionAt(frame->pc())); 140 ASSERT(code.ContainsInstructionAt(frame->pc()));
140 offset = Smi::New(frame->pc() - code.PayloadStart()); 141 offset = Smi::New(frame->pc() - code.PayloadStart());
141 builder->AddFrame(code, offset); 142 builder->AddFrame(code, offset);
(...skipping 20 matching lines...) Expand all
162 class ExceptionHandlerFinder : public StackResource { 163 class ExceptionHandlerFinder : public StackResource {
163 public: 164 public:
164 explicit ExceptionHandlerFinder(Thread* thread) 165 explicit ExceptionHandlerFinder(Thread* thread)
165 : StackResource(thread), thread_(thread), cache_(NULL), metadata_(NULL) {} 166 : StackResource(thread), thread_(thread), cache_(NULL), metadata_(NULL) {}
166 167
167 // Iterate through the stack frames and try to find a frame with an 168 // Iterate through the stack frames and try to find a frame with an
168 // exception handler. Once found, set the pc, sp and fp so that execution 169 // exception handler. Once found, set the pc, sp and fp so that execution
169 // can continue in that frame. Sets 'needs_stacktrace' if there is no 170 // can continue in that frame. Sets 'needs_stacktrace' if there is no
170 // cath-all handler or if a stack-trace is specified in the catch. 171 // cath-all handler or if a stack-trace is specified in the catch.
171 bool Find() { 172 bool Find() {
172 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames); 173 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
174 Thread::Current(), false);
173 StackFrame* frame = frames.NextFrame(); 175 StackFrame* frame = frames.NextFrame();
174 if (frame == NULL) return false; // No Dart frame. 176 if (frame == NULL) return false; // No Dart frame.
175 handler_pc_set_ = false; 177 handler_pc_set_ = false;
176 needs_stacktrace = false; 178 needs_stacktrace = false;
177 bool is_catch_all = false; 179 bool is_catch_all = false;
178 uword temp_handler_pc = kUwordMax; 180 uword temp_handler_pc = kUwordMax;
179 bool is_optimized = false; 181 bool is_optimized = false;
180 code_ = NULL; 182 code_ = NULL;
181 cache_ = thread_->isolate()->catch_entry_state_cache(); 183 cache_ = thread_->isolate()->catch_entry_state_cache();
182 184
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 bool handler_pc_set_; 342 bool handler_pc_set_;
341 intptr_t* metadata_; // MetaData generated from deopt. 343 intptr_t* metadata_; // MetaData generated from deopt.
342 CatchEntryState cached_; // Value of per PC MetaData cache. 344 CatchEntryState cached_; // Value of per PC MetaData cache.
343 intptr_t pc_; // Current pc in the handler frame. 345 intptr_t pc_; // Current pc in the handler frame.
344 }; 346 };
345 347
346 348
347 static void FindErrorHandler(uword* handler_pc, 349 static void FindErrorHandler(uword* handler_pc,
348 uword* handler_sp, 350 uword* handler_sp,
349 uword* handler_fp) { 351 uword* handler_fp) {
350 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames); 352 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames,
353 Thread::Current(), false);
351 StackFrame* frame = frames.NextFrame(); 354 StackFrame* frame = frames.NextFrame();
352 ASSERT(frame != NULL); 355 ASSERT(frame != NULL);
353 while (!frame->IsEntryFrame()) { 356 while (!frame->IsEntryFrame()) {
354 frame = frames.NextFrame(); 357 frame = frames.NextFrame();
355 ASSERT(frame != NULL); 358 ASSERT(frame != NULL);
356 } 359 }
357 ASSERT(frame->IsEntryFrame()); 360 ASSERT(frame->IsEntryFrame());
358 *handler_pc = frame->pc(); 361 *handler_pc = frame->pc();
359 *handler_sp = frame->sp(); 362 *handler_sp = frame->sp();
360 *handler_fp = frame->fp(); 363 *handler_fp = frame->fp();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 396
394 static void ClearLazyDeopts(Thread* thread, uword frame_pointer) { 397 static void ClearLazyDeopts(Thread* thread, uword frame_pointer) {
395 #if !defined(TARGET_ARCH_DBC) 398 #if !defined(TARGET_ARCH_DBC)
396 MallocGrowableArray<PendingLazyDeopt>* pending_deopts = 399 MallocGrowableArray<PendingLazyDeopt>* pending_deopts =
397 thread->isolate()->pending_deopts(); 400 thread->isolate()->pending_deopts();
398 if (pending_deopts->length() > 0) { 401 if (pending_deopts->length() > 0) {
399 // We may be jumping over frames scheduled for lazy deopt. Remove these 402 // We may be jumping over frames scheduled for lazy deopt. Remove these
400 // frames from the pending deopt table, but only after unmarking them so 403 // frames from the pending deopt table, but only after unmarking them so
401 // any stack walk that happens before the stack is unwound will still work. 404 // any stack walk that happens before the stack is unwound will still work.
402 { 405 {
403 DartFrameIterator frames(thread); 406 DartFrameIterator frames(thread, false);
404 StackFrame* frame = frames.NextFrame(); 407 StackFrame* frame = frames.NextFrame();
405 while ((frame != NULL) && (frame->fp() < frame_pointer)) { 408 while ((frame != NULL) && (frame->fp() < frame_pointer)) {
406 if (frame->IsMarkedForLazyDeopt()) { 409 if (frame->IsMarkedForLazyDeopt()) {
407 frame->UnmarkForLazyDeopt(); 410 frame->UnmarkForLazyDeopt();
408 } 411 }
409 frame = frames.NextFrame(); 412 frame = frames.NextFrame();
410 } 413 }
411 } 414 }
412 415
413 #if defined(DEBUG) 416 #if defined(DEBUG)
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 665
663 666
664 // Allocate, initialize, and throw a TypeError or CastError. 667 // Allocate, initialize, and throw a TypeError or CastError.
665 // If error_msg is not null, throw a TypeError, even for a type cast. 668 // If error_msg is not null, throw a TypeError, even for a type cast.
666 void Exceptions::CreateAndThrowTypeError(TokenPosition location, 669 void Exceptions::CreateAndThrowTypeError(TokenPosition location,
667 const AbstractType& src_type, 670 const AbstractType& src_type,
668 const AbstractType& dst_type, 671 const AbstractType& dst_type,
669 const String& dst_name, 672 const String& dst_name,
670 const String& bound_error_msg) { 673 const String& bound_error_msg) {
671 ASSERT(!dst_name.IsNull()); // Pass Symbols::Empty() instead. 674 ASSERT(!dst_name.IsNull()); // Pass Symbols::Empty() instead.
672 Zone* zone = Thread::Current()->zone(); 675 Thread* thread = Thread::Current();
676 Zone* zone = thread->zone();
673 const Array& args = Array::Handle(zone, Array::New(4)); 677 const Array& args = Array::Handle(zone, Array::New(4));
674 678
675 ExceptionType exception_type = 679 ExceptionType exception_type =
676 (bound_error_msg.IsNull() && 680 (bound_error_msg.IsNull() &&
677 (dst_name.raw() == Symbols::InTypeCast().raw())) 681 (dst_name.raw() == Symbols::InTypeCast().raw()))
678 ? kCast 682 ? kCast
679 : kType; 683 : kType;
680 684
681 DartFrameIterator iterator; 685 DartFrameIterator iterator(thread, false);
682 const Script& script = Script::Handle(zone, GetCallerScript(&iterator)); 686 const Script& script = Script::Handle(zone, GetCallerScript(&iterator));
683 intptr_t line = -1; 687 intptr_t line = -1;
684 intptr_t column = -1; 688 intptr_t column = -1;
685 ASSERT(!script.IsNull()); 689 ASSERT(!script.IsNull());
686 if (location.IsReal()) { 690 if (location.IsReal()) {
687 if (script.HasSource() || script.kind() == RawScript::kKernelTag) { 691 if (script.HasSource() || script.kind() == RawScript::kKernelTag) {
688 script.GetTokenLocation(location, &line, &column); 692 script.GetTokenLocation(location, &line, &column);
689 } else { 693 } else {
690 script.GetTokenLocation(location, &line, NULL); 694 script.GetTokenLocation(location, &line, NULL);
691 } 695 }
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 } 978 }
975 979
976 Thread* thread = Thread::Current(); 980 Thread* thread = Thread::Current();
977 NoReloadScope no_reload_scope(thread->isolate(), thread); 981 NoReloadScope no_reload_scope(thread->isolate(), thread);
978 return DartLibraryCalls::InstanceCreate(library, *class_name, 982 return DartLibraryCalls::InstanceCreate(library, *class_name,
979 *constructor_name, arguments); 983 *constructor_name, arguments);
980 } 984 }
981 985
982 986
983 } // namespace dart 987 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698