From ced80a848de94ef44b6e7b4ce6f182249b3141a8 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Thu, 30 Oct 2008 12:09:33 +0000 Subject: [PATCH] Add a couple fixes for rewriting ivars/methods that use/contain blocks. Now this: @interface Test { void (^ivar)(void); } - (void)name; @end @implementation Test - (void)name { ivar = ^{ printf("hello\n"); }; // ((struct Test_IMPL *)self)->ivar = (void (*)(void))&__name_block_impl_0((void *)__name_block_func_0); ivar(); // ((void (*)(struct __block_impl *))((struct __block_impl *)((struct Test_IMPL *)self)->ivar)->FuncPtr)((struct __block_impl *)((struct Test_IMPL *)self)->ivar); } git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58428 91177308-0d34-0410-b5e6-96231b3b80d8 --- Driver/RewriteObjC.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Driver/RewriteObjC.cpp b/Driver/RewriteObjC.cpp index 5a44354c8a..b5efd4fac0 100644 --- a/Driver/RewriteObjC.cpp +++ b/Driver/RewriteObjC.cpp @@ -711,6 +711,7 @@ void RewriteObjC::RewriteForwardProtocolDecl(ObjCForwardProtocolDecl *PDecl) { void RewriteObjC::RewriteObjCMethodDecl(ObjCMethodDecl *OMD, std::string &ResultStr) { + //fprintf(stderr,"In RewriteObjCMethodDecl\n"); const FunctionType *FPRetType = 0; ResultStr += "\nstatic "; if (OMD->getResultType()->isObjCQualifiedIdType()) @@ -2439,6 +2440,9 @@ void RewriteObjC::SynthesizeObjCInternalStruct(ObjCInterfaceDecl *CDecl, cursor++; atLoc = LocStart.getFileLocWithOffset(cursor-startBuf); InsertText(atLoc, " */", 3); + } else if (*cursor == '^') { // rewrite block specifier. + SourceLocation caretLoc = LocStart.getFileLocWithOffset(cursor-startBuf); + ReplaceText(caretLoc, 1, "*", 1); } cursor++; } @@ -3267,7 +3271,7 @@ std::string RewriteObjC::SynthesizeBlockHelperFuncs(BlockExpr *CE, int i, std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag, bool hasCopyDisposeHelpers) { - std::string S = "struct " + Tag; + std::string S = "\nstruct " + Tag; std::string Constructor = " " + Tag; S += " {\n struct __block_impl impl;\n"; @@ -3421,7 +3425,10 @@ void RewriteObjC::InsertBlockLiteralsWithinFunction(FunctionDecl *FD) { } void RewriteObjC::InsertBlockLiteralsWithinMethod(ObjCMethodDecl *MD) { - SourceLocation FunLocStart = MD->getLocStart(); + //fprintf(stderr,"In InsertBlockLiteralsWitinMethod\n"); + //SourceLocation FunLocStart = MD->getLocStart(); + // FIXME: This hack works around a bug in Rewrite.InsertText(). + SourceLocation FunLocStart = MD->getLocStart().getFileLocWithOffset(-1); std::string FuncName = std::string(MD->getSelector().getName()); // Convert colons to underscores. std::string::size_type loc = 0;