CmScriptAssembly.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "CmScriptAssembly.h"
  2. #include "CmScriptClass.h"
  3. #include "CmUtil.h"
  4. #include "CmException.h"
  5. namespace CamelotFramework
  6. {
  7. inline size_t ScriptAssembly::ClassId::Hash::operator()(const ScriptAssembly::ClassId& v) const
  8. {
  9. size_t seed = 0;
  10. hash_combine(seed, v.namespaceName);
  11. hash_combine(seed, v.name);
  12. return seed;
  13. }
  14. inline bool ScriptAssembly::ClassId::Equals::operator()(const ScriptAssembly::ClassId &a, const ScriptAssembly::ClassId &b) const
  15. {
  16. return a.name == b.name && a.namespaceName == b.namespaceName;
  17. }
  18. ScriptAssembly::ClassId::ClassId(const String& namespaceName, String name)
  19. :namespaceName(namespaceName), name(name)
  20. {
  21. }
  22. ScriptAssembly::ScriptAssembly(MonoAssembly* assembly)
  23. :mMonoAssembly(assembly)
  24. {
  25. mMonoImage = mono_assembly_get_image(mMonoAssembly);
  26. if(mMonoImage == nullptr)
  27. {
  28. CM_EXCEPT(InvalidParametersException, "Cannot get script assembly image.");
  29. }
  30. }
  31. ScriptAssembly::~ScriptAssembly()
  32. {
  33. for(auto& entry : mClasses)
  34. cm_delete(entry.second);
  35. mClasses.clear();
  36. }
  37. ScriptClass& ScriptAssembly::getClass(const String& namespaceName, const String& name)
  38. {
  39. ClassId classId(namespaceName, name);
  40. auto iterFind = mClasses.find(classId);
  41. if(iterFind != mClasses.end())
  42. return *iterFind->second;
  43. MonoClass* monoClass = mono_class_from_name(mMonoImage, namespaceName.c_str(), name.c_str());
  44. if(monoClass == nullptr)
  45. {
  46. CM_EXCEPT(InvalidParametersException, "Cannot get Mono class: " + namespaceName + "." + name);
  47. }
  48. String fullClassName = namespaceName + "::" + name;
  49. ScriptClass* newClass = new (cm_alloc<ScriptClass>()) ScriptClass(fullClassName, monoClass);
  50. mClasses[classId] = newClass;
  51. return *newClass;
  52. }
  53. }