Browse Source

BindingGenerator: cache derived classes (#3106)

1vanK 3 years ago
parent
commit
16bcae821e

+ 29 - 22
Source/Tools/BindingGenerator/ASClassBinder.cpp

@@ -411,12 +411,18 @@ struct ClassMemberSignatures
     unordered_map<string, vector<string>> existsInBaseClassesMethods_; // method signature -> base class names
 };
 
-static unordered_map<string, shared_ptr<ClassMemberSignatures>> _cachedMemberSignatures; // className -> signatures
+static unordered_map<string, ClassMemberSignatures> _cachedMemberSignatures; // className -> signatures
+static unordered_map<string, vector<ClassAnalyzer>> _cachedAllDerivedClasses; // class compounddef ID -> classes
 
 static bool ContainsSameSignature(const string& className, const string& methodSignature)
 {
-    shared_ptr<ClassMemberSignatures> classData = _cachedMemberSignatures[className];
-    return classData->methods_.find(methodSignature) != classData->methods_.end();
+    const ClassMemberSignatures& classData = _cachedMemberSignatures[className];
+    return classData.methods_.find(methodSignature) != classData.methods_.end();
+}
+
+static const vector<ClassAnalyzer>& GetAllDerivedClassesCached(const string& compounddefID)
+{
+    return _cachedAllDerivedClasses[compounddefID];
 }
 
 static void InitCachedMemberSignatures()
@@ -426,10 +432,10 @@ static void InitCachedMemberSignatures()
     {
         xml_node compounddef = element.second;
         ClassAnalyzer classAnalyzer(compounddef);
-        shared_ptr<ClassMemberSignatures> classData = make_shared<ClassMemberSignatures>();
+        ClassMemberSignatures classData;
         vector<MethodAnalyzer> methods = classAnalyzer.GetAllPublicMethods();
         for (const MethodAnalyzer& method : methods)
-            classData->methods_.insert(GetSignature(method));
+            classData.methods_.insert(GetSignature(method));
         _cachedMemberSignatures[classAnalyzer.GetClassName()] = classData;
     }
 
@@ -439,9 +445,10 @@ static void InitCachedMemberSignatures()
         xml_node compounddef = element.second;
         ClassAnalyzer classAnalyzer(compounddef);
         string className = classAnalyzer.GetClassName();
-        shared_ptr<ClassMemberSignatures> classData = _cachedMemberSignatures[classAnalyzer.GetClassName()];
+        ClassMemberSignatures& classData = _cachedMemberSignatures[classAnalyzer.GetClassName()];
         vector<MethodAnalyzer> methods = classAnalyzer.GetAllPublicMethods();
         vector<ClassAnalyzer> allDerivedClasses = classAnalyzer.GetAllDerivedClasses();
+        _cachedAllDerivedClasses[element.first] = allDerivedClasses;
         vector<ClassAnalyzer> baseClasses = classAnalyzer.GetBaseClasses();
         for (const MethodAnalyzer& method : methods)
         {
@@ -457,7 +464,7 @@ static void InitCachedMemberSignatures()
             }
 
             if (hiddenInderivedClasses.size())
-                classData->hiddenInAnyDerivedClassesMethods_[methodSignature] = hiddenInderivedClasses;
+                classData.hiddenInAnyDerivedClassesMethods_[methodSignature] = hiddenInderivedClasses;
 
             vector<string> existInBaseClasses;
 
@@ -469,7 +476,7 @@ static void InitCachedMemberSignatures()
             }
 
             if (existInBaseClasses.size())
-                classData->existsInBaseClassesMethods_[methodSignature] = existInBaseClasses;
+                classData.existsInBaseClassesMethods_[methodSignature] = existInBaseClasses;
         }
     }
 
@@ -508,10 +515,10 @@ static vector<string> HiddenInAnyDerivedClasses(const MethodAnalyzer& method)
     return result;*/
     string classname = method.GetClassName();
     string methodSignature = GetSignature(method);
-    shared_ptr<ClassMemberSignatures> classData = _cachedMemberSignatures[classname];
+    ClassMemberSignatures& classData = _cachedMemberSignatures[classname];
 
-    auto it = classData->hiddenInAnyDerivedClassesMethods_.find(methodSignature);
-    if (it == classData->hiddenInAnyDerivedClassesMethods_.end())
+    auto it = classData.hiddenInAnyDerivedClassesMethods_.find(methodSignature);
+    if (it == classData.hiddenInAnyDerivedClassesMethods_.end())
         return vector<string>();
     else
         return it->second;
