diff options
Diffstat (limited to 'deps/v8/src/execution/interrupts-scope.cc')
-rw-r--r-- | deps/v8/src/execution/interrupts-scope.cc | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/deps/v8/src/execution/interrupts-scope.cc b/deps/v8/src/execution/interrupts-scope.cc new file mode 100644 index 0000000000..cf8611f8d6 --- /dev/null +++ b/deps/v8/src/execution/interrupts-scope.cc @@ -0,0 +1,42 @@ +// Copyright 2019 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/execution/interrupts-scope.h" + +#include "src/execution/isolate.h" + +namespace v8 { +namespace internal { + +InterruptsScope::InterruptsScope(Isolate* isolate, int intercept_mask, + Mode mode) + : stack_guard_(isolate->stack_guard()), + intercept_mask_(intercept_mask), + intercepted_flags_(0), + mode_(mode) { + if (mode_ != kNoop) stack_guard_->PushInterruptsScope(this); +} + +bool InterruptsScope::Intercept(StackGuard::InterruptFlag flag) { + InterruptsScope* last_postpone_scope = nullptr; + for (InterruptsScope* current = this; current; current = current->prev_) { + // We only consider scopes related to passed flag. + if (!(current->intercept_mask_ & flag)) continue; + if (current->mode_ == kRunInterrupts) { + // If innermost scope is kRunInterrupts scope, prevent interrupt from + // being intercepted. + break; + } else { + DCHECK_EQ(current->mode_, kPostponeInterrupts); + last_postpone_scope = current; + } + } + // If there is no postpone scope for passed flag then we should not intercept. + if (!last_postpone_scope) return false; + last_postpone_scope->intercepted_flags_ |= flag; + return true; +} + +} // namespace internal +} // namespace v8 |