Index: src/api.h |
diff --git a/src/api.h b/src/api.h |
index 556765264ae4b1ba6989aba0ef7f3d3aeb4d42f6..d2981c34b3232ee35dc06ac16f281a794d406f1e 100644 |
--- a/src/api.h |
+++ b/src/api.h |
@@ -452,6 +452,12 @@ class HandleScopeImplementer { |
saved_contexts_(0), |
spare_(NULL), |
call_depth_(0), |
+ microtasks_depth_(0), |
+ microtasks_suppressions_(0), |
+#ifdef V8_ENABLE_CHECKS |
+ debug_microtasks_depth_(0), |
+#endif |
+ microtasks_policy_(v8::MicrotasksPolicy::kAuto), |
last_handle_before_deferred_block_(NULL) { } |
~HandleScopeImplementer() { |
@@ -472,10 +478,36 @@ class HandleScopeImplementer { |
inline internal::Object** GetSpareOrNewBlock(); |
inline void DeleteExtensions(internal::Object** prev_limit); |
+ // Call depth represents nested v8 api calls. |
inline void IncrementCallDepth() {call_depth_++;} |
inline void DecrementCallDepth() {call_depth_--;} |
inline bool CallDepthIsZero() { return call_depth_ == 0; } |
+ // Microtasks scope depth represents nested scopes controlling microtasks |
+ // invocation, which happens when depth reaches zero. |
+ inline void IncrementMicrotasksScopeDepth() {microtasks_depth_++;} |
+ inline void DecrementMicrotasksScopeDepth() {microtasks_depth_--;} |
+ inline int GetMicrotasksScopeDepth() { return microtasks_depth_; } |
+ |
+ // Possibly nested microtasks suppression scopes prevent microtasks |
+ // from running. |
+ inline void IncrementMicrotasksSuppressions() {microtasks_suppressions_++;} |
+ inline void DecrementMicrotasksSuppressions() {microtasks_suppressions_--;} |
+ inline bool HasMicrotasksSuppressions() { return !!microtasks_suppressions_; } |
+ |
+#ifdef V8_ENABLE_CHECKS |
+ // In debug we check that calls not intended to invoke microtasks are |
+ // still correctly wrapped with microtask scopes. |
+ inline void IncrementDebugMicrotasksScopeDepth() {debug_microtasks_depth_++;} |
+ inline void DecrementDebugMicrotasksScopeDepth() {debug_microtasks_depth_--;} |
+ inline bool DebugMicrotasksScopeDepthIsZero() { |
+ return debug_microtasks_depth_ == 0; |
+ } |
+#endif |
+ |
+ inline void set_microtasks_policy(v8::MicrotasksPolicy policy); |
+ inline v8::MicrotasksPolicy microtasks_policy() const; |
+ |
inline void EnterContext(Handle<Context> context); |
inline void LeaveContext(); |
inline bool LastEnteredContextWas(Handle<Context> context); |
@@ -532,6 +564,12 @@ class HandleScopeImplementer { |
List<Context*> saved_contexts_; |
Object** spare_; |
int call_depth_; |
+ int microtasks_depth_; |
+ int microtasks_suppressions_; |
+#ifdef V8_ENABLE_CHECKS |
+ int debug_microtasks_depth_; |
+#endif |
+ v8::MicrotasksPolicy microtasks_policy_; |
Object** last_handle_before_deferred_block_; |
// This is only used for threading support. |
HandleScopeData handle_scope_data_; |
@@ -550,6 +588,17 @@ class HandleScopeImplementer { |
const int kHandleBlockSize = v8::internal::KB - 2; // fit in one page |
+void HandleScopeImplementer::set_microtasks_policy( |
+ v8::MicrotasksPolicy policy) { |
+ microtasks_policy_ = policy; |
+} |
+ |
+ |
+v8::MicrotasksPolicy HandleScopeImplementer::microtasks_policy() const { |
+ return microtasks_policy_; |
+} |
+ |
+ |
void HandleScopeImplementer::SaveContext(Context* context) { |
saved_contexts_.Add(context); |
} |