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

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

Issue 1709383002: Improve behaviour when we hit a stack overflow / OOM error (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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
« no previous file with comments | « runtime/vm/exceptions.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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/isolate.h" 5 #include "vm/isolate.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "include/dart_native_api.h" 8 #include "include/dart_native_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/text_buffer.h" 10 #include "platform/text_buffer.h"
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 return MessageHandler::kShutdown; 648 return MessageHandler::kShutdown;
649 } 649 }
650 } 650 }
651 } 651 }
652 return MessageHandler::kError; 652 return MessageHandler::kError;
653 } 653 }
654 654
655 655
656 MessageHandler::MessageStatus IsolateMessageHandler::ProcessUnhandledException( 656 MessageHandler::MessageStatus IsolateMessageHandler::ProcessUnhandledException(
657 const Error& result) { 657 const Error& result) {
658 // Notify the debugger about specific unhandled exceptions which are withheld
659 // when being thrown.
660 if (result.IsUnhandledException()) {
661 const UnhandledException& error = UnhandledException::Cast(result);
662 RawInstance* exception = error.exception();
663 if ((exception == I->object_store()->out_of_memory()) ||
664 (exception == I->object_store()->stack_overflow())) {
665 // We didn't notify the debugger when the stack was full. Do it now.
666 if (FLAG_support_debugger) {
667 I->debugger()->SignalExceptionThrown(Instance::Handle(exception));
668 }
669 }
670 }
671
672 // Generate the error and stacktrace strings for the error message. 658 // Generate the error and stacktrace strings for the error message.
673 String& exc_str = String::Handle(T->zone()); 659 String& exc_str = String::Handle(T->zone());
674 String& stacktrace_str = String::Handle(T->zone()); 660 String& stacktrace_str = String::Handle(T->zone());
675 if (result.IsUnhandledException()) { 661 if (result.IsUnhandledException()) {
676 Zone* zone = T->zone(); 662 Zone* zone = T->zone();
677 const UnhandledException& uhe = UnhandledException::Cast(result); 663 const UnhandledException& uhe = UnhandledException::Cast(result);
678 const Instance& exception = Instance::Handle(zone, uhe.exception()); 664 const Instance& exception = Instance::Handle(zone, uhe.exception());
679 Object& tmp = Object::Handle(zone); 665 Object& tmp = Object::Handle(zone);
680 tmp = DartLibraryCalls::ToString(exception); 666 tmp = DartLibraryCalls::ToString(exception);
681 if (!tmp.IsString()) { 667 if (!tmp.IsString()) {
(...skipping 15 matching lines...) Expand all
697 // whether errors are fatal for the current isolate. 683 // whether errors are fatal for the current isolate.
698 return StoreError(T, result); 684 return StoreError(T, result);
699 } else { 685 } else {
700 bool has_listener = I->NotifyErrorListeners(exc_str, stacktrace_str); 686 bool has_listener = I->NotifyErrorListeners(exc_str, stacktrace_str);
701 if (I->ErrorsFatal()) { 687 if (I->ErrorsFatal()) {
702 if (has_listener) { 688 if (has_listener) {
703 T->clear_sticky_error(); 689 T->clear_sticky_error();
704 } else { 690 } else {
705 T->set_sticky_error(result); 691 T->set_sticky_error(result);
706 } 692 }
693 // Notify the debugger about specific unhandled exceptions which are
694 // withheld when being thrown. Do this after setting the sticky error
695 // so the isolate has an error set when paused with the unhandled
696 // exception.
697 if (result.IsUnhandledException()) {
698 const UnhandledException& error = UnhandledException::Cast(result);
699 RawInstance* exception = error.exception();
700 if ((exception == I->object_store()->out_of_memory()) ||
701 (exception == I->object_store()->stack_overflow())) {
702 // We didn't notify the debugger when the stack was full. Do it now.
703 if (FLAG_support_debugger) {
704 I->debugger()->SignalExceptionThrown(Instance::Handle(exception));
705 }
706 }
707 }
707 return kError; 708 return kError;
708 } 709 }
709 } 710 }
710 return kOK; 711 return kOK;
711 } 712 }
712 713
713 714
714 Isolate::Flags::Flags() 715 Isolate::Flags::Flags()
715 : type_checks_(FLAG_enable_type_checks), 716 : type_checks_(FLAG_enable_type_checks),
716 asserts_(FLAG_enable_asserts), 717 asserts_(FLAG_enable_asserts),
(...skipping 2106 matching lines...) Expand 10 before | Expand all | Expand 10 after
2823 void IsolateSpawnState::DecrementSpawnCount() { 2824 void IsolateSpawnState::DecrementSpawnCount() {
2824 ASSERT(spawn_count_monitor_ != NULL); 2825 ASSERT(spawn_count_monitor_ != NULL);
2825 ASSERT(spawn_count_ != NULL); 2826 ASSERT(spawn_count_ != NULL);
2826 MonitorLocker ml(spawn_count_monitor_); 2827 MonitorLocker ml(spawn_count_monitor_);
2827 ASSERT(*spawn_count_ > 0); 2828 ASSERT(*spawn_count_ > 0);
2828 *spawn_count_ = *spawn_count_ - 1; 2829 *spawn_count_ = *spawn_count_ - 1;
2829 ml.Notify(); 2830 ml.Notify();
2830 } 2831 }
2831 2832
2832 } // namespace dart 2833 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/exceptions.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698