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. 45
      src/CppParser/Parser.cpp
  2. 16
      src/CppParser/Parser.h
  3. 31
      src/Generator.Tests/AST/TestAST.cs
  4. 2
      tests/Native/AST.h

45
src/CppParser/Parser.cpp

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

16
src/CppParser/Parser.h

@ -21,6 +21,7 @@ @@ -21,6 +21,7 @@
#include "CppParser.h"
#include <string>
#include <unordered_set>
namespace clang {
namespace CodeGen {
@ -59,6 +60,8 @@ public: @@ -59,6 +60,8 @@ public:
ParserTargetInfo* GetTargetInfo();
private:
bool IsSupported(const clang::RecordDecl* RD);
bool IsSupported(const clang::CXXMethodDecl* MD);
// AST traversers
void WalkAST();
Declaration* WalkDeclaration(const clang::Decl* D);
@ -143,6 +146,12 @@ private: @@ -143,6 +146,12 @@ private:
void HandleComments(const clang::Decl* D, Declaration* Decl);
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;
CppSharp::CppParser::AST::ASTContext* lib;
CppParserOptions* opts;
@ -153,12 +162,7 @@ private: @@ -153,12 +162,7 @@ private:
std::unordered_map<const clang::TemplateTypeParmDecl*, TypeTemplateParameter*> walkedTypeTemplateParameters;
std::unordered_map<const clang::TemplateTemplateParmDecl*, TemplateTemplateParameter*> walkedTemplateTemplateParameters;
std::unordered_map<const clang::NonTypeTemplateParmDecl*, NonTypeTemplateParameter*> walkedNonTypeTemplateParameters;
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);
std::unordered_set<std::string> supportedStdTypes;
};
} }

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

@ -303,13 +303,13 @@ namespace CppSharp.Generator.Tests.AST @@ -303,13 +303,13 @@ namespace CppSharp.Generator.Tests.AST
[Test]
public void TestLineNumber()
{
Assert.AreEqual(72, AstContext.FindClass("HiddenInNamespace").First().LineNumberStart);
Assert.AreEqual(70, AstContext.FindClass("HiddenInNamespace").First().LineNumberStart);
}
[Test]
public void TestLineNumberOfFriend()
{
Assert.AreEqual(95, AstContext.FindFunction("operator+").First().LineNumberStart);
Assert.AreEqual(93, AstContext.FindFunction("operator+").First().LineNumberStart);
}
static string StripWindowsNewLines(string text)
@ -350,7 +350,7 @@ namespace CppSharp.Generator.Tests.AST @@ -350,7 +350,7 @@ namespace CppSharp.Generator.Tests.AST
[Test]
public void TestMacroLineNumber()
{
Assert.AreEqual(105, AstContext.FindClass("HasAmbiguousFunctions").First().Specifiers.Last().LineNumberStart);
Assert.AreEqual(103, AstContext.FindClass("HasAmbiguousFunctions").First().Specifiers.Last().LineNumberStart);
}
[Test]
@ -576,30 +576,5 @@ namespace CppSharp.Generator.Tests.AST @@ -576,30 +576,5 @@ namespace CppSharp.Generator.Tests.AST
var @classC = AstContext.FindClass("ClassC").First();
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 @@ @@ -1,5 +1,3 @@
#include <string>
#define Q_SIGNALS protected
// Tests assignment of AST.Parameter properties

Loading…
Cancel
Save