summaryrefslogtreecommitdiff
path: root/Runtime/Mono/MonoScriptManager.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Mono/MonoScriptManager.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Mono/MonoScriptManager.cpp')
-rw-r--r--Runtime/Mono/MonoScriptManager.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/Runtime/Mono/MonoScriptManager.cpp b/Runtime/Mono/MonoScriptManager.cpp
new file mode 100644
index 0000000..4b1c3c6
--- /dev/null
+++ b/Runtime/Mono/MonoScriptManager.cpp
@@ -0,0 +1,150 @@
+#include "UnityPrefix.h"
+#include "Runtime/Mono/MonoScript.h"
+#include "Runtime/Mono/MonoScriptManager.h"
+#include "Runtime/Threads/Thread.h"
+
+#if ENABLE_SCRIPTING
+template<typename T> MonoScript* FindScript(MonoScriptManager::Scripts& scripts, T& filter)
+{
+ MonoScriptManager::Scripts::iterator i, next;
+ for (i= scripts.begin ();i != scripts.end ();i=next)
+ {
+ next = i; next++;
+ MonoScript* script = *i;
+ if (script == NULL)
+ {
+ scripts.erase (i);
+ }
+ else if (filter.Match(script))
+ return script;
+ }
+ return NULL;
+}
+
+struct MatchScriptByNameFilter
+{
+ const char* name;
+ bool Match(MonoScript* ms) { return ms->GetScriptClassName() == name; }
+};
+
+struct MatchScriptByClassFilter
+{
+ ScriptingClassPtr klass;
+ bool Match(MonoScript* ms) { return ms->GetClass() == klass; }
+};
+
+struct MatchScriptByClassNamespaceAssemblyFilter
+{
+ // hold by const ref to minimize copying
+ std::string const& scriptClassName, nameSpace, assemblyName;
+
+ MatchScriptByClassNamespaceAssemblyFilter (std::string const& scriptName, std::string const& ns, std::string const& assembly)
+ : scriptClassName (scriptName), nameSpace (ns), assemblyName (assembly)
+ {}
+
+ bool Match(MonoScript* ms)
+ {
+ return ms->GetScriptClassName () == scriptClassName
+ && ms->GetNameSpace () == nameSpace
+ && ms->GetAssemblyName () == assemblyName;
+ }
+};
+
+static MonoScript* FindScript(ScriptingClassPtr klass, MonoScriptManager::Scripts& scripts)
+{
+ MatchScriptByClassFilter filter;
+ filter.klass = klass;
+ return FindScript(scripts,filter);
+}
+
+static void AddScriptsToList(MonoScriptManager::Scripts& scripts, MonoScriptManager::AllScripts& addtothis)
+{
+ MonoScriptManager::Scripts::iterator i, next;
+
+ for (i= scripts.begin ();i != scripts.end ();i=next)
+ {
+ next = i; next++;
+ MonoScript* script = *i;
+ if (script)
+ addtothis.insert (script);
+ else
+ {
+ scripts.erase (i);
+ }
+ }
+}
+
+MonoScriptManager::AllScripts MonoScriptManager::GetAllRuntimeScripts ()
+{
+ ASSERT_RUNNING_ON_MAIN_THREAD
+
+ AllScripts scripts;
+ AddScriptsToList(m_RuntimeScripts,scripts);
+ return scripts;
+}
+
+MonoScript* MonoScriptManager::FindRuntimeScript (const string& className)
+{
+ ASSERT_RUNNING_ON_MAIN_THREAD
+
+ MatchScriptByNameFilter filter;
+ filter.name = className.c_str();
+ return FindScript(m_RuntimeScripts,filter);
+}
+
+MonoScript* MonoScriptManager::FindRuntimeScript (const string& className, string const& nameSpace, string const& assembly)
+{
+ ASSERT_RUNNING_ON_MAIN_THREAD
+
+ MatchScriptByClassNamespaceAssemblyFilter filter (className, nameSpace, assembly);
+ return FindScript (m_RuntimeScripts, filter);
+}
+
+MonoScript* MonoScriptManager::FindRuntimeScript (ScriptingClassPtr klass)
+{
+ ASSERT_RUNNING_ON_MAIN_THREAD
+ return FindScript(klass,m_RuntimeScripts);
+}
+
+void MonoScriptManager::RegisterRuntimeScript (MonoScript& script)
+{
+ ASSERT_RUNNING_ON_MAIN_THREAD
+ m_RuntimeScripts.insert (&script);
+}
+
+#if UNITY_EDITOR
+MonoScript* MonoScriptManager::FindEditorScript (MonoClass* klass)
+{
+ ASSERT_RUNNING_ON_MAIN_THREAD
+ return FindScript(klass,m_EditorScripts);
+}
+
+MonoScript* MonoScriptManager::FindEditorScript (const string& className)
+{
+ ASSERT_RUNNING_ON_MAIN_THREAD
+
+ MatchScriptByNameFilter filter;
+ filter.name = className.c_str();
+ return FindScript(m_EditorScripts,filter);
+}
+
+void MonoScriptManager::RegisterEditorScript (MonoScript& script)
+{
+ ASSERT_RUNNING_ON_MAIN_THREAD
+ m_EditorScripts.insert (&script);
+}
+
+MonoScriptManager::AllScripts MonoScriptManager::GetAllRuntimeAndEditorScripts ()
+{
+ ASSERT_RUNNING_ON_MAIN_THREAD
+
+ AllScripts scripts;
+
+ AddScriptsToList(m_RuntimeScripts,scripts);
+ AddScriptsToList(m_EditorScripts,scripts);
+
+ return scripts;
+}
+
+#endif
+#endif