Polyphase Game Engine
Loading...
Searching...
No Matches
ScriptUtils.h
Go to the documentation of this file.
1#pragma once
2
3#include "ScriptMacros.h"
4#include <functional>
5#include <unordered_map>
6#include <unordered_set>
7
8class Script;
9
11{
12public:
13
14 static bool IsScriptLoaded(const std::string& className);
15 static bool ReloadScriptFile(const std::string& fileName);
16 static bool CallLuaFunc(int numArgs, int numResults = 0);
17 // reportMissingClass: log an error when the chunk ran but never defined a
18 // global table named className. True for anything a Script component asked
19 // for (a class script that lost its table IS a bug). False for speculative
20 // loads -- the disk sweep in ReloadAllScriptFiles also picks up plain
21 // module/library scripts, which legitimately have no class table.
22 static bool LoadScriptFile(const std::string& fileName, const std::string& className, bool reportMissingClass = true);
23 // Optional progress callback. Called once per file with (fileName, done,
24 // total). Return false to abort the loop after the current file. Default
25 // nullptr keeps non-editor callers unchanged.
26 using ReloadProgressFn = std::function<bool(const std::string&, int, int)>;
27 static void ReloadAllScriptFiles(const ReloadProgressFn& onProgress = nullptr);
28 static void LoadAllScripts();
29 static void LoadScriptDirectory(const std::string& dirName, bool recurse = true);
30 // Wipe the loaded-script registry. The Lua globals themselves are left in
31 // place (re-running a class chunk overwrites its table), but subsequent
32 // Script attaches will re-read the .lua from disk instead of seeing the
33 // IsScriptLoaded fast-path and reusing the stale prototype. Called on
34 // project switch so addon Lua edits made between sessions take effect.
35 static void ClearLoadedScripts();
36
37 static std::string GetClassNameFromFileName(const std::string& fileName);
38 // True for scripts that are executed once at boot (or are pure templates)
39 // and must never be re-executed by the reload-all sweep. Re-running them
40 // has session-persistent side effects -- StartLuaPanda.lua reopens the
41 // debugger socket and steals the debug hook back from LuaDebugger.
42 static bool IsReloadExcludedScript(const std::string& fileName);
43 static void SetEmbeddedScripts(EmbeddedFile* embeddedScripts, uint32_t numEmbeddedScripts);
44 static EmbeddedFile* FindEmbeddedScript(const std::string& className);
45 static bool RunScript(const char* fileName, Datum* ret = nullptr);
46
47 // Reads a script's decoded source from whichever source holds it: the
48 // embedded table first, then Content.pak / disk. Used by the require()
49 // searcher in LuaBindings.cpp, which cannot go through Lua's own
50 // package.path -- a packaged build has no loose .lua files to find.
51 static bool ReadScriptSource(const char* fileName, std::string& outSource);
52
53 static uint32_t GetNextScriptInstanceNumber();
54
55 static void CallMethod(Node* node, const char* funcName, uint32_t numParams, const Datum** params, Datum* ret);
56 static void SetBreakOnScriptError(bool enableBreak);
57
58 static void GarbageCollect();
59
60 static Datum GetField(Node* node, const char* key);
61 static void SetField(Node* node, const char* key, const Datum& value);
62 static Datum GetField(Node* node, int32_t key);
63 static void SetField(Node* node, int32_t key, const Datum& value);
64
65 static Datum GetField(const char* table, const char* key);
66 static void SetField(const char* table, const char* key, const Datum& value);
67 static Datum GetField(const char* table, int32_t key);
68 static void SetField(const char* table, int32_t key, const Datum& value);
69
70 static void DumpStack();
71
72private:
73
74 // className -> last fileName used to load it. The fileName is preserved so
75 // ReloadAllScriptFiles can re-route addon paths (e.g. "Packages/Foo/Bar")
76 // through RunScript's Packages/ branch on the next pass; a className-only
77 // entry like "Bar" would fall through to the legacy Scripts/ probe and
78 // silently fail to reload.
79 static std::unordered_map<std::string, std::string> sLoadedLuaFiles;
80 static std::unordered_set<std::string> sLoadingLuaFiles;
81 static EmbeddedFile* sEmbeddedScripts;
82 static uint32_t sNumEmbeddedScripts;
83 static uint32_t sNumScriptInstances;
84
85 static bool sBreakOnScriptError;
86};
Definition Datum.h:169
Definition Node.h:67
Definition ScriptUtils.h:11
static void CallMethod(Node *node, const char *funcName, uint32_t numParams, const Datum **params, Datum *ret)
Definition ScriptUtils.cpp:731
static bool RunScript(const char *fileName, Datum *ret=nullptr)
Definition ScriptUtils.cpp:580
static void ReloadAllScriptFiles(const ReloadProgressFn &onProgress=nullptr)
Definition ScriptUtils.cpp:269
static bool IsReloadExcludedScript(const std::string &fileName)
Definition ScriptUtils.cpp:234
static void LoadScriptDirectory(const std::string &dirName, bool recurse=true)
Definition ScriptUtils.cpp:387
static void GarbageCollect()
Definition ScriptUtils.cpp:773
static bool ReadScriptSource(const char *fileName, std::string &outSource)
Definition ScriptUtils.cpp:538
static void LoadAllScripts()
Definition ScriptUtils.cpp:382
static void SetEmbeddedScripts(EmbeddedFile *embeddedScripts, uint32_t numEmbeddedScripts)
Definition ScriptUtils.cpp:486
static bool ReloadScriptFile(const std::string &fileName)
Definition ScriptUtils.cpp:40
static std::string GetClassNameFromFileName(const std::string &fileName)
Definition ScriptUtils.cpp:449
static void ClearLoadedScripts()
Definition ScriptUtils.cpp:377
static void DumpStack()
Definition ScriptUtils.cpp:938
static uint32_t GetNextScriptInstanceNumber()
Definition ScriptUtils.cpp:724
static bool IsScriptLoaded(const std::string &className)
Definition ScriptUtils.cpp:35
static void SetBreakOnScriptError(bool enableBreak)
Definition ScriptUtils.cpp:768
std::function< bool(const std::string &, int, int)> ReloadProgressFn
Definition ScriptUtils.h:26
static bool CallLuaFunc(int numArgs, int numResults=0)
Definition ScriptUtils.cpp:55
static void SetField(Node *node, const char *key, const Datum &value)
Definition ScriptUtils.cpp:808
static bool LoadScriptFile(const std::string &fileName, const std::string &className, bool reportMissingClass=true)
Definition ScriptUtils.cpp:92
static EmbeddedFile * FindEmbeddedScript(const std::string &className)
Definition ScriptUtils.cpp:492
static Datum GetField(Node *node, const char *key)
Definition ScriptUtils.cpp:787
Definition Script.h:29
Definition EmbeddedFile.h:6