| //===--- ArgumentScope.h ----------------------------------------*- 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SWIFT_SILGEN_ARGUMENTSCOPE_H |
| #define SWIFT_SILGEN_ARGUMENTSCOPE_H |
| |
| #include "FormalEvaluation.h" |
| #include "SILGenFunction.h" |
| #include "Scope.h" |
| |
| namespace swift { |
| namespace Lowering { |
| |
| /// A scope that is created before arguments are emitted for an apply and is |
| /// popped manually immediately after the raw apply is emitted and before the |
| /// raw results are marshalled into managed resources. |
| /// |
| /// Internally this creates a Scope and a FormalEvaluationScope. It ensures that |
| /// they are destroyed/initialized in the appropriate order. |
| class ArgumentScope { |
| Scope normalScope; |
| FormalEvaluationScope formalEvalScope; |
| SILLocation loc; |
| |
| public: |
| ArgumentScope(SILGenFunction &SGF, SILLocation loc) |
| : normalScope(SGF.Cleanups, CleanupLocation::get(loc)), |
| formalEvalScope(SGF), loc(loc) {} |
| |
| ~ArgumentScope() { |
| if (normalScope.isValid() || !formalEvalScope.isPopped()) { |
| llvm_unreachable("ArgumentScope that wasn't popped?!"); |
| } |
| } |
| |
| ArgumentScope() = delete; |
| ArgumentScope(const ArgumentScope &) = delete; |
| ArgumentScope &operator=(const ArgumentScope &) = delete; |
| |
| ArgumentScope(ArgumentScope &&other) = delete; |
| ArgumentScope &operator=(ArgumentScope &&other) = delete; |
| |
| void pop() { popImpl(); } |
| |
| /// Pop the formal evaluation and argument scopes preserving the value mv. |
| ManagedValue popPreservingValue(ManagedValue mv); |
| |
| // Pop the formal evaluation and argument scopes, preserving rv. |
| RValue popPreservingValue(RValue &&rv); |
| |
| void verify() { |
| formalEvalScope.verify(); |
| } |
| |
| bool isValid() const { return normalScope.isValid(); } |
| |
| private: |
| void popImpl() { |
| // We must always pop the formal eval scope before the normal scope since |
| // the formal eval scope may have pointers into the normal scope. |
| normalScope.verify(); |
| formalEvalScope.pop(); |
| normalScope.pop(); |
| } |
| }; |
| |
| } // end namespace Lowering |
| } // end namespace swift |
| |
| #endif |