Reland r17907 - Make it possible to add more than one piece of embedder data to isolates"
This will allow for using gin and blink bindings in the same process. Over r17907, I changed the order of fields in Isolate to be stable across different platforms, since the ABI defined packing is not the same on all targets, and I initialize the embedder data field in Isolate. BUG=317398 R=svenpanne@chromium.org, dcarney@chromium.org LOG=n Review URL: https://codereview.chromium.org/78453002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17935 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
42f920cfea
commit
840bc42de0
64
include/v8.h
64
include/v8.h
@ -4054,16 +4054,36 @@ class V8_EXPORT Isolate {
|
|||||||
void Dispose();
|
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);
|
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.
|
* Returns NULL if SetData has never been called.
|
||||||
*/
|
*/
|
||||||
V8_INLINE void* GetData();
|
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.
|
* Get statistics about the heap memory usage.
|
||||||
*/
|
*/
|
||||||
@ -5448,8 +5468,8 @@ class Internals {
|
|||||||
static const int kExternalTwoByteRepresentationTag = 0x02;
|
static const int kExternalTwoByteRepresentationTag = 0x02;
|
||||||
static const int kExternalAsciiRepresentationTag = 0x06;
|
static const int kExternalAsciiRepresentationTag = 0x06;
|
||||||
|
|
||||||
static const int kIsolateEmbedderDataOffset = 1 * kApiPointerSize;
|
static const int kIsolateEmbedderDataOffset = 0 * kApiPointerSize;
|
||||||
static const int kIsolateRootsOffset = 3 * kApiPointerSize;
|
static const int kIsolateRootsOffset = 5 * kApiPointerSize;
|
||||||
static const int kUndefinedValueRootIndex = 5;
|
static const int kUndefinedValueRootIndex = 5;
|
||||||
static const int kNullValueRootIndex = 7;
|
static const int kNullValueRootIndex = 7;
|
||||||
static const int kTrueValueRootIndex = 8;
|
static const int kTrueValueRootIndex = 8;
|
||||||
@ -5473,6 +5493,8 @@ class Internals {
|
|||||||
static const int kUndefinedOddballKind = 5;
|
static const int kUndefinedOddballKind = 5;
|
||||||
static const int kNullOddballKind = 3;
|
static const int kNullOddballKind = 3;
|
||||||
|
|
||||||
|
static const uint32_t kNumIsolateDataSlots = 4;
|
||||||
|
|
||||||
V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate);
|
V8_EXPORT static void CheckInitializedImpl(v8::Isolate* isolate);
|
||||||
V8_INLINE static void CheckInitialized(v8::Isolate* isolate) {
|
V8_INLINE static void CheckInitialized(v8::Isolate* isolate) {
|
||||||
#ifdef V8_ENABLE_CHECKS
|
#ifdef V8_ENABLE_CHECKS
|
||||||
@ -5536,15 +5558,17 @@ class Internals {
|
|||||||
*addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value);
|
*addr = static_cast<uint8_t>((*addr & ~kNodeStateMask) | value);
|
||||||
}
|
}
|
||||||
|
|
||||||
V8_INLINE static void SetEmbedderData(v8::Isolate* isolate, void* data) {
|
V8_INLINE static void SetEmbedderData(v8::Isolate *isolate,
|
||||||
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
|
uint32_t slot,
|
||||||
kIsolateEmbedderDataOffset;
|
void *data) {
|
||||||
|
uint8_t *addr = reinterpret_cast<uint8_t *>(isolate) +
|
||||||
|
kIsolateEmbedderDataOffset + slot * kApiPointerSize;
|
||||||
*reinterpret_cast<void**>(addr) = data;
|
*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) +
|
uint8_t* addr = reinterpret_cast<uint8_t*>(isolate) +
|
||||||
kIsolateEmbedderDataOffset;
|
kIsolateEmbedderDataOffset + slot * kApiPointerSize;
|
||||||
return *reinterpret_cast<void**>(addr);
|
return *reinterpret_cast<void**>(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6470,13 +6494,31 @@ Handle<Boolean> False(Isolate* isolate) {
|
|||||||
|
|
||||||
void Isolate::SetData(void* data) {
|
void Isolate::SetData(void* data) {
|
||||||
typedef internal::Internals I;
|
typedef internal::Internals I;
|
||||||
I::SetEmbedderData(this, data);
|
I::SetEmbedderData(this, 0, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void* Isolate::GetData() {
|
void* Isolate::GetData() {
|
||||||
typedef internal::Internals I;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -90,15 +90,15 @@ class PerIsolateData {
|
|||||||
public:
|
public:
|
||||||
explicit PerIsolateData(Isolate* isolate) : isolate_(isolate), realms_(NULL) {
|
explicit PerIsolateData(Isolate* isolate) : isolate_(isolate), realms_(NULL) {
|
||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
isolate->SetData(this);
|
isolate->SetData(0, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~PerIsolateData() {
|
~PerIsolateData() {
|
||||||
isolate_->SetData(NULL); // Not really needed, just to be sure...
|
isolate_->SetData(0, NULL); // Not really needed, just to be sure...
|
||||||
}
|
}
|
||||||
|
|
||||||
inline static PerIsolateData* Get(Isolate* isolate) {
|
inline static PerIsolateData* Get(Isolate* isolate) {
|
||||||
return reinterpret_cast<PerIsolateData*>(isolate->GetData());
|
return reinterpret_cast<PerIsolateData*>(isolate->GetData(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
class RealmScope {
|
class RealmScope {
|
||||||
|
@ -1524,8 +1524,8 @@ void Isolate::ThreadDataTable::RemoveAllThreads(Isolate* isolate) {
|
|||||||
|
|
||||||
|
|
||||||
Isolate::Isolate()
|
Isolate::Isolate()
|
||||||
: state_(UNINITIALIZED),
|
: embedder_data_(),
|
||||||
embedder_data_(NULL),
|
state_(UNINITIALIZED),
|
||||||
entry_stack_(NULL),
|
entry_stack_(NULL),
|
||||||
stack_trace_nesting_level_(0),
|
stack_trace_nesting_level_(0),
|
||||||
incomplete_message_(NULL),
|
incomplete_message_(NULL),
|
||||||
|
@ -1045,8 +1045,14 @@ class Isolate {
|
|||||||
thread_local_top_.current_vm_state_ = state;
|
thread_local_top_.current_vm_state_ = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetData(void* data) { embedder_data_ = data; }
|
void SetData(uint32_t slot, void* data) {
|
||||||
void* GetData() { return embedder_data_; }
|
ASSERT(slot < Internals::kNumIsolateDataSlots);
|
||||||
|
embedder_data_[slot] = data;
|
||||||
|
}
|
||||||
|
void* GetData(uint32_t slot) {
|
||||||
|
ASSERT(slot < Internals::kNumIsolateDataSlots);
|
||||||
|
return embedder_data_[slot];
|
||||||
|
}
|
||||||
|
|
||||||
LookupResult* top_lookup_result() {
|
LookupResult* top_lookup_result() {
|
||||||
return thread_local_top_.top_lookup_result_;
|
return thread_local_top_.top_lookup_result_;
|
||||||
@ -1159,9 +1165,9 @@ class Isolate {
|
|||||||
// These fields are accessed through the API, offsets must be kept in sync
|
// These fields are accessed through the API, offsets must be kept in sync
|
||||||
// with v8::internal::Internals (in include/v8.h) constants. This is also
|
// with v8::internal::Internals (in include/v8.h) constants. This is also
|
||||||
// verified in Isolate::Init() using runtime checks.
|
// verified in Isolate::Init() using runtime checks.
|
||||||
State state_; // Will be padded to kApiPointerSize.
|
void* embedder_data_[Internals::kNumIsolateDataSlots];
|
||||||
void* embedder_data_;
|
|
||||||
Heap heap_;
|
Heap heap_;
|
||||||
|
State state_; // Will be padded to kApiPointerSize.
|
||||||
|
|
||||||
// The per-process lock should be acquired before the ThreadDataTable is
|
// The per-process lock should be acquired before the ThreadDataTable is
|
||||||
// modified.
|
// modified.
|
||||||
|
@ -19937,16 +19937,28 @@ UNINITIALIZED_TEST(IsolateEmbedderData) {
|
|||||||
v8::Isolate* isolate = v8::Isolate::New();
|
v8::Isolate* isolate = v8::Isolate::New();
|
||||||
isolate->Enter();
|
isolate->Enter();
|
||||||
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
||||||
CHECK_EQ(NULL, isolate->GetData());
|
for (uint32_t slot = 0; slot < v8::Isolate::GetNumberOfDataSlots(); ++slot) {
|
||||||
CHECK_EQ(NULL, i_isolate->GetData());
|
CHECK_EQ(NULL, isolate->GetData(slot));
|
||||||
static void* data1 = reinterpret_cast<void*>(0xacce55ed);
|
CHECK_EQ(NULL, i_isolate->GetData(slot));
|
||||||
isolate->SetData(data1);
|
}
|
||||||
CHECK_EQ(data1, isolate->GetData());
|
for (uint32_t slot = 0; slot < v8::Isolate::GetNumberOfDataSlots(); ++slot) {
|
||||||
CHECK_EQ(data1, i_isolate->GetData());
|
void* data = reinterpret_cast<void*>(0xacce55ed + slot);
|
||||||
static void* data2 = reinterpret_cast<void*>(0xdecea5ed);
|
isolate->SetData(slot, data);
|
||||||
i_isolate->SetData(data2);
|
}
|
||||||
CHECK_EQ(data2, isolate->GetData());
|
for (uint32_t slot = 0; slot < v8::Isolate::GetNumberOfDataSlots(); ++slot) {
|
||||||
CHECK_EQ(data2, i_isolate->GetData());
|
void* data = reinterpret_cast<void*>(0xacce55ed + slot);
|
||||||
|
CHECK_EQ(data, isolate->GetData(slot));
|
||||||
|
CHECK_EQ(data, i_isolate->GetData(slot));
|
||||||
|
}
|
||||||
|
for (uint32_t slot = 0; slot < v8::Isolate::GetNumberOfDataSlots(); ++slot) {
|
||||||
|
void* data = reinterpret_cast<void*>(0xdecea5ed + slot);
|
||||||
|
isolate->SetData(slot, data);
|
||||||
|
}
|
||||||
|
for (uint32_t slot = 0; slot < v8::Isolate::GetNumberOfDataSlots(); ++slot) {
|
||||||
|
void* data = reinterpret_cast<void*>(0xdecea5ed + slot);
|
||||||
|
CHECK_EQ(data, isolate->GetData(slot));
|
||||||
|
CHECK_EQ(data, i_isolate->GetData(slot));
|
||||||
|
}
|
||||||
isolate->Exit();
|
isolate->Exit();
|
||||||
isolate->Dispose();
|
isolate->Dispose();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user