summaryrefslogtreecommitdiff
path: root/Runtime/Scripting/Backend/ScriptingInvocation.h
blob: 2bad02cfaf8ff75b4003a3e1a78073b024ca6dd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#ifndef _SCRIPTINGINVOCATION_H_
#define _SCRIPTINGINVOCATION_H_

#if ENABLE_SCRIPTING

#include "ScriptingInvocationNoArgs.h"
#include "ScriptingArguments.h"


/// ScriptingInvocation invocation (scriptingMethod); // Slow alternative (Don't use this in runtime code) ScriptingInvocation invocation ("MyNameSpace", "MyClassName", "MyMethod");
/// invocation.AddInt(5);
/// invocation.Invoke (); // < you are certain that the bound method accepts those exact parameters
/// invocation.InvokeChecked(); // < you cant guarantee that the bound method has the passed parameters

/// By default logs the exception (Can be turned off via invocation.logException = false;)
/// Parameters are setup AddInt, AddFloat, AddStruct functions below
class ScriptingInvocation : public ScriptingInvocationNoArgs
{
public:
	ScriptingInvocation();
	ScriptingInvocation(ScriptingMethodPtr in_method);
#if ENABLE_MONO || UNITY_WINRT
	ScriptingInvocation(const char* namespaze, const char* klass, const char* name);
	ScriptingInvocation(ScriptingClassPtr klass, const char* name);
	ScriptingInvocation(BackendNativeMethod method);
#endif

	//convenience forwarders to arguments
	void AddBoolean(bool value) { arguments.AddBoolean(value); }
	void AddInt(int value) { arguments.AddInt(value); }
	void AddFloat(float value) { arguments.AddFloat(value); }
	void AddString(const char* str) { arguments.AddString(str); }
	void AddString(std::string& str) { arguments.AddString(str); }
	void AddObject(ScriptingObjectPtr scriptingObject) { arguments.AddObject(scriptingObject); }
	void AddStruct(void* pointerToStruct) { arguments.AddStruct(pointerToStruct); }
	void AddEnum(int value) { arguments.AddEnum(value); }
	void AddArray(ScriptingArrayPtr arr) { arguments.AddArray(arr); }

	void AdjustArgumentsToMatchMethod();
	
	template<class T> T Invoke();
	template<class T> T Invoke(ScriptingException**);
	ScriptingObjectPtr Invoke();
	ScriptingObjectPtr Invoke(ScriptingException**);
	ScriptingObjectPtr Invoke(ScriptingExceptionPtr*, bool);

	ScriptingArguments& Arguments() { return arguments; }
protected:
	ScriptingArguments arguments;
	virtual bool Check();
};


#if ENABLE_MONO

struct MonoObject;
struct MonoException;
class Object;
struct MonoMethod;
struct MonoClass;
class MonoScript;

MonoObject* CallStaticMonoMethod (const char* className, const char* methodName, void** parameters = NULL);
MonoObject* CallStaticMonoMethod (const char* className, const char* methodName, void** parameters, MonoException** exception);
MonoObject* CallStaticMonoMethod (const char* className, const char* nameSpace, const char* methodName, void** paramenters = NULL);
MonoObject* CallStaticMonoMethod (const char* className, const char* nameSpace, const char* methodName, void** paramenters, MonoException** exception);
MonoObject* CallStaticMonoMethod (MonoClass* klass , const char* methodName, void** parameters = NULL);
MonoObject* CallStaticMonoMethod (MonoClass* klass , const char* methodName, void** parameters, MonoException** exception);
#endif

#endif

#endif