| Index: src/api.cc
|
| ===================================================================
|
| --- src/api.cc (revision 1129)
|
| +++ src/api.cc (working copy)
|
| @@ -36,6 +36,7 @@
|
| #include "platform.h"
|
| #include "serialize.h"
|
| #include "snapshot.h"
|
| +#include "v8threads.h"
|
|
|
|
|
| namespace i = v8::internal;
|
| @@ -73,6 +74,15 @@
|
| } while (false)
|
|
|
|
|
| +#define API_ENTRY_CHECK(msg) \
|
| + do { \
|
| + if (v8::Locker::IsActive()) { \
|
| + ApiCheck(i::ThreadManager::IsLockedByCurrentThread(), \
|
| + msg, \
|
| + "Entering the V8 API without proper locking in place"); \
|
| + } \
|
| + } while (false)
|
| +
|
| // --- D a t a t h a t i s s p e c i f i c t o a t h r e a d ---
|
|
|
|
|
| @@ -190,6 +200,19 @@
|
| }
|
|
|
|
|
| +ImplementationUtilities::HandleScopeData*
|
| + ImplementationUtilities::CurrentHandleScope() {
|
| + return &i::HandleScope::current_;
|
| +}
|
| +
|
| +
|
| +#ifdef DEBUG
|
| +void ImplementationUtilities::ZapHandleRange(void** begin, void** end) {
|
| + i::HandleScope::ZapRange(begin, end);
|
| +}
|
| +#endif
|
| +
|
| +
|
| v8::Handle<v8::Primitive> ImplementationUtilities::Undefined() {
|
| if (IsDeadCheck("v8::Undefined()")) return v8::Handle<v8::Primitive>();
|
| EnsureInitialized("v8::Undefined()");
|
| @@ -359,55 +382,26 @@
|
| // --- H a n d l e s ---
|
|
|
|
|
| -HandleScope::Data HandleScope::current_ = { -1, NULL, NULL };
|
| +HandleScope::HandleScope() : is_closed_(false) {
|
| + API_ENTRY_CHECK("HandleScope::HandleScope");
|
| + i::HandleScope::Enter(&previous_);
|
| +}
|
|
|
|
|
| -int HandleScope::NumberOfHandles() {
|
| - int n = thread_local.Blocks()->length();
|
| - if (n == 0) return 0;
|
| - return ((n - 1) * i::kHandleBlockSize) +
|
| - (current_.next - thread_local.Blocks()->last());
|
| +HandleScope::~HandleScope() {
|
| + if (!is_closed_) {
|
| + i::HandleScope::Leave(&previous_);
|
| + }
|
| }
|
|
|
|
|
| -void** v8::HandleScope::CreateHandle(void* value) {
|
| - void** result = current_.next;
|
| - if (result == current_.limit) {
|
| - // Make sure there's at least one scope on the stack and that the
|
| - // top of the scope stack isn't a barrier.
|
| - if (!ApiCheck(current_.extensions >= 0,
|
| - "v8::HandleScope::CreateHandle()",
|
| - "Cannot create a handle without a HandleScope")) {
|
| - return NULL;
|
| - }
|
| - // If there's more room in the last block, we use that. This is used
|
| - // for fast creation of scopes after scope barriers.
|
| - if (!thread_local.Blocks()->is_empty()) {
|
| - void** limit = &thread_local.Blocks()->last()[i::kHandleBlockSize];
|
| - if (current_.limit != limit) {
|
| - current_.limit = limit;
|
| - }
|
| - }
|
| +int HandleScope::NumberOfHandles() {
|
| + return i::HandleScope::NumberOfHandles();
|
| +}
|
|
|
| - // If we still haven't found a slot for the handle, we extend the
|
| - // current handle scope by allocating a new handle block.
|
| - if (result == current_.limit) {
|
| - // If there's a spare block, use it for growing the current scope.
|
| - result = thread_local.GetSpareOrNewBlock();
|
| - // Add the extension to the global list of blocks, but count the
|
| - // extension as part of the current scope.
|
| - thread_local.Blocks()->Add(result);
|
| - current_.extensions++;
|
| - current_.limit = &result[i::kHandleBlockSize];
|
| - }
|
| - }
|
|
|
| - // Update the current next field, set the value in the created
|
| - // handle, and return the result.
|
| - ASSERT(result < current_.limit);
|
| - current_.next = result + 1;
|
| - *result = value;
|
| - return result;
|
| +void** v8::HandleScope::CreateHandle(void* value) {
|
| + return i::HandleScope::CreateHandle(value);
|
| }
|
|
|
|
|
| @@ -436,20 +430,6 @@
|
| }
|
|
|
|
|
| -void v8::HandleScope::DeleteExtensions() {
|
| - ASSERT(current_.extensions != 0);
|
| - thread_local.DeleteExtensions(current_.extensions);
|
| -}
|
| -
|
| -
|
| -void HandleScope::ZapRange(void** start, void** end) {
|
| - if (start == NULL) return;
|
| - for (void** p = start; p < end; p++) {
|
| - *p = reinterpret_cast<void*>(v8::internal::kHandleZapValue);
|
| - }
|
| -}
|
| -
|
| -
|
| void** v8::HandleScope::RawClose(void** value) {
|
| if (!ApiCheck(!is_closed_,
|
| "v8::HandleScope::Close()",
|
| @@ -461,7 +441,7 @@
|
| // Read the result before popping the handle block.
|
| i::Object* result = reinterpret_cast<i::Object*>(*value);
|
| is_closed_ = true;
|
| - RestorePreviousState();
|
| + i::HandleScope::Leave(&previous_);
|
|
|
| // Allocate a new handle on the previous handle block.
|
| i::Handle<i::Object> handle(result);
|
| @@ -2951,8 +2931,8 @@
|
|
|
|
|
| char* HandleScopeImplementer::ArchiveThreadHelper(char* storage) {
|
| - ImplementationUtilities::HandleScopeData* current =
|
| - ImplementationUtilities::CurrentHandleScope();
|
| + v8::ImplementationUtilities::HandleScopeData* current =
|
| + v8::ImplementationUtilities::CurrentHandleScope();
|
| handle_scope_data_ = *current;
|
| memcpy(storage, this, sizeof(*this));
|
|
|
| @@ -2975,7 +2955,7 @@
|
|
|
| char* HandleScopeImplementer::RestoreThreadHelper(char* storage) {
|
| memcpy(this, storage, sizeof(*this));
|
| - *ImplementationUtilities::CurrentHandleScope() = handle_scope_data_;
|
| + *v8::ImplementationUtilities::CurrentHandleScope() = handle_scope_data_;
|
| return storage + ArchiveSpacePerThread();
|
| }
|
|
|
| @@ -2983,7 +2963,7 @@
|
| void HandleScopeImplementer::Iterate(
|
| ObjectVisitor* v,
|
| List<void**>* blocks,
|
| - ImplementationUtilities::HandleScopeData* handle_data) {
|
| + v8::ImplementationUtilities::HandleScopeData* handle_data) {
|
| // Iterate over all handles in the blocks except for the last.
|
| for (int i = blocks->length() - 2; i >= 0; --i) {
|
| Object** block =
|
| @@ -3000,8 +2980,8 @@
|
|
|
|
|
| void HandleScopeImplementer::Iterate(ObjectVisitor* v) {
|
| - ImplementationUtilities::HandleScopeData* current =
|
| - ImplementationUtilities::CurrentHandleScope();
|
| + v8::ImplementationUtilities::HandleScopeData* current =
|
| + v8::ImplementationUtilities::CurrentHandleScope();
|
| Iterate(v, thread_local.Blocks(), current);
|
| }
|
|
|
| @@ -3010,7 +2990,7 @@
|
| HandleScopeImplementer* thread_local =
|
| reinterpret_cast<HandleScopeImplementer*>(storage);
|
| List<void**>* blocks_of_archived_thread = thread_local->Blocks();
|
| - ImplementationUtilities::HandleScopeData* handle_data_of_archived_thread =
|
| + v8::ImplementationUtilities::HandleScopeData* handle_data_of_archived_thread =
|
| &thread_local->handle_scope_data_;
|
| Iterate(v, blocks_of_archived_thread, handle_data_of_archived_thread);
|
|
|
|
|