//===--- ExitableFullExpr.h - An exitable full-expression -------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This file defines ExitableFullExpr, a cleanup scope RAII object
// that conveniently creates a continuation block.
//
//===----------------------------------------------------------------------===//

#ifndef EXITABLE_FULL_EXPR_H
#define EXITABLE_FULL_EXPR_H

#include "JumpDest.h"
#include "Scope.h"

namespace swift {
namespace Lowering {

/// A cleanup scope RAII object, like FullExpr, that comes with a
/// JumpDest for a continuation block.
///
/// You *must* call exit() at some point.
///
/// This scope is also exposed to the debug info.
class LLVM_LIBRARY_VISIBILITY ExitableFullExpr {
  SILGenFunction &SGF;
  FullExpr Scope;
  JumpDest ExitDest;
public:
  explicit ExitableFullExpr(SILGenFunction &SGF, CleanupLocation loc)
    : SGF(SGF), Scope(SGF.Cleanups, loc),
      ExitDest(SGF.B.splitBlockForFallthrough(),
               SGF.Cleanups.getCleanupsDepth(), loc) {
    SGF.enterDebugScope(loc);
  }
  ~ExitableFullExpr() {
    SGF.leaveDebugScope();
  }


  JumpDest getExitDest() const { return ExitDest; }

  SILBasicBlock *exit() {
    assert(!SGF.B.hasValidInsertionPoint());
    Scope.pop();
    SGF.B.setInsertionPoint(ExitDest.getBlock());
    return ExitDest.getBlock();
  }
};

} // end namespace Lowering
} // end namespace swift

#endif
