OLD | NEW |
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 #ifndef VM_ISOLATE_H_ | 5 #ifndef VM_ISOLATE_H_ |
6 #define VM_ISOLATE_H_ | 6 #define VM_ISOLATE_H_ |
7 | 7 |
8 #include "include/dart_api.h" | 8 #include "include/dart_api.h" |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 #include "vm/atomic.h" | 10 #include "vm/atomic.h" |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 environment_callback_ = value; | 205 environment_callback_ = value; |
206 } | 206 } |
207 | 207 |
208 Dart_LibraryTagHandler library_tag_handler() const { | 208 Dart_LibraryTagHandler library_tag_handler() const { |
209 return library_tag_handler_; | 209 return library_tag_handler_; |
210 } | 210 } |
211 void set_library_tag_handler(Dart_LibraryTagHandler value) { | 211 void set_library_tag_handler(Dart_LibraryTagHandler value) { |
212 library_tag_handler_ = value; | 212 library_tag_handler_ = value; |
213 } | 213 } |
214 | 214 |
215 void InitializeStackLimit(); | |
216 void SetStackLimit(uword value); | 215 void SetStackLimit(uword value); |
217 void SetStackLimitFromStackBase(uword stack_base); | 216 void SetStackLimitFromStackBase(uword stack_base); |
218 void ClearStackLimit(); | 217 void ClearStackLimit(); |
219 | 218 |
220 // Returns the current C++ stack pointer. Equivalent taking the address of a | 219 // Returns the current C++ stack pointer. Equivalent taking the address of a |
221 // stack allocated local, but plays well with AddressSanitizer. | 220 // stack allocated local, but plays well with AddressSanitizer. |
222 // TODO(koda): Move to Thread. | 221 // TODO(koda): Move to Thread. |
223 static uword GetCurrentStackPointer(); | 222 static uword GetCurrentStackPointer(); |
224 | 223 |
225 void SetupInstructionsSnapshotPage( | 224 void SetupInstructionsSnapshotPage( |
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
905 | 904 |
906 | 905 |
907 // When we need to execute code in an isolate, we use the | 906 // When we need to execute code in an isolate, we use the |
908 // StartIsolateScope. | 907 // StartIsolateScope. |
909 class StartIsolateScope { | 908 class StartIsolateScope { |
910 public: | 909 public: |
911 explicit StartIsolateScope(Isolate* new_isolate) | 910 explicit StartIsolateScope(Isolate* new_isolate) |
912 : new_isolate_(new_isolate), saved_isolate_(Isolate::Current()) { | 911 : new_isolate_(new_isolate), saved_isolate_(Isolate::Current()) { |
913 // TODO(koda): Audit users; passing NULL goes against naming of this class. | 912 // TODO(koda): Audit users; passing NULL goes against naming of this class. |
914 if (new_isolate_ == NULL) { | 913 if (new_isolate_ == NULL) { |
| 914 ASSERT(Isolate::Current() == NULL); |
915 // Do nothing. | 915 // Do nothing. |
916 return; | 916 return; |
917 } | 917 } |
918 if (saved_isolate_ != new_isolate_) { | 918 if (saved_isolate_ != new_isolate_) { |
919 ASSERT(Isolate::Current() == NULL); | 919 ASSERT(Isolate::Current() == NULL); |
| 920 // Ensure this is not a nested 'isolate enter' with prior state. |
| 921 ASSERT(new_isolate_->stack_base() == 0); |
920 Thread::EnterIsolate(new_isolate_); | 922 Thread::EnterIsolate(new_isolate_); |
921 new_isolate_->SetStackLimitFromStackBase( | |
922 Isolate::GetCurrentStackPointer()); | |
923 } | 923 } |
924 } | 924 } |
925 | 925 |
926 ~StartIsolateScope() { | 926 ~StartIsolateScope() { |
927 if (new_isolate_ == NULL) { | 927 if (new_isolate_ == NULL) { |
| 928 ASSERT(Isolate::Current() == NULL); |
928 // Do nothing. | 929 // Do nothing. |
929 return; | 930 return; |
930 } | 931 } |
931 if (saved_isolate_ != new_isolate_) { | 932 if (saved_isolate_ != new_isolate_) { |
932 new_isolate_->ClearStackLimit(); | 933 ASSERT(saved_isolate_ == NULL); |
| 934 // ASSERT that we have bottomed out of all Dart invocations. |
| 935 ASSERT(new_isolate_->stack_base() == 0); |
933 Thread::ExitIsolate(); | 936 Thread::ExitIsolate(); |
934 ASSERT(saved_isolate_ == NULL); | |
935 } | 937 } |
936 } | 938 } |
937 | 939 |
938 private: | 940 private: |
939 Isolate* new_isolate_; | 941 Isolate* new_isolate_; |
940 Isolate* saved_isolate_; | 942 Isolate* saved_isolate_; |
941 | 943 |
942 DISALLOW_COPY_AND_ASSIGN(StartIsolateScope); | 944 DISALLOW_COPY_AND_ASSIGN(StartIsolateScope); |
943 }; | 945 }; |
944 | 946 |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1043 uint8_t* serialized_message_; | 1045 uint8_t* serialized_message_; |
1044 intptr_t serialized_message_len_; | 1046 intptr_t serialized_message_len_; |
1045 Isolate::Flags isolate_flags_; | 1047 Isolate::Flags isolate_flags_; |
1046 bool paused_; | 1048 bool paused_; |
1047 bool errors_are_fatal_; | 1049 bool errors_are_fatal_; |
1048 }; | 1050 }; |
1049 | 1051 |
1050 } // namespace dart | 1052 } // namespace dart |
1051 | 1053 |
1052 #endif // VM_ISOLATE_H_ | 1054 #endif // VM_ISOLATE_H_ |
OLD | NEW |