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_ |