@@ -534,10 +541,10 @@ static vector<string> HiddenInAnyDerivedClasses(const MethodAnalyzer& method, co
 
     string classname = classAnalyzer.GetClassName();
     string methodSignature = GetSignature(method);
-    shared_ptr<ClassMemberSignatures> classData = _cachedMemberSignatures[classname];
+    ClassMemberSignatures& classData = _cachedMemberSignatures[classname];
 
-    auto it = classData->hiddenInAnyDerivedClassesMethods_.find(methodSignature);
-    if (it == classData->hiddenInAnyDerivedClassesMethods_.end())
+    auto it = classData.hiddenInAnyDerivedClassesMethods_.find(methodSignature);
+    if (it == classData.hiddenInAnyDerivedClassesMethods_.end())
         return vector<string>();
     else
         return it->second;
@@ -561,10 +568,10 @@ static vector<string> ExistsInBaseClasses(const MethodAnalyzer& method)
 
     string classname = method.GetClassName();
     string methodSignature = GetSignature(method);
-    shared_ptr<ClassMemberSignatures> classData = _cachedMemberSignatures[classname];
+    ClassMemberSignatures& classData = _cachedMemberSignatures[classname];
     
-    auto it = classData->existsInBaseClassesMethods_.find(methodSignature);
-    if (it == classData->existsInBaseClassesMethods_.end())
+    auto it = classData.existsInBaseClassesMethods_.find(methodSignature);
+    if (it == classData.existsInBaseClassesMethods_.end())
         return vector<string>();
     else
         return it->second;
@@ -588,10 +595,10 @@ static vector<string> ExistsInBaseClasses(const MethodAnalyzer& method, const Cl
 
     string className = classAnalyzer.GetClassName();
     string methodSignature = GetSignature(method);
-    shared_ptr<ClassMemberSignatures> classData = _cachedMemberSignatures[className];
+    ClassMemberSignatures& classData = _cachedMemberSignatures[className];
 
-    auto it = classData->existsInBaseClassesMethods_.find(methodSignature);
-    if (it == classData->existsInBaseClassesMethods_.end())
+    auto it = classData.existsInBaseClassesMethods_.find(methodSignature);
+    if (it == classData.existsInBaseClassesMethods_.end())
         return vector<string>();
     else
         return it->second;
@@ -601,7 +608,7 @@ static vector<string> ExistsInBaseClasses(const MethodAnalyzer& method, const Cl
 // (multiple inheriance methods with same signature - we can not register this in template because this cause multiple registration same signature)
 static string FindConflicts(const MethodAnalyzer& method)
 {
-    vector<ClassAnalyzer> derivedClasses = method.GetClass().GetAllDerivedClasses();
+    vector<ClassAnalyzer> derivedClasses = GetAllDerivedClassesCached(ExtractID(method.GetClass().GetCompounddef()));
     for (const ClassAnalyzer& derivedClass : derivedClasses)
     {
         vector<string> existsInBaseClasses = ExistsInBaseClasses(method, derivedClass);
@@ -615,7 +622,7 @@ static string FindConflicts(const MethodAnalyzer& method)
 
 static string FindConflicts(const MethodAnalyzer& method, const ClassAnalyzer& classAnalyzer)
 {
-    vector<ClassAnalyzer> derivedClasses = classAnalyzer.GetAllDerivedClasses();
+    vector<ClassAnalyzer> derivedClasses = GetAllDerivedClassesCached(ExtractID(classAnalyzer.GetCompounddef()));
     for (const ClassAnalyzer& derivedClass : derivedClasses)
     {
         vector<string> existsInBaseClasses = ExistsInBaseClasses(method, derivedClass);

+ 2 - 2
Source/Tools/BindingGenerator/Main.cpp

@@ -63,8 +63,8 @@ namespace CSBindingGenerator
 int main(int argc, char* argv[])
 {
 #ifdef DEVELOP
-    string inputDir = R"(G:/MyGames/Urho3DFork/Build/Source/Tools/BindingGenerator/generated/xml)";
-    _sourceDir = R"(G:/MyGames/Urho3DFork/Urho3D)";
+    string inputDir = R"(G:/MyGames/urho3d_fork/build_vs/Source/Tools/BindingGenerator/generated/xml)";
+    _sourceDir = R"(G:/MyGames/urho3d_fork/repo)";
 #else
     if (argc != 3)
         return -1;