Browse Source

ScriptFile method search cache.
Documentation update.

Lasse Öörni 15 years ago
parent
commit
6d015d064a
3 changed files with 18 additions and 6 deletions
  1. 1 1
      Engine/Script/ScriptEventListener.cpp
  2. 14 4
      Engine/Script/ScriptFile.cpp
  3. 3 1
      Engine/Script/ScriptFile.h

+ 1 - 1
Engine/Script/ScriptEventListener.cpp

@@ -39,4 +39,4 @@ void ScriptEventListener::removeAllEventHandlers()
     for (std::map<StringHash, asIScriptFunction*>::iterator i = mEventHandlers.begin(); i != mEventHandlers.end(); ++i)
         unsubscribeFromEvent(i->first);
     mEventHandlers.clear();
-}
+}

+ 14 - 4
Engine/Script/ScriptFile.cpp

@@ -72,15 +72,16 @@ void ScriptFile::load(Deserializer& source, ResourceCache* cache)
     for (std::vector<ScriptInstance*>::iterator i = instances.begin(); i != instances.end(); ++i)
         (*i)->releaseObject();
     
-    // Discard the previous module if there was one, and clear search caches
+    // Clear search caches
     mCompiled = false;
     mAllIncludeFiles.clear();
     mCheckedClasses.clear();
     mFunctions.clear();
+    mMethods.clear();
     setMemoryUse(0);
     removeAllEventHandlers();
     
-    // Create the module
+    // Create the module. Discard previous module if there was one
     asIScriptEngine* engine = mScriptEngine->getAngelScriptEngine();
     mScriptModule = engine->GetModule(getName().c_str(), asGM_ALWAYS_CREATE);
     if (!mScriptModule)
@@ -285,7 +286,7 @@ asIScriptFunction* ScriptFile::getFunction(const std::string& declaration)
     return function;
 }
 
-asIScriptFunction* ScriptFile::getMethod(asIScriptObject* object, const std::string& declaration) const
+asIScriptFunction* ScriptFile::getMethod(asIScriptObject* object, const std::string& declaration)
 {
     if ((!mCompiled) || (!object))
         return 0;
@@ -293,9 +294,18 @@ asIScriptFunction* ScriptFile::getMethod(asIScriptObject* object, const std::str
     asIObjectType* type = object->GetObjectType();
     if (!type)
         return 0;
+    std::map<asIObjectType*, std::map<std::string, asIScriptFunction*> >::const_iterator i = mMethods.find(type);
+    if (i != mMethods.end())
+    {
+        std::map<std::string, asIScriptFunction*>::const_iterator j = i->second.find(declaration);
+        if (j != i->second.end())
+            return j->second;
+    }
     
     int id = type->GetMethodIdByDecl(declaration.c_str());
-    return mScriptModule->GetFunctionDescriptorById(id);
+    asIScriptFunction* function = mScriptModule->GetFunctionDescriptorById(id);
+    mMethods[type][declaration] = function;
+    return function;
 }
 
 void ScriptFile::addScriptInstance(ScriptInstance* instance)

+ 3 - 1
Engine/Script/ScriptFile.h

@@ -77,7 +77,7 @@ public:
     //! Return a function by declaration. Will be stored to a search cache so that further searches should be faster
     asIScriptFunction* getFunction(const std::string& declaration);
     //! Return an object method by declaration
-    asIScriptFunction* getMethod(asIScriptObject* object, const std::string& declaration) const;
+    asIScriptFunction* getMethod(asIScriptObject* object, const std::string& declaration);
     //! Return whether script compiled successfully
     bool isCompiled() const { return mCompiled; }
     
@@ -106,6 +106,8 @@ private:
     std::map<asIObjectType*, bool> mCheckedClasses;
     //! Search cache for functions
     std::map<std::string, asIScriptFunction*> mFunctions;
+    //! Search cache for methods
+    std::map<asIObjectType*, std::map<std::string, asIScriptFunction*> > mMethods;
     //! ScriptInstances that have created objects from this script file
     std::vector<ScriptInstance*> mScriptInstances;
 };