| 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 "src/api.h" | 5 #include "src/api.h" |
| 6 | 6 |
| 7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
| 8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
| 9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
| 10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
| (...skipping 2112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2123 next_(isolate_->try_catch_handler()), | 2123 next_(isolate_->try_catch_handler()), |
| 2124 is_verbose_(false), | 2124 is_verbose_(false), |
| 2125 can_continue_(true), | 2125 can_continue_(true), |
| 2126 capture_message_(true), | 2126 capture_message_(true), |
| 2127 rethrow_(false), | 2127 rethrow_(false), |
| 2128 has_terminated_(false) { | 2128 has_terminated_(false) { |
| 2129 ResetInternal(); | 2129 ResetInternal(); |
| 2130 // Special handling for simulators which have a separate JS stack. | 2130 // Special handling for simulators which have a separate JS stack. |
| 2131 js_stack_comparable_address_ = | 2131 js_stack_comparable_address_ = |
| 2132 reinterpret_cast<void*>(v8::internal::SimulatorStack::RegisterCTryCatch( | 2132 reinterpret_cast<void*>(v8::internal::SimulatorStack::RegisterCTryCatch( |
| 2133 v8::internal::GetCurrentStackPosition())); | 2133 isolate_, v8::internal::GetCurrentStackPosition())); |
| 2134 isolate_->RegisterTryCatchHandler(this); | 2134 isolate_->RegisterTryCatchHandler(this); |
| 2135 } | 2135 } |
| 2136 | 2136 |
| 2137 | 2137 |
| 2138 v8::TryCatch::TryCatch(v8::Isolate* isolate) | 2138 v8::TryCatch::TryCatch(v8::Isolate* isolate) |
| 2139 : isolate_(reinterpret_cast<i::Isolate*>(isolate)), | 2139 : isolate_(reinterpret_cast<i::Isolate*>(isolate)), |
| 2140 next_(isolate_->try_catch_handler()), | 2140 next_(isolate_->try_catch_handler()), |
| 2141 is_verbose_(false), | 2141 is_verbose_(false), |
| 2142 can_continue_(true), | 2142 can_continue_(true), |
| 2143 capture_message_(true), | 2143 capture_message_(true), |
| 2144 rethrow_(false), | 2144 rethrow_(false), |
| 2145 has_terminated_(false) { | 2145 has_terminated_(false) { |
| 2146 ResetInternal(); | 2146 ResetInternal(); |
| 2147 // Special handling for simulators which have a separate JS stack. | 2147 // Special handling for simulators which have a separate JS stack. |
| 2148 js_stack_comparable_address_ = | 2148 js_stack_comparable_address_ = |
| 2149 reinterpret_cast<void*>(v8::internal::SimulatorStack::RegisterCTryCatch( | 2149 reinterpret_cast<void*>(v8::internal::SimulatorStack::RegisterCTryCatch( |
| 2150 v8::internal::GetCurrentStackPosition())); | 2150 isolate_, v8::internal::GetCurrentStackPosition())); |
| 2151 isolate_->RegisterTryCatchHandler(this); | 2151 isolate_->RegisterTryCatchHandler(this); |
| 2152 } | 2152 } |
| 2153 | 2153 |
| 2154 | 2154 |
| 2155 v8::TryCatch::~TryCatch() { | 2155 v8::TryCatch::~TryCatch() { |
| 2156 if (rethrow_) { | 2156 if (rethrow_) { |
| 2157 v8::Isolate* isolate = reinterpret_cast<Isolate*>(isolate_); | 2157 v8::Isolate* isolate = reinterpret_cast<Isolate*>(isolate_); |
| 2158 v8::HandleScope scope(isolate); | 2158 v8::HandleScope scope(isolate); |
| 2159 v8::Local<v8::Value> exc = v8::Local<v8::Value>::New(isolate, Exception()); | 2159 v8::Local<v8::Value> exc = v8::Local<v8::Value>::New(isolate, Exception()); |
| 2160 if (HasCaught() && capture_message_) { | 2160 if (HasCaught() && capture_message_) { |
| 2161 // If an exception was caught and rethrow_ is indicated, the saved | 2161 // If an exception was caught and rethrow_ is indicated, the saved |
| 2162 // message, script, and location need to be restored to Isolate TLS | 2162 // message, script, and location need to be restored to Isolate TLS |
| 2163 // for reuse. capture_message_ needs to be disabled so that Throw() | 2163 // for reuse. capture_message_ needs to be disabled so that Throw() |
| 2164 // does not create a new message. | 2164 // does not create a new message. |
| 2165 isolate_->thread_local_top()->rethrowing_message_ = true; | 2165 isolate_->thread_local_top()->rethrowing_message_ = true; |
| 2166 isolate_->RestorePendingMessageFromTryCatch(this); | 2166 isolate_->RestorePendingMessageFromTryCatch(this); |
| 2167 } | 2167 } |
| 2168 isolate_->UnregisterTryCatchHandler(this); | 2168 isolate_->UnregisterTryCatchHandler(this); |
| 2169 v8::internal::SimulatorStack::UnregisterCTryCatch(); | 2169 v8::internal::SimulatorStack::UnregisterCTryCatch(isolate_); |
| 2170 reinterpret_cast<Isolate*>(isolate_)->ThrowException(exc); | 2170 reinterpret_cast<Isolate*>(isolate_)->ThrowException(exc); |
| 2171 DCHECK(!isolate_->thread_local_top()->rethrowing_message_); | 2171 DCHECK(!isolate_->thread_local_top()->rethrowing_message_); |
| 2172 } else { | 2172 } else { |
| 2173 if (HasCaught() && isolate_->has_scheduled_exception()) { | 2173 if (HasCaught() && isolate_->has_scheduled_exception()) { |
| 2174 // If an exception was caught but is still scheduled because no API call | 2174 // If an exception was caught but is still scheduled because no API call |
| 2175 // promoted it, then it is canceled to prevent it from being propagated. | 2175 // promoted it, then it is canceled to prevent it from being propagated. |
| 2176 // Note that this will not cancel termination exceptions. | 2176 // Note that this will not cancel termination exceptions. |
| 2177 isolate_->CancelScheduledExceptionFromTryCatch(this); | 2177 isolate_->CancelScheduledExceptionFromTryCatch(this); |
| 2178 } | 2178 } |
| 2179 isolate_->UnregisterTryCatchHandler(this); | 2179 isolate_->UnregisterTryCatchHandler(this); |
| 2180 v8::internal::SimulatorStack::UnregisterCTryCatch(); | 2180 v8::internal::SimulatorStack::UnregisterCTryCatch(isolate_); |
| 2181 } | 2181 } |
| 2182 } | 2182 } |
| 2183 | 2183 |
| 2184 | 2184 |
| 2185 bool v8::TryCatch::HasCaught() const { | 2185 bool v8::TryCatch::HasCaught() const { |
| 2186 return !reinterpret_cast<i::Object*>(exception_)->IsTheHole(); | 2186 return !reinterpret_cast<i::Object*>(exception_)->IsTheHole(); |
| 2187 } | 2187 } |
| 2188 | 2188 |
| 2189 | 2189 |
| 2190 bool v8::TryCatch::CanContinue() const { | 2190 bool v8::TryCatch::CanContinue() const { |
| (...skipping 6319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8510 Address callback_address = | 8510 Address callback_address = |
| 8511 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8511 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 8512 VMState<EXTERNAL> state(isolate); | 8512 VMState<EXTERNAL> state(isolate); |
| 8513 ExternalCallbackScope call_scope(isolate, callback_address); | 8513 ExternalCallbackScope call_scope(isolate, callback_address); |
| 8514 callback(info); | 8514 callback(info); |
| 8515 } | 8515 } |
| 8516 | 8516 |
| 8517 | 8517 |
| 8518 } // namespace internal | 8518 } // namespace internal |
| 8519 } // namespace v8 | 8519 } // namespace v8 |
| OLD | NEW |