| 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 <fstream> // NOLINT(readability/streams) | 7 #include <fstream> // NOLINT(readability/streams) |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 | 9 |
| 10 #include "src/v8.h" | 10 #include "src/v8.h" |
| (...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 910 clear_pending_exception(); | 910 clear_pending_exception(); |
| 911 } | 911 } |
| 912 if (has_scheduled_exception() && | 912 if (has_scheduled_exception() && |
| 913 scheduled_exception() == heap_.termination_exception()) { | 913 scheduled_exception() == heap_.termination_exception()) { |
| 914 thread_local_top()->external_caught_exception_ = false; | 914 thread_local_top()->external_caught_exception_ = false; |
| 915 clear_scheduled_exception(); | 915 clear_scheduled_exception(); |
| 916 } | 916 } |
| 917 } | 917 } |
| 918 | 918 |
| 919 | 919 |
| 920 void Isolate::InvokeApiInterruptCallback() { | 920 void Isolate::RequestInterrupt(InterruptCallback callback, void* data) { |
| 921 ExecutionAccess access(this); |
| 922 api_interrupts_queue_.push(InterruptEntry(callback, data)); |
| 923 stack_guard()->RequestApiInterrupt(); |
| 924 } |
| 925 |
| 926 |
| 927 void Isolate::InvokeApiInterruptCallbacks() { |
| 921 // Note: callback below should be called outside of execution access lock. | 928 // Note: callback below should be called outside of execution access lock. |
| 922 InterruptCallback callback = NULL; | 929 while (true) { |
| 923 void* data = NULL; | 930 InterruptEntry entry; |
| 924 { | 931 { |
| 925 ExecutionAccess access(this); | 932 ExecutionAccess access(this); |
| 926 callback = api_interrupt_callback_; | 933 if (api_interrupts_queue_.empty()) return; |
| 927 data = api_interrupt_callback_data_; | 934 entry = api_interrupts_queue_.front(); |
| 928 api_interrupt_callback_ = NULL; | 935 api_interrupts_queue_.pop(); |
| 929 api_interrupt_callback_data_ = NULL; | 936 } |
| 930 } | |
| 931 | |
| 932 if (callback != NULL) { | |
| 933 VMState<EXTERNAL> state(this); | 937 VMState<EXTERNAL> state(this); |
| 934 HandleScope handle_scope(this); | 938 HandleScope handle_scope(this); |
| 935 callback(reinterpret_cast<v8::Isolate*>(this), data); | 939 entry.first(reinterpret_cast<v8::Isolate*>(this), entry.second); |
| 936 } | 940 } |
| 937 } | 941 } |
| 938 | 942 |
| 939 | 943 |
| 940 Object* Isolate::Throw(Object* exception, MessageLocation* location) { | 944 Object* Isolate::Throw(Object* exception, MessageLocation* location) { |
| 941 DoThrow(exception, location); | 945 DoThrow(exception, location); |
| 942 return heap()->exception(); | 946 return heap()->exception(); |
| 943 } | 947 } |
| 944 | 948 |
| 945 | 949 |
| (...skipping 1605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2551 if (prev_ && prev_->Intercept(flag)) return true; | 2555 if (prev_ && prev_->Intercept(flag)) return true; |
| 2552 // Then check whether this scope intercepts. | 2556 // Then check whether this scope intercepts. |
| 2553 if ((flag & intercept_mask_)) { | 2557 if ((flag & intercept_mask_)) { |
| 2554 intercepted_flags_ |= flag; | 2558 intercepted_flags_ |= flag; |
| 2555 return true; | 2559 return true; |
| 2556 } | 2560 } |
| 2557 return false; | 2561 return false; |
| 2558 } | 2562 } |
| 2559 | 2563 |
| 2560 } } // namespace v8::internal | 2564 } } // namespace v8::internal |
| OLD | NEW |