Index: include/v8.h |
diff --git a/include/v8.h b/include/v8.h |
index 13ec7470dbf29b553a2d99d1e3333cb4bec5bc23..df82352703664bd2019d1fb3727df7d638af9cbc 100644 |
--- a/include/v8.h |
+++ b/include/v8.h |
@@ -4054,17 +4054,37 @@ class V8_EXPORT Isolate { |
void Dispose(); |
/** |
- * Associate embedder-specific data with the isolate |
+ * Associate embedder-specific data with the isolate. This legacy method |
+ * puts the data in the 0th slot. It will be deprecated soon. |
*/ |
V8_INLINE void SetData(void* data); |
/** |
- * Retrieve embedder-specific data from the isolate. |
+ * Associate embedder-specific data with the isolate. |slot| has to be |
+ * between 0 and GetNumberOfDataSlots() - 1. |
+ */ |
+ V8_INLINE void SetData(uint32_t slot, void* data); |
+ |
+ /** |
+ * Retrieve embedder-specific data from the isolate. This legacy method |
+ * retrieves the data from slot 0. It will be deprecated soon. |
* Returns NULL if SetData has never been called. |
*/ |
V8_INLINE void* GetData(); |
/** |
+ * Retrieve embedder-specific data from the isolate. |
+ * Returns NULL if SetData has never been called for the given |slot|. |
+ */ |
+ V8_INLINE void* GetData(uint32_t slot); |
+ |
+ /** |
+ * Returns the maximum number of available embedder data slots. Valid slots |
+ * are in the range of 0 - GetNumberOfDataSlots() - 1. |
+ */ |
+ V8_INLINE static uint32_t GetNumberOfDataSlots(); |
+ |
+ /** |
* Get statistics about the heap memory usage. |
*/ |
void GetHeapStatistics(HeapStatistics* heap_statistics); |
@@ -5448,8 +5468,8 @@ class Internals { |
static const int kExternalTwoByteRepresentationTag = 0x02; |
static const int kExternalAsciiRepresentationTag = 0x06; |
- static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize; |
- static const int kIsolateRootsOffset = 3 * kApiPointerSize; |
+ static const int kIsolateEmbedderDataOffset = 0 * kApiPointerSize; |
+ static const int kIsolateRootsOffset = 5 * kApiPointerSize; |
static const int kUndefinedValueRootIndex = 5; |
static const int kNullValueRootIndex = 7; |
static const int kTrueValueRootIndex = 8; |
@@ -5473,6 +5493,8 @@ class Internals { |
static const int kUndefinedOddballKind = 5; |
static const int kNullOddballKind = 3; |
+ static const uint32_t kNumIsolateDataSlots = 4; |
+ |
V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate); |
V8_INLINE static void CheckInitialized(v8::Isolate* isolate) { |
#ifdef V8_ENABLE_CHECKS |
@@ -5536,15 +5558,17 @@ class Internals { |
*addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value); |
} |
- V8_INLINE static void SetEmbedderData(v8::Isolate* isolate, void* data) { |
- uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + |
- kIsolateEmbedderDataOffset; |
+ V8_INLINE static void SetEmbedderData(v8::Isolate *isolate, |
+ uint32_t slot, |
+ void *data) { |
+ uint8_t *addr = reinterpret_cast<uint8_t *>(isolate) + |
+ kIsolateEmbedderDataOffset + slot * kApiPointerSize; |
*reinterpret_cast<void**>(addr) = data; |
} |
- V8_INLINE static void* GetEmbedderData(v8::Isolate* isolate) { |
+ V8_INLINE static void* GetEmbedderData(v8::Isolate* isolate, uint32_t slot) { |
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) + |
- kIsolateEmbedderDataOffset; |
+ kIsolateEmbedderDataOffset + slot * kApiPointerSize; |
return *reinterpret_cast<void**>(addr); |
} |
@@ -6470,13 +6494,31 @@ Handle<Boolean> False(Isolate* isolate) { |
void Isolate::SetData(void* data) { |
typedef internal::Internals I; |
- I::SetEmbedderData(this, data); |
+ I::SetEmbedderData(this, 0, data); |
} |
void* Isolate::GetData() { |
typedef internal::Internals I; |
- return I::GetEmbedderData(this); |
+ return I::GetEmbedderData(this, 0); |
+} |
+ |
+ |
+void Isolate::SetData(uint32_t slot, void* data) { |
+ typedef internal::Internals I; |
+ I::SetEmbedderData(this, slot, data); |
+} |
+ |
+ |
+void* Isolate::GetData(uint32_t slot) { |
+ typedef internal::Internals I; |
+ return I::GetEmbedderData(this, slot); |
+} |
+ |
+ |
+uint32_t Isolate::GetNumberOfDataSlots() { |
+ typedef internal::Internals I; |
+ return I::kNumIsolateDataSlots; |
} |