CmScriptClass.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "CmScriptClass.h"
  2. #include "CmScriptMethod.h"
  3. #include "CmUtil.h"
  4. #include "CmException.h"
  5. namespace CamelotFramework
  6. {
  7. inline size_t ScriptClass::MethodId::Hash::operator()(const ScriptClass::MethodId& v) const
  8. {
  9. size_t seed = 0;
  10. hash_combine(seed, v.name);
  11. hash_combine(seed, v.numParams);
  12. return seed;
  13. }
  14. inline bool ScriptClass::MethodId::Equals::operator()(const ScriptClass::MethodId &a, const ScriptClass::MethodId &b) const
  15. {
  16. return a.name == b.name && a.numParams == b.numParams;
  17. }
  18. ScriptClass::MethodId::MethodId(const String& name, UINT32 numParams)
  19. :name(name), numParams(numParams)
  20. {
  21. }
  22. ScriptClass::ScriptClass(const String& fullName, MonoClass* monoClass)
  23. :mFullName(fullName), mClass(monoClass)
  24. {
  25. }
  26. ScriptClass::~ScriptClass()
  27. {
  28. for(auto& mapEntry : mMethods)
  29. {
  30. cm_delete(mapEntry.second);
  31. }
  32. mMethods.clear();
  33. }
  34. ScriptMethod& ScriptClass::getMethod(const String& name, UINT32 numParams)
  35. {
  36. MethodId mehodId(name, numParams);
  37. auto iterFind = mMethods.find(mehodId);
  38. if(iterFind != mMethods.end())
  39. return *iterFind->second;
  40. MonoMethod* method = mono_class_get_method_from_name(mClass, name.c_str(), (int)numParams);
  41. if(method == nullptr)
  42. {
  43. String fullMethodName = mFullName + "::" + name;
  44. CM_EXCEPT(InvalidParametersException, "Cannot get Mono method: " + fullMethodName);
  45. }
  46. ScriptMethod* newMethod = new (cm_alloc<ScriptMethod>()) ScriptMethod(method);
  47. mMethods[mehodId] = newMethod;
  48. return *newMethod;
  49. }
  50. MonoObject* ScriptClass::invokeMethod(const String& name, ScriptObject* instance, void** params, UINT32 numParams)
  51. {
  52. return getMethod(name, numParams).invoke(instance, params);
  53. }
  54. void ScriptClass::addInternalCall(const String& name, const void* method)
  55. {
  56. String fullMethodName = mFullName + "::" + name;
  57. mono_add_internal_call(fullMethodName.c_str(), method);
  58. }
  59. }