Files
swift-mirror/lib/SILGen/ExitableFullExpr.h
Adrian Prantl 0c21c4da07 Expose ExitableFullExpr scopes to the debug info, so variables declared in
patterns show up in their own scopes, and the same variable name can be
reused in consecutive patterns.

<rdar://problem/15187441> Implement local variable debug scoping for variables declared in patterns

Swift SVN r23251
2014-11-11 23:27:43 +00:00

64 lines
1.8 KiB
C++

//===--- ExitableFullExpr.h - An exitable full-expression -------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://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(new (SGF.SGM.M)
SILDebugScope(loc, SGF.getFunction()));
}
~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