mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
* spelling: accessor Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: accommodates Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: argument Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: associated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: availability Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: available Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: belongs Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: bookkeeping Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: building Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: clazz Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: clonable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: closure Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: concatenated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: conformance Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: context Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: conversion Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: correspondence Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: declarations Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: declared Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: defining Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: delayed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: dependency Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: deployed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: descendants Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: diagnose Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: diagnostic Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: equitable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: evaluation Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: exclusivity Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: existence Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: existential Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: explicit Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: expressed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: for Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: foreign Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: function Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: identifier Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: implicit Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: indices Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: information Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: instance Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: interchangeable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: interface Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: introduced Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: invalid Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: kind-in Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: least Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: library Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: location Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: namespace Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: necessary Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: nonexistent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: not Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: number Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: obtains Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: occurs Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: opaque Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: overridden Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: parameter Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: precede Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: preceding Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: property Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: protocol Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: qualified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: recognized Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: recursively Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: references Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: relaxing Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: represented Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: request Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: requirement Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: requirements Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: retrieve Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: returned Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: satisfied Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: satisfy Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: scanner Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: siblings Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: simplified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: something Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: source Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: specializations Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: specially Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: statement Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: stripped Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: structure Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: substitution Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: the Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transform Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transformed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transitively Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transparent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: typecheck Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unknown Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unlabeled Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unqualified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: whether Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: with Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: scanner Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> Co-authored-by: Josh Soref <jsoref@users.noreply.github.com>
140 lines
4.6 KiB
C++
140 lines
4.6 KiB
C++
//===--- Ownership.h - Swift ASTs for Ownership ---------------*- 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 common structures for working with the different kinds of
|
|
// reference ownership supported by Swift, such as 'weak' and 'unowned', as well
|
|
// as the different kinds of value ownership, such as 'inout' and '__shared'.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_OWNERSHIP_H
|
|
#define SWIFT_OWNERSHIP_H
|
|
|
|
#include "swift/Basic/InlineBitfield.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include <assert.h>
|
|
#include <limits.h>
|
|
#include <stdint.h>
|
|
|
|
namespace swift {
|
|
|
|
/// Different kinds of reference ownership supported by Swift.
|
|
// This enum is used in diagnostics. If you add a case here, the diagnostics
|
|
// must be updated as well.
|
|
enum class ReferenceOwnership : uint8_t {
|
|
/// a strong reference (the default semantics)
|
|
Strong,
|
|
|
|
#define REF_STORAGE(Name, ...) Name,
|
|
#define REF_STORAGE_RANGE(First, Last) Last_Kind = Last
|
|
#include "swift/AST/ReferenceStorage.def"
|
|
};
|
|
|
|
enum : unsigned { NumReferenceOwnershipBits =
|
|
countBitsUsed(static_cast<unsigned>(ReferenceOwnership::Last_Kind)) };
|
|
|
|
static inline llvm::StringRef keywordOf(ReferenceOwnership ownership) {
|
|
switch (ownership) {
|
|
case ReferenceOwnership::Strong:
|
|
break;
|
|
case ReferenceOwnership::Weak: return "weak";
|
|
case ReferenceOwnership::Unowned: return "unowned";
|
|
case ReferenceOwnership::Unmanaged: return "unowned(unsafe)";
|
|
}
|
|
// We cannot use llvm_unreachable() because this is used by the stdlib.
|
|
assert(false && "impossible");
|
|
LLVM_BUILTIN_UNREACHABLE;
|
|
}
|
|
|
|
static inline llvm::StringRef manglingOf(ReferenceOwnership ownership) {
|
|
switch (ownership) {
|
|
case ReferenceOwnership::Strong:
|
|
break;
|
|
case ReferenceOwnership::Weak: return "Xw";
|
|
case ReferenceOwnership::Unowned: return "Xo";
|
|
case ReferenceOwnership::Unmanaged: return "Xu";
|
|
}
|
|
// We cannot use llvm_unreachable() because this is used by the stdlib.
|
|
assert(false && "impossible");
|
|
LLVM_BUILTIN_UNREACHABLE;
|
|
}
|
|
|
|
static inline bool isLessStrongThan(ReferenceOwnership left,
|
|
ReferenceOwnership right) {
|
|
auto strengthOf = [] (ReferenceOwnership ownership) -> int {
|
|
// A reference can be optimized away if outlived by a stronger reference.
|
|
// NOTES:
|
|
// 1) Different reference kinds of the same strength are NOT interchangeable.
|
|
// 2) Stronger than "strong" might include locking, for example.
|
|
// 3) Unchecked references must be last to preserve identity comparisons
|
|
// until the last checked reference is dead.
|
|
// 4) Please keep the switch statement ordered to ease code review.
|
|
switch (ownership) {
|
|
case ReferenceOwnership::Strong: return 0;
|
|
case ReferenceOwnership::Unowned: return -1;
|
|
case ReferenceOwnership::Weak: return -1;
|
|
#define UNCHECKED_REF_STORAGE(Name, ...) \
|
|
case ReferenceOwnership::Name: return INT_MIN;
|
|
#include "swift/AST/ReferenceStorage.def"
|
|
}
|
|
llvm_unreachable("impossible");
|
|
};
|
|
|
|
return strengthOf(left) < strengthOf(right);
|
|
}
|
|
|
|
enum class ReferenceOwnershipOptionality : uint8_t {
|
|
Disallowed,
|
|
Allowed,
|
|
Required,
|
|
|
|
Last_Kind = Required
|
|
};
|
|
enum : unsigned { NumOptionalityBits = countBitsUsed(static_cast<unsigned>(
|
|
ReferenceOwnershipOptionality::Last_Kind)) };
|
|
|
|
static inline ReferenceOwnershipOptionality
|
|
optionalityOf(ReferenceOwnership ownership) {
|
|
switch (ownership) {
|
|
case ReferenceOwnership::Strong:
|
|
case ReferenceOwnership::Unowned:
|
|
case ReferenceOwnership::Unmanaged:
|
|
return ReferenceOwnershipOptionality::Allowed;
|
|
case ReferenceOwnership::Weak:
|
|
return ReferenceOwnershipOptionality::Required;
|
|
}
|
|
llvm_unreachable("impossible");
|
|
}
|
|
|
|
/// Different kinds of value ownership supported by Swift.
|
|
enum class ValueOwnership : uint8_t {
|
|
/// the context-dependent default ownership (sometimes shared,
|
|
/// sometimes owned)
|
|
Default,
|
|
/// an 'inout' mutating pointer-like value
|
|
InOut,
|
|
/// a '__shared' non-mutating pointer-like value
|
|
Shared,
|
|
/// an '__owned' value
|
|
Owned,
|
|
|
|
Last_Kind = Owned
|
|
};
|
|
enum : unsigned { NumValueOwnershipBits =
|
|
countBitsUsed(static_cast<unsigned>(ValueOwnership::Last_Kind)) };
|
|
|
|
} // end namespace swift
|
|
|
|
#endif
|