mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
80 lines
2.4 KiB
C++
80 lines
2.4 KiB
C++
//===--- 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(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
|