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

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: 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
« runtime/vm/compiler.cc ('K') | « 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(DeferMessageInterrupts) {
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
176 // Initially no interrupts are scheduled or deferred.
177 Isolate* isolate = Thread::Current()->isolate();
178 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
179 IsolateTestHelper::GetSavedStackLimit(isolate));
180 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate));
181 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate));
182
183 // Defer message interrupts.
184 isolate->DeferMessageInterrupts();
185 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
186 IsolateTestHelper::GetSavedStackLimit(isolate));
187 EXPECT_EQ(kMessageInterrupt,
188 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
189 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate));
190
191 // Schedule a message, it is deferred.
192 isolate->ScheduleInterrupts(Isolate::kMessageInterrupt);
193 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
194 IsolateTestHelper::GetSavedStackLimit(isolate));
195 EXPECT_EQ(kMessageInterrupt,
196 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
197 EXPECT_EQ(kMessageInterrupt,
198 IsolateTestHelper::GetDeferredInterrupts(isolate));
199
200 // Schedule a vm interrupt, it is not deferred.
201 isolate->ScheduleInterrupts(Isolate::kVMInterrupt);
202 uword stack_limit = IsolateTestHelper::GetStackLimit(isolate);
203 EXPECT_NE(stack_limit, IsolateTestHelper::GetSavedStackLimit(isolate));
204 EXPECT((stack_limit & Isolate::kVMInterrupt) != 0);
205 EXPECT_EQ(kMessageInterrupt,
206 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
207 EXPECT_EQ(kMessageInterrupt,
208 IsolateTestHelper::GetDeferredInterrupts(isolate));
209
210 // Clear the vm interrupt. Message is still deferred.
211 uword interrupt_bits = isolate->GetAndClearInterrupts();
212 EXPECT_EQ(kVMInterrupt, interrupt_bits);
213 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
214 IsolateTestHelper::GetSavedStackLimit(isolate));
215 EXPECT_EQ(kMessageInterrupt,
216 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
217 EXPECT_EQ(kMessageInterrupt,
218 IsolateTestHelper::GetDeferredInterrupts(isolate));
219
220 // Restore message interrupts. Message is now pending.
221 isolate->RestoreMessageInterrupts();
222 stack_limit = IsolateTestHelper::GetStackLimit(isolate);
223 EXPECT_NE(stack_limit, IsolateTestHelper::GetSavedStackLimit(isolate));
224 EXPECT((stack_limit & Isolate::kMessageInterrupt) != 0);
225 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate));
226 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate));
227
228 // Defer message interrupts, again. The pending interrupt is deferred.
229 isolate->DeferMessageInterrupts();
230 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
231 IsolateTestHelper::GetSavedStackLimit(isolate));
232 EXPECT_EQ(kMessageInterrupt,
233 IsolateTestHelper::GetDeferredInterruptsMask(isolate));
234 EXPECT_EQ(kMessageInterrupt,
235 IsolateTestHelper::GetDeferredInterrupts(isolate));
236
237 // Restore, then clear interrupts. The world is as it was.
238 isolate->RestoreMessageInterrupts();
239 interrupt_bits = isolate->GetAndClearInterrupts();
240 EXPECT_EQ(kMessageInterrupt, interrupt_bits);
241 EXPECT_EQ(IsolateTestHelper::GetStackLimit(isolate),
242 IsolateTestHelper::GetSavedStackLimit(isolate));
243 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterruptsMask(isolate));
244 EXPECT_EQ(kZero, IsolateTestHelper::GetDeferredInterrupts(isolate));
245 }
246
152 } // namespace dart 247 } // namespace dart
OLDNEW
« runtime/vm/compiler.cc ('K') | « runtime/vm/isolate.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698