]> git.r.bdr.sh - rbdr/pico-engine/blame - LuaVirtualMachine.cpp
Add The requirements (basic stuff)
[rbdr/pico-engine] / LuaVirtualMachine.cpp
CommitLineData
10a0e290
BB
1// ---------------------------------------------------------------------------\r
2// FILE NAME : LuaVirtualMachine.cpp\r
3// ---------------------------------------------------------------------------\r
4// DESCRIPTION :\r
5//\r
6// Lua virtual machine implementation\r
7// \r
8// ---------------------------------------------------------------------------\r
9// VERSION : 1.00\r
10// DATE : 1-Sep-2005\r
11// AUTHOR : Richard Shephard\r
12// ---------------------------------------------------------------------------\r
13// LIBRARY INCLUDE FILES\r
14#include "luainc.h"\r
15#include "luavirtualmachine.h"\r
16#include <assert.h>\r
17#include <string.h>\r
18#include <stdio.h>\r
19// ---------------------------------------------------------------------------\r
20\r
21\r
22//============================================================================\r
23// int printMessage\r
24//---------------------------------------------------------------------------\r
25// Prints a message to the console\r
26//\r
27// Parameter Dir Description\r
28// --------- --- -----------\r
29// lua IN State variable\r
30//\r
31// Return\r
32// ------\r
33// Number of return varaibles on the stack\r
34//\r
35//============================================================================\r
36static int printMessage (lua_State *lua)\r
37{\r
38 assert (lua_isstring (lua,1));\r
39\r
40 const char *msg = lua_tostring (lua, 1);\r
41\r
42 // get caller\r
43 lua_Debug ar;\r
44 memset (&ar, 0, sizeof(ar));\r
45 lua_getstack (lua, 1, &ar);\r
46 lua_getinfo (lua, "Snl", &ar);\r
47\r
48 // debug output\r
49 const char *str = ar.source;\r
50 printf ("script: %s -- at %s(%d)\n", msg, str, ar.currentline);\r
51 return 0;\r
52}\r
53\r
54//============================================================================\r
55// CLuaVirtualMachine::CLuaVirtualMachine\r
56//---------------------------------------------------------------------------\r
57// Constructor. Setups the default VM state\r
58//\r
59// Parameter Dir Description\r
60// --------- --- -----------\r
61// \r
62//\r
63// Return\r
64// ------\r
65// None.\r
66//\r
67//============================================================================\r
68CLuaVirtualMachine::CLuaVirtualMachine (void) : m_pState (NULL), m_pDbg (NULL)\r
69{\r
70 m_fIsOk = false;\r
71}\r
72\r
73//============================================================================\r
74// CLuaVirtualMachine::CLuaVirtualMachine\r
75//---------------------------------------------------------------------------\r
76// Destructor. Closes the VM\r
77//\r
78// Parameter Dir Description\r
79// --------- --- -----------\r
80// \r
81//\r
82// Return\r
83// ------\r
84// None.\r
85//\r
86//============================================================================\r
87CLuaVirtualMachine::~CLuaVirtualMachine (void)\r
88{\r
89 if (m_pState != NULL)\r
90 {\r
91 lua_close (m_pState);\r
92 }\r
93}\r
94\r
95//============================================================================\r
96// CLuaVirtualMachine::Panic\r
97//---------------------------------------------------------------------------\r
98// When things in Lua go wrong (ever called in protected mode??)\r
99//\r
100// Parameter Dir Description\r
101// --------- --- -----------\r
102// lua IN State variable\r
103//\r
104// Return\r
105// ------\r
106// None.\r
107//\r
108//============================================================================\r
109void CLuaVirtualMachine::Panic (lua_State *lua)\r
110{\r
111}\r
112\r
113//============================================================================\r
114// bool CLuaVirtualMachine::InitialiseVM\r
115//---------------------------------------------------------------------------\r
116// Initialises the VM, open lua, makes sure things are OK\r
117//\r
118// Parameter Dir Description\r
119// --------- --- -----------\r
120// None.\r
121//\r
122// Return\r
123// ------\r
124// Success.\r
125//\r
126//============================================================================\r
127bool CLuaVirtualMachine::InitialiseVM (void)\r
128{\r
129 // Open Lua!\r
130 if (Ok ()) DestroyVM ();\r
131\r
132 m_pState = lua_open ();\r
133\r
134 if (m_pState) \r
135 {\r
136 m_fIsOk = true;\r
137\r
138 // Load util libs into lua\r
139 luaL_openlibs (m_pState);\r
140\r
141 // setup global printing (trace)\r
142 lua_pushcclosure (m_pState, printMessage, 0);\r
143 lua_setglobal (m_pState, "trace");\r
144\r
145 lua_atpanic (m_pState, (lua_CFunction) CLuaVirtualMachine::Panic);\r
146\r
147 return true;\r
148 }\r
149\r
150 return false;\r
151}\r
152\r
153//============================================================================\r
154// bool CLuaVirtualMachine::DestroyVM\r
155//---------------------------------------------------------------------------\r
156// Clears the current Lua state\r
157//\r
158// Parameter Dir Description\r
159// --------- --- -----------\r
160// None.\r
161//\r
162// Return\r
163// ------\r
164// Success.\r
165//\r
166//============================================================================\r
167bool CLuaVirtualMachine::DestroyVM (void)\r
168{\r
169 if (m_pState)\r
170 {\r
171 lua_close (m_pState);\r
172 m_pState = NULL;\r
173 m_fIsOk = false;\r
174 }\r
175 return true;\r
176}\r
177\r
178\r
179//============================================================================\r
180// bool CLuaVirtualMachine::RunFile \r
181//---------------------------------------------------------------------------\r
182// Compiles and runs a lua script file\r
183//\r
184// Parameter Dir Description\r
185// --------- --- -----------\r
186// strFilename IN Filename to compile and run\r
187//\r
188// Return\r
189// ------\r
190// Success.\r
191//\r
192//============================================================================\r
193bool CLuaVirtualMachine::RunFile (const char *strFilename)\r
194{\r
195 bool fSuccess = false;\r
196 int iErr = 0;\r
197\r
198 if ((iErr = luaL_loadfile (m_pState, strFilename)) == 0)\r
199 {\r
200 // Call main...\r
201 if ((iErr = lua_pcall (m_pState, 0, LUA_MULTRET, 0)) == 0)\r
202 {\r
203 fSuccess = true;\r
204 }\r
205 }\r
206\r
207 if (fSuccess == false)\r
208 {\r
209 if (m_pDbg != NULL) m_pDbg->ErrorRun (iErr);\r
210 }\r
211\r
212 return fSuccess;\r
213}\r
214\r
215//============================================================================\r
216// bool CLuaVirtualMachine::RunBuffer \r
217//---------------------------------------------------------------------------\r
218// Compiles and runs a pre-compiled data buffer\r
219//\r
220// Parameter Dir Description\r
221// --------- --- -----------\r
222// pbBuffer IN Buffer to run\r
223// szLen IN Length of buffer\r
224// strName IN Name of Buffer\r
225//\r
226// Return\r
227// ------\r
228// Success.\r
229//\r
230//============================================================================\r
231bool CLuaVirtualMachine::RunBuffer (const unsigned char *pbBuffer, size_t szLen, const char *strName /* = NULL */)\r
232{\r
233 bool fSuccess = false;\r
234 int iErr = 0;\r
235\r
236 if (strName == NULL)\r
237 {\r
238 strName = "Temp";\r
239 }\r
240\r
241 if ((iErr = luaL_loadbuffer (m_pState, (const char *) pbBuffer, szLen, strName)) == 0)\r
242 {\r
243 // Call main...\r
244 if ((iErr = lua_pcall (m_pState, 0, LUA_MULTRET, 0)) == 0)\r
245 {\r
246 fSuccess = true;\r
247 }\r
248 }\r
249\r
250 if (fSuccess == false)\r
251 {\r
252 if (m_pDbg != NULL) m_pDbg->ErrorRun (iErr);\r
253 }\r
254\r
255 return fSuccess; \r
256\r
257}\r
258\r
259//============================================================================\r
260// CLuaVirtualMachine::CallFunction \r
261//---------------------------------------------------------------------------\r
262// Calls a function that is already on the stack\r
263//\r
264// Parameter Dir Description\r
265// --------- --- -----------\r
266// nArgs IN Args that are aleady on the stack\r
267// nReturns IN Number of expected returns (will be on the stack)\r
268//\r
269// Return\r
270// ------\r
271// Success.\r
272//\r
273//============================================================================\r
274bool CLuaVirtualMachine::CallFunction (int nArgs, int nReturns /* = 0 */)\r
275{\r
276 bool fSuccess = false;\r
277 \r
278 if (lua_isfunction (m_pState, -nArgs-1))\r
279 {\r
280 int iErr = 0;\r
281 iErr = lua_pcall (m_pState, nArgs, nReturns, 0);\r
282\r
283 if (iErr == 0)\r
284 {\r
285 fSuccess = true;\r
286 }\r
287 else\r
288 {\r
289 if (m_pDbg != NULL) m_pDbg->ErrorRun (iErr);\r
290 }\r
291 }\r
292\r
293 return fSuccess;\r
294}\r
295\r