Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index 415bd41bb19496036f3bda9a6c78ac55ec033ecd..9756874f6978bb229a0980454a120d8deb75a62c 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -750,29 +750,22 @@ i::Object** HandleScope::CreateHandle(i::HeapObject* value) { |
void Context::Enter() { |
i::Handle<i::Context> env = Utils::OpenHandle(this); |
i::Isolate* isolate = env->GetIsolate(); |
- if (IsDeadCheck(isolate, "v8::Context::Enter()")) return; |
ENTER_V8(isolate); |
- |
isolate->handle_scope_implementer()->EnterContext(env); |
- |
isolate->handle_scope_implementer()->SaveContext(isolate->context()); |
isolate->set_context(*env); |
} |
void Context::Exit() { |
- // Exit is essentially a static function and doesn't use the |
- // receiver, so we have to get the current isolate from the thread |
- // local. |
- i::Isolate* isolate = i::Isolate::Current(); |
- if (!isolate->IsInitialized()) return; |
- |
- if (!ApiCheck(isolate->handle_scope_implementer()->LeaveLastContext(), |
+ i::Handle<i::Context> context = Utils::OpenHandle(this); |
+ i::Isolate* isolate = context->GetIsolate(); |
+ ENTER_V8(isolate); |
+ if (!ApiCheck(isolate->handle_scope_implementer()->LeaveContext(context), |
"v8::Context::Exit()", |
"Cannot exit non-entered context")) { |
return; |
} |
- |
// Content of 'last_context' could be NULL. |
i::Context* last_context = |
isolate->handle_scope_implementer()->RestoreContext(); |
@@ -5494,11 +5487,7 @@ v8::Local<v8::Context> Context::GetEntered() { |
if (!EnsureInitializedForIsolate(isolate, "v8::Context::GetEntered()")) { |
return Local<Context>(); |
} |
- i::Handle<i::Object> last = |
- isolate->handle_scope_implementer()->LastEnteredContext(); |
- if (last.is_null()) return Local<Context>(); |
- i::Handle<i::Context> context = i::Handle<i::Context>::cast(last); |
- return Utils::ToLocal(context); |
+ return reinterpret_cast<Isolate*>(isolate)->GetEnteredContext(); |
} |
@@ -5516,45 +5505,30 @@ v8::Local<v8::Context> Context::GetCalling() { |
if (IsDeadCheck(isolate, "v8::Context::GetCalling()")) { |
return Local<Context>(); |
} |
- i::Handle<i::Object> calling = |
- isolate->GetCallingNativeContext(); |
- if (calling.is_null()) return Local<Context>(); |
- i::Handle<i::Context> context = i::Handle<i::Context>::cast(calling); |
- return Utils::ToLocal(context); |
+ return reinterpret_cast<Isolate*>(isolate)->GetCallingContext(); |
} |
v8::Local<v8::Object> Context::Global() { |
- i::Isolate* isolate = i::Isolate::Current(); |
- if (IsDeadCheck(isolate, "v8::Context::Global()")) { |
- return Local<v8::Object>(); |
- } |
- i::Object** ctx = reinterpret_cast<i::Object**>(this); |
- i::Handle<i::Context> context = |
- i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); |
+ i::Handle<i::Context> context = Utils::OpenHandle(this); |
+ i::Isolate* isolate = context->GetIsolate(); |
i::Handle<i::Object> global(context->global_proxy(), isolate); |
return Utils::ToLocal(i::Handle<i::JSObject>::cast(global)); |
} |
void Context::DetachGlobal() { |
- i::Isolate* isolate = i::Isolate::Current(); |
- if (IsDeadCheck(isolate, "v8::Context::DetachGlobal()")) return; |
+ i::Handle<i::Context> context = Utils::OpenHandle(this); |
+ i::Isolate* isolate = context->GetIsolate(); |
ENTER_V8(isolate); |
- i::Object** ctx = reinterpret_cast<i::Object**>(this); |
- i::Handle<i::Context> context = |
- i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); |
isolate->bootstrapper()->DetachGlobal(context); |
} |
void Context::ReattachGlobal(Handle<Object> global_object) { |
- i::Isolate* isolate = i::Isolate::Current(); |
- if (IsDeadCheck(isolate, "v8::Context::ReattachGlobal()")) return; |
+ i::Handle<i::Context> context = Utils::OpenHandle(this); |
+ i::Isolate* isolate = context->GetIsolate(); |
ENTER_V8(isolate); |
- i::Object** ctx = reinterpret_cast<i::Object**>(this); |
- i::Handle<i::Context> context = |
- i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); |
i::Handle<i::JSGlobalProxy> global_proxy = |
i::Handle<i::JSGlobalProxy>::cast(Utils::OpenHandle(*global_object)); |
isolate->bootstrapper()->ReattachGlobal(context, global_proxy); |
@@ -5562,44 +5536,23 @@ void Context::ReattachGlobal(Handle<Object> global_object) { |
void Context::AllowCodeGenerationFromStrings(bool allow) { |
- i::Isolate* isolate = i::Isolate::Current(); |
- if (IsDeadCheck(isolate, "v8::Context::AllowCodeGenerationFromStrings()")) { |
- return; |
- } |
+ i::Handle<i::Context> context = Utils::OpenHandle(this); |
+ i::Isolate* isolate = context->GetIsolate(); |
ENTER_V8(isolate); |
- i::Object** ctx = reinterpret_cast<i::Object**>(this); |
- i::Handle<i::Context> context = |
- i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); |
context->set_allow_code_gen_from_strings( |
allow ? isolate->heap()->true_value() : isolate->heap()->false_value()); |
} |
bool Context::IsCodeGenerationFromStringsAllowed() { |
- i::Isolate* isolate = i::Isolate::Current(); |
- if (IsDeadCheck(isolate, |
- "v8::Context::IsCodeGenerationFromStringsAllowed()")) { |
- return false; |
- } |
- ENTER_V8(isolate); |
- i::Object** ctx = reinterpret_cast<i::Object**>(this); |
- i::Handle<i::Context> context = |
- i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); |
+ i::Handle<i::Context> context = Utils::OpenHandle(this); |
return !context->allow_code_gen_from_strings()->IsFalse(); |
} |
void Context::SetErrorMessageForCodeGenerationFromStrings( |
Handle<String> error) { |
- i::Isolate* isolate = i::Isolate::Current(); |
- if (IsDeadCheck(isolate, |
- "v8::Context::SetErrorMessageForCodeGenerationFromStrings()")) { |
- return; |
- } |
- ENTER_V8(isolate); |
- i::Object** ctx = reinterpret_cast<i::Object**>(this); |
- i::Handle<i::Context> context = |
- i::Handle<i::Context>::cast(i::Handle<i::Object>(ctx)); |
+ i::Handle<i::Context> context = Utils::OpenHandle(this); |
i::Handle<i::String> error_handle = Utils::OpenHandle(*error); |
context->set_error_message_for_code_gen_from_strings(*error_handle); |
} |
@@ -6647,9 +6600,15 @@ CpuProfiler* Isolate::GetCpuProfiler() { |
} |
+bool Isolate::InContext() { |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
+ return isolate->context() != NULL; |
+} |
+ |
+ |
v8::Local<v8::Context> Isolate::GetCurrentContext() { |
- i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(this); |
- i::Context* context = internal_isolate->context(); |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
+ i::Context* context = isolate->context(); |
if (context == NULL) return Local<Context>(); |
i::Context* native_context = context->global_object()->native_context(); |
if (native_context == NULL) return Local<Context>(); |
@@ -6657,6 +6616,23 @@ v8::Local<v8::Context> Isolate::GetCurrentContext() { |
} |
+v8::Local<v8::Context> Isolate::GetCallingContext() { |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
+ i::Handle<i::Object> calling = isolate->GetCallingNativeContext(); |
+ if (calling.is_null()) return Local<Context>(); |
+ return Utils::ToLocal(i::Handle<i::Context>::cast(calling)); |
+} |
+ |
+ |
+v8::Local<v8::Context> Isolate::GetEnteredContext() { |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); |
+ i::Handle<i::Object> last = |
+ isolate->handle_scope_implementer()->LastEnteredContext(); |
+ if (last.is_null()) return Local<Context>(); |
+ return Utils::ToLocal(i::Handle<i::Context>::cast(last)); |
+} |
+ |
+ |
void Isolate::SetObjectGroupId(const Persistent<Value>& object, |
UniqueId id) { |
i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(this); |