| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index 5ef6e5924998110c94bda8fe2ea35fb8c42ea24c..0207eb57a6f55bfe7d16b6a0bf126a0ef2b3a99e 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -118,31 +118,9 @@ namespace v8 {
|
| EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, ;)
|
|
|
|
|
| -#define API_ENTRY_CHECK(isolate, msg) \
|
| - do { \
|
| - if (v8::Locker::IsActive()) { \
|
| - Utils::ApiCheck(isolate->thread_manager()->IsLockedByCurrentThread(), \
|
| - msg, \
|
| - "Entering the V8 API without proper locking in place"); \
|
| - } \
|
| - } while (false)
|
| -
|
| -
|
| // --- E x c e p t i o n B e h a v i o r ---
|
|
|
|
|
| -static void DefaultFatalErrorHandler(const char* location,
|
| - const char* message) {
|
| - i::Isolate* isolate = i::Isolate::Current();
|
| - if (isolate->IsInitialized()) {
|
| - i::VMState<i::OTHER> state(isolate);
|
| - API_Fatal(location, message);
|
| - } else {
|
| - API_Fatal(location, message);
|
| - }
|
| -}
|
| -
|
| -
|
| void i::FatalProcessOutOfMemory(const char* location) {
|
| i::V8::FatalProcessOutOfMemory(location, false);
|
| }
|
| @@ -220,10 +198,14 @@ void i::V8::FatalProcessOutOfMemory(const char* location, bool take_snapshot) {
|
|
|
| void Utils::ReportApiFailure(const char* location, const char* message) {
|
| i::Isolate* isolate = i::Isolate::Current();
|
| - FatalErrorCallback callback = isolate->exception_behavior() == NULL
|
| - ? DefaultFatalErrorHandler
|
| - : isolate->exception_behavior();
|
| - callback(location, message);
|
| + FatalErrorCallback callback = isolate->exception_behavior();
|
| + if (callback == NULL) {
|
| + i::OS::PrintError("\n#\n# Fatal error in %s\n# %s\n#\n\n",
|
| + location, message);
|
| + i::OS::Abort();
|
| + } else {
|
| + callback(location, message);
|
| + }
|
| isolate->SignalFatalError();
|
| }
|
|
|
| @@ -611,7 +593,13 @@ HandleScope::HandleScope(Isolate* isolate) {
|
|
|
| void HandleScope::Initialize(Isolate* isolate) {
|
| i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| - API_ENTRY_CHECK(internal_isolate, "HandleScope::HandleScope");
|
| + // We do not want to check the correct usage of the Locker class all over the
|
| + // place, so we do it only here: Without a HandleScope, an embedder can do
|
| + // almost nothing, so it is enough to check in this central place.
|
| + Utils::ApiCheck(!v8::Locker::IsActive() ||
|
| + internal_isolate->thread_manager()->IsLockedByCurrentThread(),
|
| + "HandleScope::HandleScope",
|
| + "Entering the V8 API without proper locking in place");
|
| v8::ImplementationUtilities::HandleScopeData* current =
|
| internal_isolate->handle_scope_data();
|
| isolate_ = internal_isolate;
|
| @@ -668,22 +656,24 @@ void Context::Enter() {
|
| i::Handle<i::Context> env = Utils::OpenHandle(this);
|
| i::Isolate* isolate = env->GetIsolate();
|
| ENTER_V8(isolate);
|
| - isolate->handle_scope_implementer()->EnterContext(env);
|
| - isolate->handle_scope_implementer()->SaveContext(isolate->context());
|
| + i::HandleScopeImplementer* impl = isolate->handle_scope_implementer();
|
| + impl->EnterContext(env);
|
| + impl->SaveContext(isolate->context());
|
| isolate->set_context(*env);
|
| }
|
|
|
|
|
| void Context::Exit() {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| - i::Handle<i::Context> context = i::Handle<i::Context>::null();
|
| + i::Handle<i::Context> env = Utils::OpenHandle(this);
|
| + i::Isolate* isolate = env->GetIsolate();
|
| ENTER_V8(isolate);
|
| i::HandleScopeImplementer* impl = isolate->handle_scope_implementer();
|
| - if (!Utils::ApiCheck(impl->LeaveContext(context),
|
| + if (!Utils::ApiCheck(impl->LastEnteredContextWas(env),
|
| "v8::Context::Exit()",
|
| "Cannot exit non-entered context")) {
|
| return;
|
| }
|
| + impl->LeaveContext();
|
| isolate->set_context(impl->RestoreContext());
|
| }
|
|
|
|
|