diff options
author | John McCall <rjmccall@apple.com> | 2011-07-12 16:41:08 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2011-07-12 16:41:08 +0000 |
commit | 9928c4805aa8d5fabd488d0d0c5aeb64fd50f0e3 (patch) | |
tree | b3860a47a6a5f606e5057653deddc0dd84d70635 /lib/CodeGen/CGExpr.cpp | |
parent | f1588660c109610e6a79c786b83b7c9bbd6ed31e (diff) |
Switch field destruction over to use the new destroyer-based API
and kill a lot of redundant code.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@134988 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index dd238c1715..90bdd5caf6 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -283,19 +283,24 @@ EmitExprForReferenceBinding(CodeGenFunction &CGF, const Expr *E, case Qualifiers::OCL_Autoreleasing: break; - case Qualifiers::OCL_Strong: - CGF.PushARCReleaseCleanup(CGF.getARCCleanupKind(), - ObjCARCReferenceLifetimeType, - ReferenceTemporary, - /*Precise lifetime=*/false, - /*For full expression=*/true); + case Qualifiers::OCL_Strong: { + assert(!ObjCARCReferenceLifetimeType->isArrayType()); + CleanupKind cleanupKind = CGF.getARCCleanupKind(); + CGF.pushDestroy(cleanupKind, + ReferenceTemporary, + ObjCARCReferenceLifetimeType, + CodeGenFunction::destroyARCStrongImprecise, + cleanupKind & EHCleanup); break; + } case Qualifiers::OCL_Weak: - CGF.PushARCWeakReleaseCleanup(NormalAndEHCleanup, - ObjCARCReferenceLifetimeType, - ReferenceTemporary, - /*For full expression=*/true); + assert(!ObjCARCReferenceLifetimeType->isArrayType()); + CGF.pushDestroy(NormalAndEHCleanup, + ReferenceTemporary, + ObjCARCReferenceLifetimeType, + CodeGenFunction::destroyARCWeak, + /*useEHCleanupForArray*/ true); break; } @@ -467,18 +472,21 @@ CodeGenFunction::EmitReferenceBindingToExpr(const Expr *E, // Nothing to do. break; - case Qualifiers::OCL_Strong: - PushARCReleaseCleanup(getARCCleanupKind(), ObjCARCReferenceLifetimeType, - ReferenceTemporary, - VD && VD->hasAttr<ObjCPreciseLifetimeAttr>()); + case Qualifiers::OCL_Strong: { + bool precise = VD && VD->hasAttr<ObjCPreciseLifetimeAttr>(); + CleanupKind cleanupKind = getARCCleanupKind(); + pushDestroy(cleanupKind, ReferenceTemporary, + ObjCARCReferenceLifetimeType, + precise ? destroyARCStrongPrecise : destroyARCStrongImprecise, + cleanupKind & EHCleanup); break; + } case Qualifiers::OCL_Weak: // __weak objects always get EH cleanups; otherwise, exceptions // could cause really nasty crashes instead of mere leaks. - PushARCWeakReleaseCleanup(NormalAndEHCleanup, - ObjCARCReferenceLifetimeType, - ReferenceTemporary); + pushDestroy(NormalAndEHCleanup, ReferenceTemporary, + ObjCARCReferenceLifetimeType, destroyARCWeak, true); break; } } |