| Index: src/assert-scope.h
|
| diff --git a/src/assert-scope.h b/src/assert-scope.h
|
| index 269b280d027bd3ff42f3bfc84d255ae4653f3f0e..c87ab567aff237568bc537b98a05998587f26084 100644
|
| --- a/src/assert-scope.h
|
| +++ b/src/assert-scope.h
|
| @@ -30,6 +30,7 @@
|
|
|
| #include "allocation.h"
|
| #include "platform.h"
|
| +#include "utils.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -46,7 +47,12 @@ enum PerThreadAssertType {
|
| };
|
|
|
|
|
| -#ifdef DEBUG
|
| +enum PerIsolateAssertType {
|
| + JAVASCRIPT_EXECUTION_ASSERT,
|
| + ALLOCATION_FAILURE_ASSERT
|
| +};
|
| +
|
| +
|
| class PerThreadAssertData {
|
| public:
|
| PerThreadAssertData() : nesting_level_(0) {
|
| @@ -72,12 +78,9 @@ class PerThreadAssertData {
|
|
|
| DISALLOW_COPY_AND_ASSIGN(PerThreadAssertData);
|
| };
|
| -#endif // DEBUG
|
|
|
|
|
| class PerThreadAssertScopeBase {
|
| -#ifdef DEBUG
|
| -
|
| protected:
|
| PerThreadAssertScopeBase() {
|
| data_ = GetAssertData();
|
| @@ -110,18 +113,12 @@ class PerThreadAssertScopeBase {
|
| static void SetThreadLocalData(PerThreadAssertData* data) {
|
| Thread::SetThreadLocal(thread_local_key, data);
|
| }
|
| -#endif // DEBUG
|
| };
|
|
|
|
|
| -
|
| template <PerThreadAssertType type, bool allow>
|
| class PerThreadAssertScope : public PerThreadAssertScopeBase {
|
| public:
|
| -#ifndef DEBUG
|
| - PerThreadAssertScope() { }
|
| - static void SetIsAllowed(bool is_allowed) { }
|
| -#else
|
| PerThreadAssertScope() {
|
| old_state_ = data_->get(type);
|
| data_->set(type, allow);
|
| @@ -136,49 +133,131 @@ class PerThreadAssertScope : public PerThreadAssertScopeBase {
|
|
|
| private:
|
| bool old_state_;
|
| +};
|
| +
|
| +
|
| +class PerIsolateAssertBase {
|
| + protected:
|
| + static uint32_t GetData(Isolate* isolate);
|
| + static void SetData(Isolate* isolate, uint32_t data);
|
| +};
|
| +
|
| +
|
| +template <PerIsolateAssertType type, bool allow>
|
| +class PerIsolateAssertScope : public PerIsolateAssertBase {
|
| + public:
|
| + explicit PerIsolateAssertScope(Isolate* isolate) : isolate_(isolate) {
|
| + STATIC_ASSERT(type < 32);
|
| + old_data_ = GetData(isolate_);
|
| + SetData(isolate_, DataBit::update(old_data_, allow));
|
| + }
|
| +
|
| + ~PerIsolateAssertScope() {
|
| + SetData(isolate_, old_data_);
|
| + }
|
| +
|
| + static bool IsAllowed(Isolate* isolate) {
|
| + return DataBit::decode(GetData(isolate));
|
| + }
|
| +
|
| + private:
|
| + typedef BitField<bool, type, 1> DataBit;
|
| +
|
| + uint32_t old_data_;
|
| + Isolate* isolate_;
|
| +};
|
| +
|
| +
|
| +template <PerThreadAssertType type, bool allow>
|
| +#ifdef DEBUG
|
| +class PerThreadAssertScopeDebugOnly : public
|
| + PerThreadAssertScope<type, allow> {
|
| +};
|
| +#else
|
| +class PerThreadAssertScopeDebugOnly {
|
| + public:
|
| + PerThreadAssertScopeDebugOnly() { }
|
| +};
|
| #endif
|
| +
|
| +
|
| +template <PerIsolateAssertType type, bool allow>
|
| +#ifdef DEBUG
|
| +class PerIsolateAssertScopeDebugOnly : public
|
| + PerIsolateAssertScope<type, allow> {
|
| + public:
|
| + explicit PerIsolateAssertScopeDebugOnly(Isolate* isolate)
|
| + : PerIsolateAssertScope<type, allow>(isolate) { }
|
| };
|
| +#else
|
| +class PerIsolateAssertScopeDebugOnly {
|
| + public:
|
| + explicit PerIsolateAssertScopeDebugOnly(Isolate* isolate) { }
|
| +};
|
| +#endif
|
| +
|
| +
|
| +// Per-thread assert scopes.
|
|
|
| // Scope to document where we do not expect handles to be created.
|
| -typedef PerThreadAssertScope<HANDLE_ALLOCATION_ASSERT, false>
|
| +typedef PerThreadAssertScopeDebugOnly<HANDLE_ALLOCATION_ASSERT, false>
|
| DisallowHandleAllocation;
|
|
|
| // Scope to introduce an exception to DisallowHandleAllocation.
|
| -typedef PerThreadAssertScope<HANDLE_ALLOCATION_ASSERT, true>
|
| +typedef PerThreadAssertScopeDebugOnly<HANDLE_ALLOCATION_ASSERT, true>
|
| AllowHandleAllocation;
|
|
|
| // Scope to document where we do not expect any allocation and GC.
|
| -typedef PerThreadAssertScope<HEAP_ALLOCATION_ASSERT, false>
|
| +typedef PerThreadAssertScopeDebugOnly<HEAP_ALLOCATION_ASSERT, false>
|
| DisallowHeapAllocation;
|
|
|
| // Scope to introduce an exception to DisallowHeapAllocation.
|
| -typedef PerThreadAssertScope<HEAP_ALLOCATION_ASSERT, true>
|
| +typedef PerThreadAssertScopeDebugOnly<HEAP_ALLOCATION_ASSERT, true>
|
| AllowHeapAllocation;
|
|
|
| // Scope to document where we do not expect any handle dereferences.
|
| -typedef PerThreadAssertScope<HANDLE_DEREFERENCE_ASSERT, false>
|
| +typedef PerThreadAssertScopeDebugOnly<HANDLE_DEREFERENCE_ASSERT, false>
|
| DisallowHandleDereference;
|
|
|
| // Scope to introduce an exception to DisallowHandleDereference.
|
| -typedef PerThreadAssertScope<HANDLE_DEREFERENCE_ASSERT, true>
|
| +typedef PerThreadAssertScopeDebugOnly<HANDLE_DEREFERENCE_ASSERT, true>
|
| AllowHandleDereference;
|
|
|
| // Scope to document where we do not expect deferred handles to be dereferenced.
|
| -typedef PerThreadAssertScope<DEFERRED_HANDLE_DEREFERENCE_ASSERT, false>
|
| +typedef PerThreadAssertScopeDebugOnly<DEFERRED_HANDLE_DEREFERENCE_ASSERT, false>
|
| DisallowDeferredHandleDereference;
|
|
|
| // Scope to introduce an exception to DisallowDeferredHandleDereference.
|
| -typedef PerThreadAssertScope<DEFERRED_HANDLE_DEREFERENCE_ASSERT, true>
|
| +typedef PerThreadAssertScopeDebugOnly<DEFERRED_HANDLE_DEREFERENCE_ASSERT, true>
|
| AllowDeferredHandleDereference;
|
|
|
| // Scope to document where we do not expect deferred handles to be dereferenced.
|
| -typedef PerThreadAssertScope<CODE_DEPENDENCY_CHANGE_ASSERT, false>
|
| +typedef PerThreadAssertScopeDebugOnly<CODE_DEPENDENCY_CHANGE_ASSERT, false>
|
| DisallowCodeDependencyChange;
|
|
|
| // Scope to introduce an exception to DisallowDeferredHandleDereference.
|
| -typedef PerThreadAssertScope<CODE_DEPENDENCY_CHANGE_ASSERT, true>
|
| +typedef PerThreadAssertScopeDebugOnly<CODE_DEPENDENCY_CHANGE_ASSERT, true>
|
| AllowCodeDependencyChange;
|
|
|
| +
|
| +// Per-isolate assert scopes.
|
| +
|
| +// Scope to document where we do not expect javascript execution.
|
| +typedef PerIsolateAssertScope<JAVASCRIPT_EXECUTION_ASSERT, false>
|
| + DisallowJavascriptExecution;
|
| +
|
| +// Scope to introduce an exception to DisallowJavascriptExecution.
|
| +typedef PerIsolateAssertScope<JAVASCRIPT_EXECUTION_ASSERT, true>
|
| + AllowJavascriptExecution;
|
| +
|
| +// Scope to document where we do not expect an allocation failure.
|
| +typedef PerIsolateAssertScopeDebugOnly<ALLOCATION_FAILURE_ASSERT, false>
|
| + DisallowAllocationFailure;
|
| +
|
| +// Scope to introduce an exception to DisallowAllocationFailure.
|
| +typedef PerIsolateAssertScopeDebugOnly<ALLOCATION_FAILURE_ASSERT, true>
|
| + AllowAllocationFailure;
|
| +
|
| } } // namespace v8::internal
|
|
|
| #endif // V8_ASSERT_SCOPE_H_
|
|
|