[presubmit] Enable readability/namespace linter checking.
[platform/upstream/v8.git] / src / assert-scope.h
1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef V8_ASSERT_SCOPE_H_
6 #define V8_ASSERT_SCOPE_H_
7
8 #include <stdint.h>
9 #include "src/base/macros.h"
10
11 namespace v8 {
12 namespace internal {
13
14 // Forward declarations.
15 class Isolate;
16 class PerThreadAssertData;
17
18
19 enum PerThreadAssertType {
20   HEAP_ALLOCATION_ASSERT,
21   HANDLE_ALLOCATION_ASSERT,
22   HANDLE_DEREFERENCE_ASSERT,
23   DEFERRED_HANDLE_DEREFERENCE_ASSERT,
24   CODE_DEPENDENCY_CHANGE_ASSERT,
25   LAST_PER_THREAD_ASSERT_TYPE
26 };
27
28
29 enum PerIsolateAssertType {
30   JAVASCRIPT_EXECUTION_ASSERT,
31   JAVASCRIPT_EXECUTION_THROWS,
32   DEOPTIMIZATION_ASSERT,
33   COMPILATION_ASSERT
34 };
35
36
37 template <PerThreadAssertType kType, bool kAllow>
38 class PerThreadAssertScope {
39  public:
40   PerThreadAssertScope();
41   ~PerThreadAssertScope();
42
43   static bool IsAllowed();
44
45  private:
46   PerThreadAssertData* data_;
47   bool old_state_;
48
49   DISALLOW_COPY_AND_ASSIGN(PerThreadAssertScope);
50 };
51
52
53 template <PerIsolateAssertType type, bool allow>
54 class PerIsolateAssertScope {
55  public:
56   explicit PerIsolateAssertScope(Isolate* isolate);
57   ~PerIsolateAssertScope();
58
59   static bool IsAllowed(Isolate* isolate);
60
61  private:
62   class DataBit;
63
64   Isolate* isolate_;
65   uint32_t old_data_;
66
67   DISALLOW_COPY_AND_ASSIGN(PerIsolateAssertScope);
68 };
69
70
71 template <PerThreadAssertType type, bool allow>
72 #ifdef DEBUG
73 class PerThreadAssertScopeDebugOnly : public
74     PerThreadAssertScope<type, allow> {
75 #else
76 class PerThreadAssertScopeDebugOnly {
77  public:
78   PerThreadAssertScopeDebugOnly() { }
79 #endif
80 };
81
82
83 template <PerIsolateAssertType type, bool allow>
84 #ifdef DEBUG
85 class PerIsolateAssertScopeDebugOnly : public
86     PerIsolateAssertScope<type, allow> {
87  public:
88   explicit PerIsolateAssertScopeDebugOnly(Isolate* isolate)
89       : PerIsolateAssertScope<type, allow>(isolate) { }
90 #else
91 class PerIsolateAssertScopeDebugOnly {
92  public:
93   explicit PerIsolateAssertScopeDebugOnly(Isolate* isolate) { }
94 #endif
95 };
96
97 // Per-thread assert scopes.
98
99 // Scope to document where we do not expect handles to be created.
100 typedef PerThreadAssertScopeDebugOnly<HANDLE_ALLOCATION_ASSERT, false>
101     DisallowHandleAllocation;
102
103 // Scope to introduce an exception to DisallowHandleAllocation.
104 typedef PerThreadAssertScopeDebugOnly<HANDLE_ALLOCATION_ASSERT, true>
105     AllowHandleAllocation;
106
107 // Scope to document where we do not expect any allocation and GC.
108 typedef PerThreadAssertScopeDebugOnly<HEAP_ALLOCATION_ASSERT, false>
109     DisallowHeapAllocation;
110
111 // Scope to introduce an exception to DisallowHeapAllocation.
112 typedef PerThreadAssertScopeDebugOnly<HEAP_ALLOCATION_ASSERT, true>
113     AllowHeapAllocation;
114
115 // Scope to document where we do not expect any handle dereferences.
116 typedef PerThreadAssertScopeDebugOnly<HANDLE_DEREFERENCE_ASSERT, false>
117     DisallowHandleDereference;
118
119 // Scope to introduce an exception to DisallowHandleDereference.
120 typedef PerThreadAssertScopeDebugOnly<HANDLE_DEREFERENCE_ASSERT, true>
121     AllowHandleDereference;
122
123 // Scope to document where we do not expect deferred handles to be dereferenced.
124 typedef PerThreadAssertScopeDebugOnly<DEFERRED_HANDLE_DEREFERENCE_ASSERT, false>
125     DisallowDeferredHandleDereference;
126
127 // Scope to introduce an exception to DisallowDeferredHandleDereference.
128 typedef PerThreadAssertScopeDebugOnly<DEFERRED_HANDLE_DEREFERENCE_ASSERT, true>
129     AllowDeferredHandleDereference;
130
131 // Scope to document where we do not expect deferred handles to be dereferenced.
132 typedef PerThreadAssertScopeDebugOnly<CODE_DEPENDENCY_CHANGE_ASSERT, false>
133     DisallowCodeDependencyChange;
134
135 // Scope to introduce an exception to DisallowDeferredHandleDereference.
136 typedef PerThreadAssertScopeDebugOnly<CODE_DEPENDENCY_CHANGE_ASSERT, true>
137     AllowCodeDependencyChange;
138
139
140 // Per-isolate assert scopes.
141
142 // Scope to document where we do not expect javascript execution.
143 typedef PerIsolateAssertScope<JAVASCRIPT_EXECUTION_ASSERT, false>
144     DisallowJavascriptExecution;
145
146 // Scope to introduce an exception to DisallowJavascriptExecution.
147 typedef PerIsolateAssertScope<JAVASCRIPT_EXECUTION_ASSERT, true>
148     AllowJavascriptExecution;
149
150 // Scope in which javascript execution leads to exception being thrown.
151 typedef PerIsolateAssertScope<JAVASCRIPT_EXECUTION_THROWS, false>
152     ThrowOnJavascriptExecution;
153
154 // Scope to introduce an exception to ThrowOnJavascriptExecution.
155 typedef PerIsolateAssertScope<JAVASCRIPT_EXECUTION_THROWS, true>
156     NoThrowOnJavascriptExecution;
157
158 // Scope to document where we do not expect deoptimization.
159 typedef PerIsolateAssertScopeDebugOnly<DEOPTIMIZATION_ASSERT, false>
160     DisallowDeoptimization;
161
162 // Scope to introduce an exception to DisallowDeoptimization.
163 typedef PerIsolateAssertScopeDebugOnly<DEOPTIMIZATION_ASSERT, true>
164     AllowDeoptimization;
165
166 // Scope to document where we do not expect deoptimization.
167 typedef PerIsolateAssertScopeDebugOnly<COMPILATION_ASSERT, false>
168     DisallowCompilation;
169
170 // Scope to introduce an exception to DisallowDeoptimization.
171 typedef PerIsolateAssertScopeDebugOnly<COMPILATION_ASSERT, true>
172     AllowCompilation;
173 }  // namespace internal
174 }  // namespace v8
175
176 #endif  // V8_ASSERT_SCOPE_H_