Browse Source

ed time and memory during generation by skipping methods of most STD classes.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/988/head
Dimitar Dobrev 8 years ago
parent
commit
291da4ece3
  1. 49
      src/CppParser/Parser.cpp
  2. 16
      src/CppParser/Parser.h
  3. 31
      src/Generator.Tests/AST/TestAST.cs
  4. 2
      tests/Native/AST.h

49
src/CppParser/Parser.cpp

@ -70,6 +70,8 @@ void* IgnorePtr = reinterpret_cast<void*>(0x1);
Parser::Parser(CppParserOptions* Opts) : lib(Opts->ASTContext), opts(Opts), index(0) Parser::Parser(CppParserOptions* Opts) : lib(Opts->ASTContext), opts(Opts), index(0)
{ {
supportedStdTypes.insert("allocator");
supportedStdTypes.insert("basic_string");
} }
LayoutField Parser::WalkVTablePointer(Class* Class, LayoutField Parser::WalkVTablePointer(Class* Class,
@ -821,14 +823,14 @@ Class* Parser::WalkRecordCXX(const clang::CXXRecordDecl* Record)
static int I = 0; static int I = 0;
static bool IsRecordValid(const clang::RecordDecl* RC, static bool IsRecordValid(const clang::RecordDecl* RC,
std::vector<const clang::RecordDecl*>& Visited) std::unordered_set<const clang::RecordDecl*>& Visited)
{ {
using namespace clang; using namespace clang;
if (std::find(Visited.begin(), Visited.end(), RC) != Visited.end()) if (Visited.find(RC) != Visited.end())
return true; return true;
Visited.push_back(RC); Visited.insert(RC);
if (RC->isInvalidDecl()) if (RC->isInvalidDecl())
return false; return false;
for (auto Field : RC->fields()) for (auto Field : RC->fields())
@ -845,7 +847,7 @@ static bool IsRecordValid(const clang::RecordDecl* RC,
static bool IsRecordValid(const clang::RecordDecl* RC) static bool IsRecordValid(const clang::RecordDecl* RC)
{ {
std::vector<const clang::RecordDecl*> Visited; std::unordered_set<const clang::RecordDecl*> Visited;
return IsRecordValid(RC, Visited); return IsRecordValid(RC, Visited);
} }
@ -881,6 +883,23 @@ static bool HasLayout(const clang::RecordDecl* Record)
return true; return true;
} }
bool Parser::IsSupported(const clang::RecordDecl* RD)
{
return !c->getSourceManager().isInSystemHeader(RD->getLocStart()) ||
supportedStdTypes.find(RD->getName()) != supportedStdTypes.end();
}
bool Parser::IsSupported(const clang::CXXMethodDecl* MD)
{
using namespace clang;
return !c->getSourceManager().isInSystemHeader(MD->getLocStart()) ||
isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD) ||
(MD->getName() == "c_str" &&
supportedStdTypes.find(MD->getParent()->getName()) !=
supportedStdTypes.end());
}
void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC) void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
{ {
using namespace clang; using namespace clang;
@ -920,11 +939,15 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
ReadClassLayout(RC, Record, CharUnits(), true); ReadClassLayout(RC, Record, CharUnits(), true);
} }
for(auto it = Record->decls_begin(); it != Record->decls_end(); ++it) for (auto FD : Record->fields())
{ WalkFieldCXX(FD, RC);
auto D = *it;
if (!IsSupported(Record))
return;
switch(D->getKind()) for (auto D : Record->decls())
{
switch (D->getKind())
{ {
case Decl::CXXConstructor: case Decl::CXXConstructor:
case Decl::CXXDestructor: case Decl::CXXDestructor:
@ -932,13 +955,8 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
case Decl::CXXMethod: case Decl::CXXMethod:
{ {
auto MD = cast<CXXMethodDecl>(D); auto MD = cast<CXXMethodDecl>(D);
WalkMethodCXX(MD); if (IsSupported(MD))
break; WalkMethodCXX(MD);
}
case Decl::Field:
{
auto FD = cast<FieldDecl>(D);
WalkFieldCXX(FD, RC);
break; break;
} }
case Decl::AccessSpec: case Decl::AccessSpec:
@ -954,6 +972,7 @@ void Parser::WalkRecord(const clang::RecordDecl* Record, Class* RC)
RC->Specifiers.push_back(AccessDecl); RC->Specifiers.push_back(AccessDecl);
break; break;
} }
case Decl::Field: // fields already handled
case Decl::IndirectField: // FIXME: Handle indirect fields case Decl::IndirectField: // FIXME: Handle indirect fields
break; break;
case Decl::CXXRecord: case Decl::CXXRecord:

16
src/CppParser/Parser.h

@ -21,6 +21,7 @@
#include "CppParser.h" #include "CppParser.h"
#include <string> #include <string>
#include <unordered_set>
namespace clang { namespace clang {
namespace CodeGen { namespace CodeGen {
@ -59,6 +60,8 @@ public:
ParserTargetInfo* GetTargetInfo(); ParserTargetInfo* GetTargetInfo();
private: private:
bool IsSupported(const clang::RecordDecl* RD);
bool IsSupported(const clang::CXXMethodDecl* MD);
// AST traversers // AST traversers
void WalkAST(); void WalkAST();
Declaration* WalkDeclaration(const clang::Decl* D); Declaration* WalkDeclaration(const clang::Decl* D);
@ -143,6 +146,12 @@ private:
void HandleComments(const clang::Decl* D, Declaration* Decl); void HandleComments(const clang::Decl* D, Declaration* Decl);
void HandleDiagnostics(ParserResult* res); void HandleDiagnostics(ParserResult* res);
ParserResultKind ReadSymbols(llvm::StringRef File,
llvm::object::basic_symbol_iterator Begin,
llvm::object::basic_symbol_iterator End,
CppSharp::CppParser::NativeLibrary*& NativeLib);
Declaration* GetDeclarationFromFriend(clang::NamedDecl* FriendDecl);
int index; int index;
CppSharp::CppParser::AST::ASTContext* lib; CppSharp::CppParser::AST::ASTContext* lib;
CppParserOptions* opts; CppParserOptions* opts;
@ -153,12 +162,7 @@ private:
std::unordered_map<const clang::TemplateTypeParmDecl*, TypeTemplateParameter*> walkedTypeTemplateParameters; std::unordered_map<const clang::TemplateTypeParmDecl*, TypeTemplateParameter*> walkedTypeTemplateParameters;
std::unordered_map<const clang::TemplateTemplateParmDecl*, TemplateTemplateParameter*> walkedTemplateTemplateParameters; std::unordered_map<const clang::TemplateTemplateParmDecl*, TemplateTemplateParameter*> walkedTemplateTemplateParameters;
std::unordered_map<const clang::NonTypeTemplateParmDecl*, NonTypeTemplateParameter*> walkedNonTypeTemplateParameters; std::unordered_map<const clang::NonTypeTemplateParmDecl*, NonTypeTemplateParameter*> walkedNonTypeTemplateParameters;
std::unordered_set<std::string> supportedStdTypes;
ParserResultKind ReadSymbols(llvm::StringRef File,
llvm::object::basic_symbol_iterator Begin,
llvm::object::basic_symbol_iterator End,
CppSharp::CppParser::NativeLibrary*& NativeLib);
Declaration* GetDeclarationFromFriend(clang::NamedDecl* FriendDecl);
}; };
} } } }

31
src/Generator.Tests/AST/TestAST.cs

@ -303,13 +303,13 @@ namespace CppSharp.Generator.Tests.AST
[Test] [Test]
public void TestLineNumber() public void TestLineNumber()
{ {
Assert.AreEqual(72, AstContext.FindClass("HiddenInNamespace").First().LineNumberStart); Assert.AreEqual(70, AstContext.FindClass("HiddenInNamespace").First().LineNumberStart);
} }
[Test] [Test]
public void TestLineNumberOfFriend() public void TestLineNumberOfFriend()
{ {
Assert.AreEqual(95, AstContext.FindFunction("operator+").First().LineNumberStart); Assert.AreEqual(93, AstContext.FindFunction("operator+").First().LineNumberStart);
} }
static string StripWindowsNewLines(string text) static string StripWindowsNewLines(string text)
@ -350,7 +350,7 @@ namespace CppSharp.Generator.Tests.AST
[Test] [Test]
public void TestMacroLineNumber() public void TestMacroLineNumber()
{ {
Assert.AreEqual(105, AstContext.FindClass("HasAmbiguousFunctions").First().Specifiers.Last().LineNumberStart); Assert.AreEqual(103, AstContext.FindClass("HasAmbiguousFunctions").First().Specifiers.Last().LineNumberStart);
} }
[Test] [Test]
@ -576,30 +576,5 @@ namespace CppSharp.Generator.Tests.AST
var @classC = AstContext.FindClass("ClassC").First(); var @classC = AstContext.FindClass("ClassC").First();
Assert.That(@classC.Redeclarations.Count, Is.EqualTo(2)); Assert.That(@classC.Redeclarations.Count, Is.EqualTo(2));
} }
[Test]
public void TestRemovalOfUnusedStdTypes()
{
new IgnoreSystemDeclarationsPass { Context = Driver.Context }.VisitASTContext(AstContext);
if (Platform.IsWindows)
{
Assert.That(AstContext.GetEnumWithMatchingItem("_ALLOC_MASK").Ignore, Is.True);
Assert.That(AstContext.FindClass("_Ctypevec").First().Ignore, Is.True);
return;
}
if (Platform.IsLinux)
{
Assert.That(AstContext.GetEnumWithMatchingItem("PTHREAD_RWLOCK_PREFER_READER_NP").Ignore, Is.True);
Assert.That(AstContext.FindClass("pthread_mutex_t").First().Ignore, Is.True);
return;
}
if (Platform.IsMacOS)
{
Assert.That(AstContext.GetEnumWithMatchingItem("__n_words").Ignore, Is.True);
Assert.That(AstContext.FindClass("__darwin_fp_control").First().Ignore, Is.True);
return;
}
}
} }
} }

2
tests/Native/AST.h

@ -1,5 +1,3 @@
#include <string>
#define Q_SIGNALS protected #define Q_SIGNALS protected
// Tests assignment of AST.Parameter properties // Tests assignment of AST.Parameter properties

Loading…
Cancel
Save