Reviewers: Sven Panne,

Description:
Make Isolate::GetData and Isolate::SetData inlineable.

[email protected]
TEST=cctest/test-api/IsolateEmbedderData


Please review this at https://chromiumcodereview.appspot.com/10196013/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M include/v8.h
  M src/api.cc
  M test/cctest/test-api.cc


Index: include/v8.h
diff --git a/include/v8.h b/include/v8.h
index e4fffadc81b6c29e44d7801eaefc14535bdce35f..dc2e6fef7592dfce6adc4f6dd7f2cf06bab73234 100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -2816,13 +2816,13 @@ class V8EXPORT Isolate {
   /**
    * Associate embedder-specific data with the isolate
    */
-  void SetData(void* data);
+  inline void SetData(void* data);

   /**
    * Retrive embedder-specific data from the isolate.
    * Returns NULL if SetData has never been called.
    */
-  void* GetData();
+  inline void* GetData();

  private:
   Isolate();
@@ -3961,6 +3961,18 @@ class Internals {
     return *reinterpret_cast<int*>(addr) == 1;
   }

+  static inline void SetEmbedderData(v8::Isolate* isolate, void* data) {
+    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
+        kIsolateEmbedderDataOffset;
+    *reinterpret_cast<void**>(addr) = data;
+  }
+
+  static inline void* GetEmbedderData(v8::Isolate* isolate) {
+    uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
+        kIsolateEmbedderDataOffset;
+    return *reinterpret_cast<void**>(addr);
+  }
+
static inline internal::Object** GetRoot(v8::Isolate* isolate, int index) { uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + kIsolateRootsOffset; return reinterpret_cast<internal::Object**>(addr + index * kApiPointerSize);
@@ -4424,6 +4436,18 @@ Handle<Boolean> False(Isolate* isolate) {
 }


+void Isolate::SetData(void* data) {
+  typedef internal::Internals I;
+  I::SetEmbedderData(this, data);
+}
+
+
+void* Isolate::GetData() {
+  typedef internal::Internals I;
+  return I::GetEmbedderData(this);
+}
+
+
 /**
  * \example shell.cc
  * A simple shell that takes a list of expressions on the
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index 124875a769be391e5ce38f4f3ee9fa9497ffa16b..8cdd3912390e302807f78e4901efc46be9794582 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -5396,17 +5396,6 @@ void Isolate::Exit() {
 }


-void Isolate::SetData(void* data) {
-  i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
-  isolate->SetData(data);
-}
-
-void* Isolate::GetData() {
-  i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
-  return isolate->GetData();
-}
-
-
 String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj)
     : str_(NULL), length_(0) {
   i::Isolate* isolate = i::Isolate::Current();
Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index ba836479109eb55918292074e84692286d05deda..520bd8ad326b79f585da8b2c99dd5de9ad93748c 100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -16504,3 +16504,21 @@ TEST(StaticGettersAfterDeath) {
   CHECK(v8::False(isolate).IsEmpty());
   CHECK_EQ(9, fatal_error_callback_counter);
 }
+
+
+TEST(IsolateEmbedderData) {
+  v8::Isolate* isolate = v8::Isolate::GetCurrent();
+  CHECK_EQ(NULL, isolate->GetData());
+  CHECK_EQ(NULL, ISOLATE->GetData());
+  static void* data1 = (void*)0xacce55ed;
+  isolate->SetData(data1);
+  CHECK_EQ(data1, isolate->GetData());
+  CHECK_EQ(data1, ISOLATE->GetData());
+  static void* data2 = (void*)0xdecea5ed;
+  ISOLATE->SetData(data2);
+  CHECK_EQ(data2, isolate->GetData());
+  CHECK_EQ(data2, ISOLATE->GetData());
+  ISOLATE->TearDown();
+  CHECK_EQ(data2, isolate->GetData());
+  CHECK_EQ(data2, ISOLATE->GetData());
+}


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to