r279351 - [NFC] Add a class ObjCProtocolQualifiers to wrap APIs for ObjC protocol list.

Vitaly Buka via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 19 17:34:58 PDT 2016


Windows build is broken
http://lab.llvm.org:8011/builders/sanitizer-windows/builds/27686/steps/run%20tests/logs/stdio

On Fri, Aug 19, 2016 at 5:12 PM Manman Ren via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: mren
> Date: Fri Aug 19 19:04:21 2016
> New Revision: 279351
>
> URL: http://llvm.org/viewvc/llvm-project?rev=279351&view=rev
> Log:
> [NFC] Add a class ObjCProtocolQualifiers to wrap APIs for ObjC protocol
> list.
>
> This is in preparation of adding a new type class ObjCTypeParamType that
> can take protocol qualifiers. ObjCProtocolQualifiers will be shared between
> ObjCObjectType and ObjCTypeParamType.
>
> rdar://24619481
> rdar://25060179
>
> Differential Revision: http://reviews.llvm.org/D23078
>
> Modified:
>     cfe/trunk/include/clang/AST/Type.h
>     cfe/trunk/lib/AST/Type.cpp
>
> Modified: cfe/trunk/include/clang/AST/Type.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=279351&r1=279350&r2=279351&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Type.h (original)
> +++ cfe/trunk/include/clang/AST/Type.h Fri Aug 19 19:04:21 2016
> @@ -4699,6 +4699,59 @@ public:
>    }
>  };
>
> +/// This class wraps the list of protocol qualifiers. For types that can
> +/// take ObjC protocol qualifers, they can subclass this class.
> +template <class T>
> +class ObjCProtocolQualifiers {
> +protected:
> +  ObjCProtocolQualifiers() {}
> +  ObjCProtocolDecl * const *getProtocolStorage() const {
> +    return
> const_cast<ObjCProtocolQualifiers*>(this)->getProtocolStorage();
> +  }
> +
> +  ObjCProtocolDecl **getProtocolStorage() {
> +    return static_cast<T*>(this)->getProtocolStorageImpl();
> +  }
> +  void setNumProtocols(unsigned N) {
> +    static_cast<T*>(this)->setNumProtocolsImpl(N);
> +  }
> +  void initialize(ArrayRef<ObjCProtocolDecl *> protocols) {
> +    setNumProtocols(protocols.size());
> +    assert(getNumProtocols() == protocols.size() &&
> +           "bitfield overflow in protocol count");
> +    if (!protocols.empty())
> +      memcpy(getProtocolStorage(), protocols.data(),
> +             protocols.size() * sizeof(ObjCProtocolDecl*));
> +  }
> +
> +public:
> +  typedef ObjCProtocolDecl * const *qual_iterator;
> +  typedef llvm::iterator_range<qual_iterator> qual_range;
> +
> +  qual_range quals() const { return qual_range(qual_begin(), qual_end());
> }
> +  qual_iterator qual_begin() const { return getProtocolStorage(); }
> +  qual_iterator qual_end() const { return qual_begin() +
> getNumProtocols(); }
> +
> +  bool qual_empty() const { return getNumProtocols() == 0; }
> +
> +  /// Return the number of qualifying protocols in this type, or 0 if
> +  /// there are none.
> +  unsigned getNumProtocols() const {
> +    return static_cast<const T*>(this)->getNumProtocolsImpl();
> +  }
> +
> +  /// Fetch a protocol by index.
> +  ObjCProtocolDecl *getProtocol(unsigned I) const {
> +    assert(I < getNumProtocols() && "Out-of-range protocol access");
> +    return qual_begin()[I];
> +  }
> +
> +  /// Retrieve all of the protocol qualifiers.
> +  ArrayRef<ObjCProtocolDecl *> getProtocols() const {
> +    return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols());
> +  }
> +};
> +
>  /// Represents a class type in Objective C.
>  ///
>  /// Every Objective C type is a combination of a base type, a set of
> @@ -4727,7 +4780,9 @@ public:
>  /// 'id<P>' is an ObjCObjectPointerType whose pointee is an ObjCObjectType
>  /// with base BuiltinType::ObjCIdType and protocol list [P].  Eventually
>  /// this should get its own sugar class to better represent the source.
> -class ObjCObjectType : public Type {
> +class ObjCObjectType : public Type,
> +                       public ObjCProtocolQualifiers<ObjCObjectType> {
> +  friend class ObjCProtocolQualifiers;
>    // ObjCObjectType.NumTypeArgs - the number of type arguments stored
>    // after the ObjCObjectPointerType node.
>    // ObjCObjectType.NumProtocols - the number of protocols stored
> @@ -4747,16 +4802,20 @@ class ObjCObjectType : public Type {
>    mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool>
>      CachedSuperClassType;
>
> -  ObjCProtocolDecl * const *getProtocolStorage() const {
> -    return const_cast<ObjCObjectType*>(this)->getProtocolStorage();
> -  }
> -
>    QualType *getTypeArgStorage();
>    const QualType *getTypeArgStorage() const {
>      return const_cast<ObjCObjectType *>(this)->getTypeArgStorage();
>    }
>
> -  ObjCProtocolDecl **getProtocolStorage();
> +  ObjCProtocolDecl **getProtocolStorageImpl();
> +  /// Return the number of qualifying protocols in this interface type,
> +  /// or 0 if there are none.
> +  unsigned getNumProtocolsImpl() const {
> +    return ObjCObjectTypeBits.NumProtocols;
> +  }
> +  void setNumProtocolsImpl(unsigned N) {
> +    ObjCObjectTypeBits.NumProtocols = N;
> +  }
>
>  protected:
>    ObjCObjectType(QualType Canonical, QualType Base,
> @@ -4833,30 +4892,6 @@ public:
>                                ObjCObjectTypeBits.NumTypeArgs);
>    }
>
> -  typedef ObjCProtocolDecl * const *qual_iterator;
> -  typedef llvm::iterator_range<qual_iterator> qual_range;
> -
> -  qual_range quals() const { return qual_range(qual_begin(), qual_end());
> }
> -  qual_iterator qual_begin() const { return getProtocolStorage(); }
> -  qual_iterator qual_end() const { return qual_begin() +
> getNumProtocols(); }
> -
> -  bool qual_empty() const { return getNumProtocols() == 0; }
> -
> -  /// Return the number of qualifying protocols in this interface type,
> -  /// or 0 if there are none.
> -  unsigned getNumProtocols() const { return
> ObjCObjectTypeBits.NumProtocols; }
> -
> -  /// Fetch a protocol by index.
> -  ObjCProtocolDecl *getProtocol(unsigned I) const {
> -    assert(I < getNumProtocols() && "Out-of-range protocol access");
> -    return qual_begin()[I];
> -  }
> -
> -  /// Retrieve all of the protocol qualifiers.
> -  ArrayRef<ObjCProtocolDecl *> getProtocols() const {
> -    return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols());
> -  }
> -
>    /// Whether this is a "__kindof" type as written.
>    bool isKindOfTypeAsWritten() const { return
> ObjCObjectTypeBits.IsKindOf; }
>
> @@ -4919,7 +4954,7 @@ inline QualType *ObjCObjectType::getType
>    return reinterpret_cast<QualType
> *>(static_cast<ObjCObjectTypeImpl*>(this)+1);
>  }
>
> -inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorage() {
> +inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() {
>      return reinterpret_cast<ObjCProtocolDecl**>(
>               getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs);
>  }
>
> Modified: cfe/trunk/lib/AST/Type.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=279351&r1=279350&r2=279351&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/Type.cpp (original)
> +++ cfe/trunk/lib/AST/Type.cpp Fri Aug 19 19:04:21 2016
> @@ -546,15 +546,9 @@ ObjCObjectType::ObjCObjectType(QualType
>    ObjCObjectTypeBits.NumTypeArgs = typeArgs.size();
>    assert(getTypeArgsAsWritten().size() == typeArgs.size() &&
>           "bitfield overflow in type argument count");
> -  ObjCObjectTypeBits.NumProtocols = protocols.size();
> -  assert(getNumProtocols() == protocols.size() &&
> -         "bitfield overflow in protocol count");
>    if (!typeArgs.empty())
>      memcpy(getTypeArgStorage(), typeArgs.data(),
>             typeArgs.size() * sizeof(QualType));
> -  if (!protocols.empty())
> -    memcpy(getProtocolStorage(), protocols.data(),
> -           protocols.size() * sizeof(ObjCProtocolDecl*));
>
>    for (auto typeArg : typeArgs) {
>      if (typeArg->isDependentType())
> @@ -565,6 +559,9 @@ ObjCObjectType::ObjCObjectType(QualType
>      if (typeArg->containsUnexpandedParameterPack())
>        setContainsUnexpandedParameterPack();
>    }
> +  // Initialize the protocol qualifiers. The protocol storage is known
> +  // after we set number of type arguments.
> +  initialize(protocols);
>  }
>
>  bool ObjCObjectType::isSpecialized() const {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160820/3d0feb64/attachment-0001.html>


More information about the cfe-commits mailing list