Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Unified Diff: src/api.cc

Issue 5107003: [Isolates] Cleanup of codepaths slowing down Dromaeo in browser. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/isolates
Patch Set: tiny fix Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/v8.h ('k') | src/builtins.cc » ('j') | src/log.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index f28082344cc34f20f78be91f3619cff64530ea34..4887c1bc30b4cd721281455acd26989153108833 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -268,8 +268,8 @@ static bool InitializeHelper() {
}
-static inline bool EnsureInitialized(const char* location) {
- i::Isolate* isolate = i::Isolate::UncheckedCurrent();
+static inline bool EnsureInitializedForIsolate(i::Isolate* isolate,
+ const char* location) {
if (isolate != NULL) {
if (isolate->IsDefaultIsolate()) {
if (i::V8::IsRunning()) {
@@ -287,6 +287,10 @@ static inline bool EnsureInitialized(const char* location) {
return ApiCheck(InitializeHelper(), location, "Error initializing V8");
}
+static inline bool EnsureInitialized(const char* location) {
+ i::Isolate* isolate = i::Isolate::UncheckedCurrent();
+ return EnsureInitializedForIsolate(isolate, location);
+}
#ifdef DEBUG
void ImplementationUtilities::ZapHandleRange(i::Object** begin,
@@ -303,8 +307,11 @@ v8::Handle<v8::Primitive> ImplementationUtilities::Undefined() {
v8::Handle<v8::Primitive> ImplementationUtilities::Null() {
- if (!EnsureInitialized("v8::Null()")) return v8::Handle<v8::Primitive>();
- return v8::Handle<Primitive>(ToApi<Primitive>(FACTORY->null_value()));
+ i::Isolate* isolate = i::Isolate::UncheckedCurrent();
+ if (!EnsureInitializedForIsolate(isolate, "v8::Null()"))
+ return v8::Handle<v8::Primitive>();
+ return v8::Handle<Primitive>(
+ ToApi<Primitive>(isolate->factory()->null_value()));
}
@@ -511,12 +518,66 @@ int HandleScope::NumberOfHandles() {
return i::HandleScope::NumberOfHandles();
}
+// Define GetIsolateFromApiObject for various Api types. Need a few of them,
+// since they do not form inheritance hierarchy with a single HeapObject-backed
+// base class. First, declare the catch-all method:
+inline static i::Isolate* GetIsolateFromApiObject(Data* value) {
+ return i::Isolate::Current();
+}
+
+// Also declare overrides that know some types are backed by HeapObjects:
+#define MAKE_GET_ISOLATE_FROM_API_OBJECT(Type) \
+ inline static i::Isolate* GetIsolateFromApiObject(Type* value) { \
+ i::HeapObject** p = reinterpret_cast<i::HeapObject**>(value); \
+ ASSERT((*p)->IsHeapObject()); \
+ return (*p)->GetIsolate(); \
+ }
+
+MAKE_GET_ISOLATE_FROM_API_OBJECT(Context)
+MAKE_GET_ISOLATE_FROM_API_OBJECT(String)
+MAKE_GET_ISOLATE_FROM_API_OBJECT(Object)
+MAKE_GET_ISOLATE_FROM_API_OBJECT(Message)
+MAKE_GET_ISOLATE_FROM_API_OBJECT(StackTrace)
+MAKE_GET_ISOLATE_FROM_API_OBJECT(StackFrame)
+
+#undef MAKE_GET_ISOLATE_FROM_API_OBJECT
+
-i::Object** v8::HandleScope::CreateHandle(i::Object* value) {
- return i::HandleScope::CreateHandle(value, i::Isolate::Current());
+template <class T>
+internal::Object** HandleScope::CreateHandle(T* value) {
+ internal::Object** p = reinterpret_cast<internal::Object**>(value);
+ return i::HandleScope::CreateHandle(*p, GetIsolateFromApiObject(value));
}
+// We need to explicitly instantiate this method for particular types since
+// there is no callers for this instances in this file, so the instances are
+// not generated at all and linker complains.
+#define MAKE_CREATE_HANDLE(Type) \
Vitaly Repeshko 2010/12/06 18:18:45 Ugh, I'm not a huge fan of explicit template insta
+ template internal::Object** HandleScope::CreateHandle<Type>(Type* value);
+
+MAKE_CREATE_HANDLE(Context)
+MAKE_CREATE_HANDLE(Value)
+MAKE_CREATE_HANDLE(Function)
+MAKE_CREATE_HANDLE(String)
+MAKE_CREATE_HANDLE(RegExp)
+MAKE_CREATE_HANDLE(Object)
+MAKE_CREATE_HANDLE(Array)
+MAKE_CREATE_HANDLE(External)
+MAKE_CREATE_HANDLE(FunctionTemplate)
+MAKE_CREATE_HANDLE(ObjectTemplate)
+MAKE_CREATE_HANDLE(Signature)
+MAKE_CREATE_HANDLE(TypeSwitch)
+MAKE_CREATE_HANDLE(Message)
+MAKE_CREATE_HANDLE(StackTrace)
+MAKE_CREATE_HANDLE(StackFrame)
+MAKE_CREATE_HANDLE(Number)
+MAKE_CREATE_HANDLE(Integer)
+MAKE_CREATE_HANDLE(Uint32)
+
+#undef MAKE_CREATE_HANDLE
+
+
void Context::Enter() {
if (IsDeadCheck("v8::Context::Enter()")) return;
ENTER_V8;
@@ -3857,12 +3918,14 @@ Local<Number> v8::Number::New(double value) {
Local<Integer> v8::Integer::New(int32_t value) {
- EnsureInitialized("v8::Integer::New()");
+ i::Isolate* isolate = i::Isolate::UncheckedCurrent();
+ EnsureInitializedForIsolate(isolate, "v8::Integer::New()");
if (i::Smi::IsValid(value)) {
- return Utils::IntegerToLocal(i::Handle<i::Object>(i::Smi::FromInt(value)));
+ return Utils::IntegerToLocal(i::Handle<i::Object>(i::Smi::FromInt(value),
+ isolate));
}
ENTER_V8;
- i::Handle<i::Object> result = FACTORY->NewNumber(value);
+ i::Handle<i::Object> result = isolate->factory()->NewNumber(value);
return Utils::IntegerToLocal(result);
}
« no previous file with comments | « include/v8.h ('k') | src/builtins.cc » ('j') | src/log.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698