11 using std::unique_ptr;
19 void ContextMethods::registerConstants(
MinitScript* minitScript) {
22 void ContextMethods::registerMethods(
MinitScript* minitScript) {
23 if (minitScript->
getContext() ==
nullptr)
return;
30 MethodContextScriptHasCallable(
MinitScript* minitScript):
33 { .type = MinitScript::TYPE_STRING, .name =
"scriptId", .optional =
false, .reference =
false, .nullable =
false },
34 { .type = MinitScript::TYPE_STRING, .name =
"callable", .optional =
false, .reference =
false, .nullable =
false }
36 MinitScript::TYPE_BOOLEAN
38 minitScript(minitScript) {}
39 const string getMethodName()
override {
40 return "context.script.hasCallable";
45 if (arguments.size() == 2 &&
46 MinitScript::getStringValue(arguments, 0, scriptId) ==
true &&
47 MinitScript::getStringValue(arguments, 1, callable) ==
true) {
49 if (script ==
nullptr) {
52 auto scriptIdx = script->getFunctionScriptIdx(callable);
53 if (scriptIdx == MinitScript::SCRIPTIDX_NONE || script->getScripts()[scriptIdx].callable ==
false) {
64 minitScript->
registerMethod(
new MethodContextScriptHasCallable(minitScript));
75 { .type = MinitScript::TYPE_STRING, .name =
"scriptId", .optional =
false, .reference =
false, .nullable =
false },
76 { .type = MinitScript::TYPE_STRING, .name =
"callable", .optional =
false, .reference =
false, .nullable =
false }
78 MinitScript::TYPE_PSEUDO_MIXED
80 minitScript(minitScript) {}
81 const string getMethodName()
override {
82 return "context.script.call";
87 if (arguments.size() >= 2 &&
88 MinitScript::getStringValue(arguments, 0, scriptId) ==
true &&
89 MinitScript::getStringValue(arguments, 1, callable) ==
true) {
91 if (script ==
nullptr) {
94 auto scriptIdx = script->getFunctionScriptIdx(callable);
95 if (scriptIdx == MinitScript::SCRIPTIDX_NONE || script->getScripts()[scriptIdx].callable ==
false) {
99 #if defined (__clang__)
101 vector<MinitScript::Variable> callArguments(arguments.size() - 2);
102 for (
auto i = 2; i < arguments.size(); i++) callArguments[i - 2] = move(arguments[i]);
104 span callArgumentsSpan(callArguments);
105 script->call(scriptIdx, callArgumentsSpan, returnValue);
107 for (
auto i = 2; i < arguments.size(); i++) arguments[i] = move(callArguments[i - 2]);
109 span callArgumentsSpan(arguments.begin() + 2, arguments.end());
110 script->call(scriptIdx, callArgumentsSpan, returnValue);
119 bool isVariadic()
const override {
123 minitScript->
registerMethod(
new MethodContextScriptCall(minitScript));
131 MethodContextScriptLoadScript(
MinitScript* minitScript):
134 { .type = MinitScript::TYPE_STRING, .name =
"scriptId", .optional =
false, .reference =
false, .nullable =
false },
135 { .type = MinitScript::TYPE_STRING, .name =
"pathName", .optional =
false, .reference =
false, .nullable =
false },
136 { .type = MinitScript::TYPE_STRING, .name =
"fileName", .optional =
false, .reference =
false, .nullable =
false },
137 { .type = MinitScript::TYPE_BOOLEAN, .name =
"verbose", .optional =
true, .reference =
false, .nullable =
false },
139 MinitScript::TYPE_NULL
141 minitScript(minitScript) {}
142 const string getMethodName()
override {
143 return "context.script.loadScript";
149 bool verbose =
false;
150 if ((arguments.size() == 3 || arguments.size() == 4) &&
151 MinitScript::getStringValue(arguments, 0, scriptId) ==
true &&
152 MinitScript::getStringValue(arguments, 1, pathName) ==
true &&
153 MinitScript::getStringValue(arguments, 2, fileName) ==
true &&
154 MinitScript::getBooleanValue(arguments, 3, verbose,
true) ==
true) {
155 unique_ptr<MinitScript> script;
158 script = unique_ptr<MinitScript>(
166 if (script ==
nullptr) {
168 script = make_unique<MinitScript>();
169 script->setContext(minitScript->
getContext());
175 if (script !=
nullptr) {
179 if (script->isValid() ==
false) {
190 minitScript->
registerMethod(
new MethodContextScriptLoadScript(minitScript));
198 MethodContextScriptRemoveScript(
MinitScript* minitScript):
201 { .type = MinitScript::TYPE_STRING, .name =
"scriptId", .optional =
false, .reference =
false, .nullable =
false }
203 MinitScript::TYPE_NULL
205 minitScript(minitScript) {}
206 const string getMethodName()
override {
207 return "context.script.removeScript";
211 if (arguments.size() == 1 &&
212 MinitScript::getStringValue(arguments, 0, scriptId) ==
true) {
219 minitScript->
registerMethod(
new MethodContextScriptRemoveScript(minitScript));
227 MethodContextScriptGetScriptIds(
MinitScript* minitScript):
229 minitScript(minitScript) {}
230 const string getMethodName()
override {
231 return "context.script.getScriptIds";
234 if (arguments.size() == 0) {
236 returnValue.
setType(MinitScript::TYPE_ARRAY);
237 for (
const auto& scriptId: scriptIds) returnValue.
pushArrayEntry(scriptId);
243 minitScript->
registerMethod(
new MethodContextScriptGetScriptIds(minitScript));
#define MINITSCRIPT_METHODUSAGE_COMPLAINM(methodName, message)
#define MINITSCRIPT_METHODUSAGE_COMPLAIN(methodName)
MinitScript script context methods.
void pop()
Remove from script call stack.
const vector< string > getScriptIds()
Get script ids.
void removeScript(const string &id)
Remove script.
void addScript(const string &id, MinitScript *script)
Add script.
MinitScript * getScript(const string &id)
Get script.
void push(MinitScript *script)
Add to script call stack.
virtual MinitScript * loadScript(const string &pathName, const string &fileName, const string &basePathName=string())
Load script from library.
void pushArrayEntry(const Variable &value)
Push entry to array.
void setType(VariableType newType)
Set type.
void setValue(const Variable &variable)
Set value from given variable into variable.
void registerMethod(Method *method)
Register method.
static void printLine()
Print newline to console.