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

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

Issue 1666323002: Don't allow oob message interrupts while executing constant expressions in the parser. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: resolve merge conflicts 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/isolate.cc ('k') | no next file » | 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) 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 "include/dart_api.h" 5 #include "include/dart_api.h"
6 #include "platform/assert.h" 6 #include "platform/assert.h"
7 #include "vm/globals.h" 7 #include "vm/globals.h"
8 #include "vm/isolate.h" 8 #include "vm/isolate.h"
9 #include "vm/lockers.h" 9 #include "vm/lockers.h"
10 #include "vm/thread_barrier.h" 10 #include "vm/thread_barrier.h"
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 isolate->ScheduleInterrupts(Isolate::kVMInterrupt); 142 isolate->ScheduleInterrupts(Isolate::kVMInterrupt);
143 // Wait for all tasks to observe the interrupt. 143 // Wait for all tasks to observe the interrupt.
144 barrier.Sync(); 144 barrier.Sync();
145 // Continue with next round. 145 // Continue with next round.
146 uword interrupts = isolate->GetAndClearInterrupts(); 146 uword interrupts = isolate->GetAndClearInterrupts();
147 EXPECT((interrupts & Isolate::kVMInterrupt) != 0); 147 EXPECT((interrupts & Isolate::kVMInterrupt) != 0);
148 } 148 }
149 barrier.Exit(); 149 barrier.Exit();
150 } 150 }
151 151
152
153 class IsolateTestHelper {
154 public:
155 static uword GetStackLimit(Isolate* isolate) {
156 return isolate->stack_limit_;
157 }
158 static uword GetSavedStackLimit(Isolate* isolate) {
159 return isolate->saved_stack_limit_;
160 }
161 static uword GetDeferredInterruptsMask(Isolate* isolate) {
162 return isolate->deferred_interrupts_mask_;
163 }
164 static uword GetDeferredInterrupts(Isolate* isolate) {
165 return isolate->deferred_interrupts_;
166 }
167 };
168
169
170 TEST_CASE(NoOOBMessageScope) {
171 // EXPECT_EQ is picky about type agreement for its arguments.
172 const uword kZero = 0;
173 const uword kMessageInterrupt = Isolate::kMessageInterrupt;
174 const uword kVMInterrupt = Isolate::kVMInterrupt;
175 uword stack_limit;
176 uword interrupt_bits;
177
178 // Initially no interrupts are scheduled or deferred.
179 Isolate* isolate = Thread::Current()->isolate();
180 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
181 IsolateTestHelper::GetSavedStackLimit(isolate));
182 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate));
183 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate));
184
185 {
186 // Defer message interrupts.
187 NoOOBMessageScope no_msg_scope(Thread::Current());
188 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
189 IsolateTestHelper::GetSavedStackLimit(isolate));
190 EXPECT_EQ(kMessageInterrupt,
191 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
192 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate));
193
194 // Schedule a message, it is deferred.
195 isolate->ScheduleInterrupts(Isolate::kMessageInterrupt);
196 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
197 IsolateTestHelper::GetSavedStackLimit(isolate));
198 EXPECT_EQ(kMessageInterrupt,
199 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
200 EXPECT_EQ(kMessageInterrupt,
201 IsolateTestHelper::GetDeferredInterrupts(isolate));
202
203 // Schedule a vm interrupt, it is not deferred.
204 isolate->ScheduleInterrupts(Isolate::kVMInterrupt);
205 stack_limit = IsolateTestHelper::GetStackLimit(isolate);
206 EXPECT_NE(stack_limit, IsolateTestHelper::GetSavedStackLimit(isolate));
207 EXPECT((stack_limit & Isolate::kVMInterrupt) != 0);
208 EXPECT_EQ(kMessageInterrupt,
209 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
210 EXPECT_EQ(kMessageInterrupt,
211 IsolateTestHelper::GetDeferredInterrupts(isolate));
212
213 // Clear the vm interrupt. Message is still deferred.
214 interrupt_bits = isolate->GetAndClearInterrupts();
215 EXPECT_EQ(kVMInterrupt, interrupt_bits);
216 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
217 IsolateTestHelper::GetSavedStackLimit(isolate));
218 EXPECT_EQ(kMessageInterrupt,
219 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
220 EXPECT_EQ(kMessageInterrupt,
221 IsolateTestHelper::GetDeferredInterrupts(isolate));
222 }
223
224 // Restore message interrupts. Message is now pending.
225 stack_limit = IsolateTestHelper::GetStackLimit(isolate);
226 EXPECT_NE(stack_limit, IsolateTestHelper::GetSavedStackLimit(isolate));
227 EXPECT((stack_limit & Isolate::kMessageInterrupt) != 0);
228 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate));
229 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate));
230
231 {
232 // Defer message interrupts, again. The pending interrupt is deferred.
233 NoOOBMessageScope no_msg_scope(Thread::Current());
234 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
235 IsolateTestHelper::GetSavedStackLimit(isolate));
236 EXPECT_EQ(kMessageInterrupt,
237 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
238 EXPECT_EQ(kMessageInterrupt,
239 IsolateTestHelper::GetDeferredInterrupts(isolate));
240 }
241
242 // Restore, then clear interrupts. The world is as it was.
243 interrupt_bits = isolate->GetAndClearInterrupts();
244 EXPECT_EQ(kMessageInterrupt, interrupt_bits);
245 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
246 IsolateTestHelper::GetSavedStackLimit(isolate));
247 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate));
248 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate));
249 }
250
152 } // namespace dart 251 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/isolate.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698