OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdlib.h> | 5 #include <stdlib.h> |
6 | 6 |
7 #include "v8.h" | 7 #include "v8.h" |
8 | 8 |
9 #include "ast.h" | 9 #include "ast.h" |
10 #include "bootstrapper.h" | 10 #include "bootstrapper.h" |
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
803 return heap()->exception(); | 803 return heap()->exception(); |
804 } | 804 } |
805 | 805 |
806 | 806 |
807 Object* Isolate::TerminateExecution() { | 807 Object* Isolate::TerminateExecution() { |
808 DoThrow(heap_.termination_exception(), NULL); | 808 DoThrow(heap_.termination_exception(), NULL); |
809 return heap()->exception(); | 809 return heap()->exception(); |
810 } | 810 } |
811 | 811 |
812 | 812 |
813 bool Isolate::IsExecutionTerminating() { | |
814 if (!IsInitialized()) return false; | |
815 if (has_scheduled_exception()) { | |
816 return scheduled_exception() == heap()->termination_exception(); | |
817 } | |
818 return false; | |
819 } | |
820 | |
821 | |
813 void Isolate::CancelTerminateExecution() { | 822 void Isolate::CancelTerminateExecution() { |
814 if (try_catch_handler()) { | 823 if (try_catch_handler()) { |
815 try_catch_handler()->has_terminated_ = false; | 824 try_catch_handler()->has_terminated_ = false; |
816 } | 825 } |
817 if (has_pending_exception() && | 826 if (has_pending_exception() && |
818 pending_exception() == heap_.termination_exception()) { | 827 pending_exception() == heap_.termination_exception()) { |
819 thread_local_top()->external_caught_exception_ = false; | 828 thread_local_top()->external_caught_exception_ = false; |
820 clear_pending_exception(); | 829 clear_pending_exception(); |
821 } | 830 } |
822 if (has_scheduled_exception() && | 831 if (has_scheduled_exception() && |
(...skipping 1451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2274 HandleScope scope(this); | 2283 HandleScope scope(this); |
2275 int num_tasks = pending_microtask_count(); | 2284 int num_tasks = pending_microtask_count(); |
2276 Handle<FixedArray> queue(heap()->microtask_queue(), this); | 2285 Handle<FixedArray> queue(heap()->microtask_queue(), this); |
2277 ASSERT(num_tasks <= queue->length()); | 2286 ASSERT(num_tasks <= queue->length()); |
2278 set_pending_microtask_count(0); | 2287 set_pending_microtask_count(0); |
2279 heap()->set_microtask_queue(heap()->empty_fixed_array()); | 2288 heap()->set_microtask_queue(heap()->empty_fixed_array()); |
2280 | 2289 |
2281 for (int i = 0; i < num_tasks; i++) { | 2290 for (int i = 0; i < num_tasks; i++) { |
2282 HandleScope scope(this); | 2291 HandleScope scope(this); |
2283 Handle<JSFunction> microtask(JSFunction::cast(queue->get(i)), this); | 2292 Handle<JSFunction> microtask(JSFunction::cast(queue->get(i)), this); |
2284 // TODO(adamk): This should ignore/clear exceptions instead of Checking. | 2293 MaybeHandle<Object> result = Execution::Call( |
2285 Execution::Call(this, microtask, factory()->undefined_value(), | 2294 this, microtask, factory()->undefined_value(), 0, NULL); |
2286 0, NULL).Check(); | 2295 if (result.is_null()) { |
2296 // Microtasks should not throw unless the embedder has asked us to | |
2297 // TerminateExecution. | |
2298 ASSERT(IsExecutionTerminating()); | |
2299 handle_scope_implementer()->DecrementCallDepth(); | |
jochen (gone - plz use gerrit)
2014/05/22 07:45:38
why not just break?
adamk
2014/05/22 08:02:16
We're inside a while and a for loop. I would have
| |
2300 return; | |
2301 } | |
2287 } | 2302 } |
2288 } | 2303 } |
2289 | 2304 |
2290 handle_scope_implementer()->DecrementCallDepth(); | 2305 handle_scope_implementer()->DecrementCallDepth(); |
2291 } | 2306 } |
2292 | 2307 |
2293 | 2308 |
2294 } } // namespace v8::internal | 2309 } } // namespace v8::internal |
OLD | NEW |