зеркало из https://github.com/microsoft/clang.git
Create a function, eliminating some redundancy between SynthesizeBlockInitExpr() and SynthesizeBlockLiterals().
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57083 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
acba0f2d0b
Коммит
d3f779019c
|
@ -110,6 +110,7 @@ public:
|
||||||
void SynthesizeBlockLiterals(SourceLocation FunLocStart,
|
void SynthesizeBlockLiterals(SourceLocation FunLocStart,
|
||||||
const char *FunName);
|
const char *FunName);
|
||||||
|
|
||||||
|
void CollectBlockDeclRefInfo(BlockExpr *Exp);
|
||||||
void GetBlockCallExprs(Stmt *S);
|
void GetBlockCallExprs(Stmt *S);
|
||||||
void GetBlockDeclRefExprs(Stmt *S);
|
void GetBlockDeclRefExprs(Stmt *S);
|
||||||
|
|
||||||
|
@ -392,14 +393,10 @@ std::string RewriteBlocks::SynthesizeBlockFunc(BlockExpr *CE, int i,
|
||||||
}
|
}
|
||||||
S += " {\n";
|
S += " {\n";
|
||||||
|
|
||||||
bool haveByRefDecls = false;
|
|
||||||
|
|
||||||
// Create local declarations to avoid rewriting all closure decl ref exprs.
|
// Create local declarations to avoid rewriting all closure decl ref exprs.
|
||||||
// First, emit a declaration for all "by ref" decls.
|
// First, emit a declaration for all "by ref" decls.
|
||||||
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||||
E = BlockByRefDecls.end(); I != E; ++I) {
|
E = BlockByRefDecls.end(); I != E; ++I) {
|
||||||
// Note: It is not possible to have "by ref" closure pointer decls.
|
|
||||||
haveByRefDecls = true;
|
|
||||||
S += " ";
|
S += " ";
|
||||||
std::string Name = (*I)->getName();
|
std::string Name = (*I)->getName();
|
||||||
Context->getPointerType((*I)->getType()).getAsStringInternal(Name);
|
Context->getPointerType((*I)->getType()).getAsStringInternal(Name);
|
||||||
|
@ -588,24 +585,8 @@ void RewriteBlocks::SynthesizeBlockLiterals(SourceLocation FunLocStart,
|
||||||
// Insert closures that were part of the function.
|
// Insert closures that were part of the function.
|
||||||
for (unsigned i = 0; i < Blocks.size(); i++) {
|
for (unsigned i = 0; i < Blocks.size(); i++) {
|
||||||
|
|
||||||
GetBlockDeclRefExprs(Blocks[i]);
|
CollectBlockDeclRefInfo(Blocks[i]);
|
||||||
if (BlockDeclRefs.size()) {
|
|
||||||
// Unique all "by copy" declarations.
|
|
||||||
for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
|
|
||||||
if (!BlockDeclRefs[i]->isByRef())
|
|
||||||
BlockByCopyDecls.insert(BlockDeclRefs[i]->getDecl());
|
|
||||||
// Unique all "by ref" declarations.
|
|
||||||
for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
|
|
||||||
if (BlockDeclRefs[i]->isByRef())
|
|
||||||
BlockByRefDecls.insert(BlockDeclRefs[i]->getDecl());
|
|
||||||
|
|
||||||
// Find any imported blocks...they will need special attention.
|
|
||||||
for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
|
|
||||||
if (isBlockPointerType(BlockDeclRefs[i]->getType())) {
|
|
||||||
GetBlockCallExprs(Blocks[i]);
|
|
||||||
ImportedBlockDecls.insert(BlockDeclRefs[i]->getDecl());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::string Tag = "__" + std::string(FunName) + "_block_impl_" + utostr(i);
|
std::string Tag = "__" + std::string(FunName) + "_block_impl_" + utostr(i);
|
||||||
|
|
||||||
std::string CI = SynthesizeBlockImpl(Blocks[i], Tag,
|
std::string CI = SynthesizeBlockImpl(Blocks[i], Tag,
|
||||||
|
@ -906,10 +887,7 @@ void RewriteBlocks::RewriteBlockPointerDecl(NamedDecl *ND) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string RewriteBlocks::SynthesizeBlockInitExpr(BlockExpr *Exp, VarDecl *VD) {
|
void RewriteBlocks::CollectBlockDeclRefInfo(BlockExpr *Exp) {
|
||||||
Blocks.push_back(Exp);
|
|
||||||
bool haveByRefDecls = false;
|
|
||||||
|
|
||||||
// Add initializers for any closure decl refs.
|
// Add initializers for any closure decl refs.
|
||||||
GetBlockDeclRefExprs(Exp);
|
GetBlockDeclRefExprs(Exp);
|
||||||
if (BlockDeclRefs.size()) {
|
if (BlockDeclRefs.size()) {
|
||||||
|
@ -920,7 +898,6 @@ std::string RewriteBlocks::SynthesizeBlockInitExpr(BlockExpr *Exp, VarDecl *VD)
|
||||||
// Unique all "by ref" declarations.
|
// Unique all "by ref" declarations.
|
||||||
for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
|
for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
|
||||||
if (BlockDeclRefs[i]->isByRef()) {
|
if (BlockDeclRefs[i]->isByRef()) {
|
||||||
haveByRefDecls = true;
|
|
||||||
BlockByRefDecls.insert(BlockDeclRefs[i]->getDecl());
|
BlockByRefDecls.insert(BlockDeclRefs[i]->getDecl());
|
||||||
}
|
}
|
||||||
// Find any imported blocks...they will need special attention.
|
// Find any imported blocks...they will need special attention.
|
||||||
|
@ -930,6 +907,12 @@ std::string RewriteBlocks::SynthesizeBlockInitExpr(BlockExpr *Exp, VarDecl *VD)
|
||||||
ImportedBlockDecls.insert(BlockDeclRefs[i]->getDecl());
|
ImportedBlockDecls.insert(BlockDeclRefs[i]->getDecl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string RewriteBlocks::SynthesizeBlockInitExpr(BlockExpr *Exp, VarDecl *VD) {
|
||||||
|
Blocks.push_back(Exp);
|
||||||
|
|
||||||
|
CollectBlockDeclRefInfo(Exp);
|
||||||
std::string FuncName;
|
std::string FuncName;
|
||||||
|
|
||||||
if (CurFunctionDef)
|
if (CurFunctionDef)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче