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