//===--- Temporary.h - A temporary allocation -------------------*- 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 the Temporary and TemporarySet classes. // //===----------------------------------------------------------------------===// #ifndef SWIFT_IRGEN_TEMPORARY_H #define SWIFT_IRGEN_TEMPORARY_H #include "Address.h" #include "swift/SIL/SILType.h" #include namespace swift { namespace irgen { class IRGenFunction; /// A temporary allocation. class Temporary { public: StackAddress Addr; SILType Type; void destroy(IRGenFunction &IGF) const; }; class TemporarySet { std::vector Stack; bool HasBeenCleared = false; public: TemporarySet() = default; TemporarySet(TemporarySet &&) = default; TemporarySet &operator=(TemporarySet &&) = default; // Make this move-only to reduce chances of double-destroys. We can't // get too strict with this, though, because we may need to destroy // the same set of temporaries along multiple control-flow paths. TemporarySet(const TemporarySet &) = delete; TemporarySet &operator=(const TemporarySet &) = delete; void add(Temporary temp) { Stack.push_back(temp); } /// Destroy all the temporaries. void destroyAll(IRGenFunction &IGF) const; /// Remove all the temporaries from this set. This does not destroy /// the temporaries. void clear() { assert(!HasBeenCleared && "already cleared"); HasBeenCleared = true; Stack.clear(); } /// Has clear() been called on this set? bool hasBeenCleared() const { return HasBeenCleared; } }; } // end namespace irgen } // end namespace swift #endif