Changeset 7653 in orxonox.OLD for branches/script_engine/src/lib
- Timestamp:
- May 17, 2006, 7:55:59 PM (19 years ago)
- Location:
- branches/script_engine/src/lib/script_engine
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/script_engine/src/lib/script_engine/LuaCallback.h
r7645 r7653 7 7 #include <stdio.h> 8 8 9 class LuaVirtualMachine; 9 namespace OrxScript 10 { 11 class LuaVirtualMachine; 10 12 11 13 12 /**13 * @brief This function accually executes a method called by Lua.14 *15 * @param lua Since this function gets called by lua it has to have a lua_State as parameter16 *17 * @return the number of return values. (which can be found on the stack)18 *19 * For Lua doesn't know how to handle C++ objects it pushes the Objecttable (including the objectpointer) on top of the stack and20 * calls this function.21 *22 *23 * @todo handle an acces to a nonexistent (deleted) object24 */14 /** 15 * @brief This function accually executes a method called by Lua. 16 * 17 * @param lua Since this function gets called by lua it has to have a lua_State as parameter 18 * 19 * @return the number of return values. (which can be found on the stack) 20 * 21 * For Lua doesn't know how to handle C++ objects it pushes the Objecttable (including the objectpointer) on top of the stack and 22 * calls this function. 23 * 24 * 25 * @todo handle an acces to a nonexistent (deleted) object 26 */ 25 27 26 28 27 static int luaCallback (lua_State *lua)28 {29 static int luaCallback (lua_State *lua) 30 { 29 31 30 // Locate the psudo-index for the function number31 int methodNumber = lua_upvalueindex (1);32 int returnCount = 0;32 // Locate the psudo-index for the function number 33 int methodNumber = lua_upvalueindex (1); 34 int returnCount = 0; 33 35 34 bool functionSuccess = false;36 bool functionSuccess = false; 35 37 36 // Check for the "this" table37 if (lua_istable (lua, 1))38 {39 // Found the "this" table. The object pointer is at the index 040 lua_rawgeti (lua, 1, 0);38 // Check for the "this" table 39 if (lua_istable (lua, 1)) 40 { 41 // Found the "this" table. The object pointer is at the index 0 42 lua_rawgeti (lua, 1, 0); 41 43 42 if (lua_islightuserdata (lua, -1)) 44 if (lua_islightuserdata (lua, -1)) 45 { 46 // Found the pointer, need to cast it 47 Scriptable* thisPointer = (Scriptable*) lua_touserdata (lua, -1); 48 49 // Get the method index 50 int methodIndex = (int) lua_tonumber (lua, methodNumber); 51 52 // Reformat the stack so our parameters are correct 53 // Clean up the "this" table 54 lua_remove (lua, 1); 55 // Clean up the thisPointer pointer 56 lua_remove (lua, -1); 57 58 //debug 59 //std::cout<<thisPointer->whatIsThis()<<std::endl; 60 61 LuaScript* originScript = NULL; 62 63 lua_getglobal (lua, "this"); 64 65 if (lua_istable (lua, 1)) 66 { 67 // Found the "this" table. The object pointer is at the index 0 68 lua_rawgeti (lua, 1, 0); 69 70 if (lua_islightuserdata (lua, -1)) 71 { 72 // Found the pointer, need to cast it 73 originScript = (LuaScript *) lua_touserdata (lua, -1); 74 } 75 } 76 77 if(originScript == NULL) 78 {//do something usefull 79 } 80 //debug 81 // std::cout<<originScript->whatIsThis()<<std::endl; 82 83 LuaVirtualMachine virtualMachine = originScript->getVirtualMachine(); 84 //debug 85 //std::cout<<"test "<< thisPointer->methods(virtualMachine)<<std::endl; 86 // Check that the method is correct index 87 assert ((methodIndex <= thisPointer->methods(virtualMachine) )); 88 // Call the class 89 returnCount = thisPointer->scriptCalling ( virtualMachine, thisPointer->getFunctionAtIndex(methodIndex,virtualMachine)); 90 91 functionSuccess = true; 92 } 93 } 94 95 if (functionSuccess == false) 43 96 { 44 // Found the pointer, need to cast it 45 Scriptable* thisPointer = (Scriptable*) lua_touserdata (lua, -1); 97 lua_pushstring (lua, "luaCallback -> Failed to call the class function"); 98 lua_error (lua); 99 } 46 100 47 // Get the method index 48 int methodIndex = (int) lua_tonumber (lua, methodNumber); 49 50 // Reformat the stack so our parameters are correct 51 // Clean up the "this" table 52 lua_remove (lua, 1); 53 // Clean up the thisPointer pointer 54 lua_remove (lua, -1); 55 56 //debug 57 //std::cout<<thisPointer->whatIsThis()<<std::endl; 58 59 LuaScript* originScript = NULL; 60 61 lua_getglobal (lua, "this"); 62 63 if (lua_istable (lua, 1)) 64 { 65 // Found the "this" table. The object pointer is at the index 0 66 lua_rawgeti (lua, 1, 0); 67 68 if (lua_islightuserdata (lua, -1)) 69 { 70 // Found the pointer, need to cast it 71 originScript = (LuaScript *) lua_touserdata (lua, -1); 72 } 73 } 74 75 if(originScript == NULL) 76 {//do something usefull 77 } 78 //debug 79 // std::cout<<originScript->whatIsThis()<<std::endl; 80 81 LuaVirtualMachine virtualMachine = originScript->getVirtualMachine(); 82 //debug 83 //std::cout<<"test "<< thisPointer->methods(virtualMachine)<<std::endl; 84 // Check that the method is correct index 85 assert ((methodIndex <= thisPointer->methods(virtualMachine) )); 86 // Call the class 87 returnCount = thisPointer->scriptCalling ( virtualMachine, thisPointer->getFunctionAtIndex(methodIndex,virtualMachine)); 88 89 functionSuccess = true; 90 } 101 // Number of return variables 102 return returnCount; 91 103 } 92 93 if (functionSuccess == false)94 {95 lua_pushstring (lua, "luaCallback -> Failed to call the class function");96 lua_error (lua);97 }98 99 // Number of return variables100 return returnCount;101 104 } 102 103 105 #endif /* __LUA_CALLBACK_H__*/ -
branches/script_engine/src/lib/script_engine/RestoreStack.h
r7645 r7653 4 4 #include "luaincl.h" 5 5 6 //! Class to restore the stack to the way we found it. 7 class LuaRestoreStack 6 namespace OrxScript 8 7 { 9 public: 10 /** 11 * @brief Stores the stack and the index to the top element 12 * 13 * @param virtualMachine the virtual machine to save 14 */ 15 LuaRestoreStack (LuaVirtualMachine& virtualMachine) : savedState (NULL) 16 { 8 9 //! Class to restore the stack to the way we found it. 10 class LuaRestoreStack 11 { 12 public: 13 /** 14 * @brief Stores the stack and the index to the top element 15 * 16 * @param virtualMachine the virtual machine to save 17 */ 18 LuaRestoreStack (LuaVirtualMachine& virtualMachine) : savedState (NULL) 19 { 17 20 savedState = (lua_State *) virtualMachine; 18 21 if (virtualMachine.isOk ()) 19 22 { 20 23 savedTopIndex = lua_gettop (savedState); 21 24 } 22 }23 /**24 * @brief Restores the virtual machine25 *26 *27 */28 virtual ~LuaRestoreStack (void)29 {25 } 26 /** 27 * @brief Restores the virtual machine 28 * 29 * 30 */ 31 virtual ~LuaRestoreStack (void) 32 { 30 33 lua_settop (savedState, savedTopIndex); 31 }34 } 32 35 33 protected:34 lua_State* savedState;35 int savedTopIndex;36 };36 protected: 37 lua_State* savedState; 38 int savedTopIndex; 39 }; 37 40 41 } 38 42 39 43 #endif // __RESTORE_STACK_H__ -
branches/script_engine/src/lib/script_engine/Script.cc
r7645 r7653 9 9 // --------------------------------------------------------------------------- 10 10 11 namespace OrxScript 12 { 13 11 14 #define BEGIN_LUA_CHECK(vm) lua_State *state = (lua_State *) vm; \ 12 15 if (vm.isOk ()) { … … 14 17 15 18 16 /** 17 * @brief Constructor. Sets up the lua stack and the "this" table 18 * 19 * 20 * 21 */ 22 23 LuaScript::LuaScript () 24 : methodCount (0) , argumentCount (0), functionName() 25 { 26 virtualMachine.init(); 27 lua_State *state = (lua_State *) virtualMachine; 28 29 if (virtualMachine.isOk ()) { 19 /** 20 * @brief Constructor. Sets up the lua stack and the "this" table 21 * 22 * 23 * 24 */ 25 26 LuaScript::LuaScript () 27 : methodCount (0) , argumentCount (0), functionName() 28 { 29 virtualMachine.init(); 30 lua_State *state = (lua_State *) virtualMachine; 31 32 if (virtualMachine.isOk ()) 33 { 30 34 // Create a reference to the "this" table. Each reference is unique 31 lua_newtable (state);32 thisReference = luaL_ref (state, LUA_REGISTRYINDEX);35 lua_newtable (state); 36 thisReference = luaL_ref (state, LUA_REGISTRYINDEX); 33 37 34 38 // Save the "this" table to index 0 of the "this" table 35 LuaRestoreStack rs (virtualMachine);36 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference);37 lua_pushlightuserdata (state, (void *) this);38 lua_rawseti (state, -2, 0);39 }40 41 }42 43 44 /**45 * @brief Deconstructor46 *47 */48 49 LuaScript::~LuaScript (void)50 {51 LuaRestoreStack rs (virtualMachine);52 53 BEGIN_LUA_CHECK (virtualMachine)54 // Get the reference "this" table55 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference);56 57 58 lua_pushnil (state);59 lua_rawseti (state, -2, 0);60 END_LUA_CHECK61 62 }63 64 65 66 /**67 * @brief Compiles a given buffer. (reads it into the lua stack)68 * @param pbBuffer buffer to compile69 * @param size_t length of the buffer70 *71 * @return true if it succeeded72 */73 74 bool LuaScript::compileBuffer (unsigned char *pbBuffer, size_t szLen)75 {76 assert (pbBuffer != NULL && "LuaScript::compileBuffer -> pbBuffer == NULL");77 assert (szLen != 0 && "LuaScript::compileBuffer -> szLen == 0");78 assert (virtualMachine.isOk () && "VM Not OK");79 80 // Make sure we have the correct "this" table81 LuaThis luaThis (virtualMachine, thisReference);82 83 return virtualMachine.runBuffer (pbBuffer, szLen);84 }85 86 87 /**88 * @brief Compiles a given file. (reads it into the lua stack)89 * @param strFilename filename90 *91 * @return true if it succeeded92 */93 94 bool LuaScript::compileFile (const std::string& strFilename)95 {96 //assert (strFilename != NULL && "LuaScript::compileFile -> strFilename == NULL");97 assert (virtualMachine.isOk () && "VM Not OK");98 99 // Make sure we have the correct "this" table100 LuaThis luaThis (virtualMachine, thisReference);101 102 return virtualMachine.runFile (strFilename);103 }104 105 106 /**107 * @brief Registers a function with Lua, the function will be registered in the "this" table108 * @param strFuncName name of the function by which it goes by in lua109 *110 * @return the pseudoindex of the function111 */112 113 int LuaScript::registerFunction (const std::string& strFuncName)114 {115 // assert (strFuncName != NULL && "LuaScript::registerFunction -> strFuncName == NULL");116 assert (virtualMachine.isOk () && "VM Not OK");117 118 int iMethodIdx = -1;119 120 LuaRestoreStack rs (virtualMachine);121 122 BEGIN_LUA_CHECK (virtualMachine)123 124 125 126 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference);127 128 129 lua_pushstring (state, strFuncName.c_str());130 lua_pushnumber (state, (lua_Number) iMethodIdx);131 lua_pushcclosure (state, luaCallback, 1);132 lua_settable (state, -3);133 134 END_LUA_CHECK135 136 137 }138 139 140 /**141 * @brief Selects a script function to run142 * @param strFuncName name of the function to run143 *144 * @return true on success145 */146 bool LuaScript::selectScriptFunction (const std::string& strFuncName)147 {148 // assert (strFuncName != NULL && "LuaScript::selectScriptFunction -> strFuncName == NULL");149 assert (virtualMachine.isOk () && "VM Not OK");150 151 bool fSuccess = true;152 153 BEGIN_LUA_CHECK (virtualMachine)154 // Look up function name155 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference);156 lua_pushstring (state, strFuncName.c_str());157 lua_rawget (state, -2);158 lua_remove (state, -2);159 160 161 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference);162 163 164 if (!lua_isfunction (state, -2))165 {166 fSuccess = false;167 lua_pop (state, 2);168 }169 else170 {171 argumentCount = 0;172 functionName = strFuncName;173 }174 END_LUA_CHECK175 176 177 }178 179 180 /**181 * @brief Checks to see if a function exists182 * @param functionName Function name183 *184 * @return true if the function exists185 */186 bool LuaScript::scriptHasFunction (const std::string& functionName)187 {188 // printf("entered scriptHasFunction\n");189 190 // assert (strScriptName != NULL && "LuaScript::scriptHasFunction -> strScriptName == NULL");191 assert (virtualMachine.isOk () && "VM Not OK");192 193 // printf("assertions passed\n");194 195 LuaRestoreStack rs (virtualMachine);196 197 bool fFoundFunc = false;198 199 BEGIN_LUA_CHECK (virtualMachine)200 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference);201 lua_pushstring (state, functionName.c_str());202 lua_rawget (state, -2);203 lua_remove (state, -2);204 205 if (lua_isfunction (state, -1))206 {207 fFoundFunc = true;208 }209 END_LUA_CHECK210 211 212 213 }214 215 216 /**217 * @brief Adds a parameter to the parameter list218 * @param string string to be added as parameter for a function.219 *220 */221 222 void LuaScript::addParam (char *string)223 {224 assert (string != NULL && "LuaScript::addParam -> string == NULL");225 assert (virtualMachine.isOk () && "VM Not OK");226 227 BEGIN_LUA_CHECK (virtualMachine)228 229 ++argumentCount;230 END_LUA_CHECK231 }232 233 234 /**235 * @brief Adds a parameter to the parameter list236 * @param iInt integer to be added as parameter for a function.237 *238 */239 240 void LuaScript::addParam (int iInt)241 {242 assert (virtualMachine.isOk () && "VM Not OK");243 244 BEGIN_LUA_CHECK (virtualMachine)245 246 ++argumentCount;247 END_LUA_CHECK248 }249 250 251 /**252 * @brief Adds a parameter to the parameter list253 * @param fFloat float to be added as parameter for a function.254 *255 */256 void LuaScript::addParam (float fFloat)257 {258 assert (virtualMachine.isOk () && "VM Not OK");259 260 BEGIN_LUA_CHECK (virtualMachine)261 262 ++argumentCount;263 END_LUA_CHECK264 }265 266 267 /**268 * @brief Runs the selected script function269 * @param nReturns the count of return values270 *271 * @return true on success272 */273 bool LuaScript::run (int nReturns /* = 0 */)274 {275 assert (virtualMachine.isOk () && "VM Not OK");276 277 // At this point there should be a parameters and a function on the278 // Lua stack. Each function get a "this" parameter as default and is279 // pushed onto the stack when the method is selected280 281 bool fSuccess = virtualMachine.callFunction (argumentCount + 1, nReturns);282 283 if (fSuccess == true && nReturns > 0)284 {39 LuaRestoreStack rs (virtualMachine); 40 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference); 41 lua_pushlightuserdata (state, (void *) this); 42 lua_rawseti (state, -2, 0); 43 } 44 45 } 46 47 48 /** 49 * @brief Deconstructor 50 * 51 */ 52 53 LuaScript::~LuaScript (void) 54 { 55 LuaRestoreStack rs (virtualMachine); 56 57 BEGIN_LUA_CHECK (virtualMachine) 58 // Get the reference "this" table 59 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference); 60 61 // Clear index 0 62 lua_pushnil (state); 63 lua_rawseti (state, -2, 0); 64 END_LUA_CHECK 65 66 } 67 68 69 70 /** 71 * @brief Compiles a given buffer. (reads it into the lua stack) 72 * @param pbBuffer buffer to compile 73 * @param size_t length of the buffer 74 * 75 * @return true if it succeeded 76 */ 77 78 bool LuaScript::compileBuffer (unsigned char *pbBuffer, size_t szLen) 79 { 80 assert (pbBuffer != NULL && "LuaScript::compileBuffer -> pbBuffer == NULL"); 81 assert (szLen != 0 && "LuaScript::compileBuffer -> szLen == 0"); 82 assert (virtualMachine.isOk () && "VM Not OK"); 83 84 // Make sure we have the correct "this" table 85 LuaThis luaThis (virtualMachine, thisReference); 86 87 return virtualMachine.runBuffer (pbBuffer, szLen); 88 } 89 90 91 /** 92 * @brief Compiles a given file. (reads it into the lua stack) 93 * @param strFilename filename 94 * 95 * @return true if it succeeded 96 */ 97 98 bool LuaScript::compileFile (const std::string& strFilename) 99 { 100 //assert (strFilename != NULL && "LuaScript::compileFile -> strFilename == NULL"); 101 assert (virtualMachine.isOk () && "VM Not OK"); 102 103 // Make sure we have the correct "this" table 104 LuaThis luaThis (virtualMachine, thisReference); 105 106 return virtualMachine.runFile (strFilename); 107 } 108 109 110 /** 111 * @brief Registers a function with Lua, the function will be registered in the "this" table 112 * @param strFuncName name of the function by which it goes by in lua 113 * 114 * @return the pseudoindex of the function 115 */ 116 117 int LuaScript::registerFunction (const std::string& strFuncName) 118 { 119 // assert (strFuncName != NULL && "LuaScript::registerFunction -> strFuncName == NULL"); 120 assert (virtualMachine.isOk () && "VM Not OK"); 121 122 int iMethodIdx = -1; 123 124 LuaRestoreStack rs (virtualMachine); 125 126 BEGIN_LUA_CHECK (virtualMachine) 127 iMethodIdx = ++methodCount; 128 129 // Register a function with the lua script. Added it to the "this" table 130 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference); 131 132 // Push the function and parameters 133 lua_pushstring (state, strFuncName.c_str()); 134 lua_pushnumber (state, (lua_Number) iMethodIdx); 135 lua_pushcclosure (state, luaCallback, 1); 136 lua_settable (state, -3); 137 138 END_LUA_CHECK 139 140 return iMethodIdx; 141 } 142 143 144 /** 145 * @brief Selects a script function to run 146 * @param strFuncName name of the function to run 147 * 148 * @return true on success 149 */ 150 bool LuaScript::selectScriptFunction (const std::string& strFuncName) 151 { 152 // assert (strFuncName != NULL && "LuaScript::selectScriptFunction -> strFuncName == NULL"); 153 assert (virtualMachine.isOk () && "VM Not OK"); 154 155 bool fSuccess = true; 156 157 BEGIN_LUA_CHECK (virtualMachine) 158 // Look up function name 159 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference); 160 lua_pushstring (state, strFuncName.c_str()); 161 lua_rawget (state, -2); 162 lua_remove (state, -2); 163 164 // Put the "this" table back 165 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference); 166 167 // Check that we have a valid function 168 if (!lua_isfunction (state, -2)) 169 { 170 fSuccess = false; 171 lua_pop (state, 2); 172 } 173 else 174 { 175 argumentCount = 0; 176 functionName = strFuncName; 177 } 178 END_LUA_CHECK 179 180 return fSuccess; 181 } 182 183 184 /** 185 * @brief Checks to see if a function exists 186 * @param functionName Function name 187 * 188 * @return true if the function exists 189 */ 190 bool LuaScript::scriptHasFunction (const std::string& functionName) 191 { 192 // printf("entered scriptHasFunction\n"); 193 194 // assert (strScriptName != NULL && "LuaScript::scriptHasFunction -> strScriptName == NULL"); 195 assert (virtualMachine.isOk () && "VM Not OK"); 196 197 // printf("assertions passed\n"); 198 199 LuaRestoreStack rs (virtualMachine); 200 201 bool fFoundFunc = false; 202 203 BEGIN_LUA_CHECK (virtualMachine) 204 lua_rawgeti (state, LUA_REGISTRYINDEX, thisReference); 205 lua_pushstring (state, functionName.c_str()); 206 lua_rawget (state, -2); 207 lua_remove (state, -2); 208 209 if (lua_isfunction (state, -1)) 210 { 211 fFoundFunc = true; 212 } 213 END_LUA_CHECK 214 215 return fFoundFunc; 216 217 } 218 219 220 /** 221 * @brief Adds a parameter to the parameter list 222 * @param string string to be added as parameter for a function. 223 * 224 */ 225 226 void LuaScript::addParam (char *string) 227 { 228 assert (string != NULL && "LuaScript::addParam -> string == NULL"); 229 assert (virtualMachine.isOk () && "VM Not OK"); 230 231 BEGIN_LUA_CHECK (virtualMachine) 232 lua_pushstring (state, string); 233 ++argumentCount; 234 END_LUA_CHECK 235 } 236 237 238 /** 239 * @brief Adds a parameter to the parameter list 240 * @param iInt integer to be added as parameter for a function. 241 * 242 */ 243 244 void LuaScript::addParam (int iInt) 245 { 246 assert (virtualMachine.isOk () && "VM Not OK"); 247 248 BEGIN_LUA_CHECK (virtualMachine) 249 lua_pushnumber (state, (lua_Number) iInt); 250 ++argumentCount; 251 END_LUA_CHECK 252 } 253 254 255 /** 256 * @brief Adds a parameter to the parameter list 257 * @param fFloat float to be added as parameter for a function. 258 * 259 */ 260 void LuaScript::addParam (float fFloat) 261 { 262 assert (virtualMachine.isOk () && "VM Not OK"); 263 264 BEGIN_LUA_CHECK (virtualMachine) 265 lua_pushnumber (state, (lua_Number) fFloat); 266 ++argumentCount; 267 END_LUA_CHECK 268 } 269 270 271 /** 272 * @brief Runs the selected script function 273 * @param nReturns the count of return values 274 * 275 * @return true on success 276 */ 277 bool LuaScript::run (int nReturns /* = 0 */) 278 { 279 assert (virtualMachine.isOk () && "VM Not OK"); 280 281 // At this point there should be a parameters and a function on the 282 // Lua stack. Each function get a "this" parameter as default and is 283 // pushed onto the stack when the method is selected 284 285 bool fSuccess = virtualMachine.callFunction (argumentCount + 1, nReturns); 286 287 if (fSuccess == true && nReturns > 0) 288 { 285 289 // Check for returns 286 handleReturns (virtualMachine, functionName);287 lua_pop ((lua_State *) virtualMachine, nReturns);288 }289 290 return fSuccess;291 }292 293 294 /**295 * @brief This function adds an object to a script so that the object is accessable from within the luascript.296 *297 * @param scriptable the scriptable object to add.298 * @param strObjName the name that the object goes by in the script.299 * @param luaScript the script to which the scrtiptable is added300 *301 * @return a lua reference to the added object302 *303 *304 *305 */306 307 int LuaScript::addScriptableToScript(Scriptable* scriptable, const std::string& strObjName)308 {309 310 lua_State *state = (lua_State *) (this->virtualMachine);311 312 if(strObjName.compare(std::string("this")) != 0)313 {314 if (virtualMachine.isOk ())315 {316 /*create object table*/317 // Create a reference to the "object" table and set a name for the reference. Each reference is unique318 319 lua_newtable (state);320 int objRef = luaL_ref (state, LUA_REGISTRYINDEX);321 lua_rawgeti (state, LUA_REGISTRYINDEX, objRef);322 lua_setglobal (state, strObjName.c_str());323 324 325 // Save the "object" table to index 0 of the "object" table326 LuaRestoreStack rs(virtualMachine);327 lua_rawgeti (state, LUA_REGISTRYINDEX, objRef);328 lua_pushlightuserdata (state, scriptable);329 lua_rawseti (state, -2, 0);330 331 if(! addScriptableToList(scriptable,objRef))332 std::cout<<"scriptable not added"<<std::endl;333 if(!(scriptable->scriptableAdded(this,thisReference,objRef)))334 std::cout<<"scriptableAdded returned false"<<std::endl;335 336 return objRef;337 }338 }339 340 return -1;341 342 }343 344 345 346 /**347 * @brief Add the function to a scriptable in the Script348 * @param strFuncName name of the function by which it goes by in lua349 * @param toScriptable reference to the scriptable the function should be associated with350 * @param methodIndex index of the last function.351 *352 * @return the pseudoindex of the function, -1 on failure353 */354 355 int LuaScript::addFunctionToScriptable(const std::string& strFuncName, int toScriptable, int lastMethodIndex)356 {357 // assert (strFuncName != NULL && "LuaScript::registerFunction -> strFuncName == NULL");358 assert (virtualMachine.isOk () && "VM Not OK");359 360 361 //get the last method index from the Script362 Scriptable* scriptable = getScriptableByReference(toScriptable);363 int iMethodIdx = -1;364 365 if(scriptable)366 {367 LuaRestoreStack rs (virtualMachine);368 369 BEGIN_LUA_CHECK (virtualMachine)370 // Register a function with the lua script. Added it to the "toScrtiptable" table371 lua_rawgeti (state, LUA_REGISTRYINDEX, toScriptable);372 373 if (lua_istable (state, 1))374 {375 iMethodIdx = ++lastMethodIndex;376 377 // Push the function and parameters378 lua_pushstring (state, strFuncName.c_str());379 lua_pushnumber (state, (lua_Number) iMethodIdx);380 lua_pushcclosure (state, luaCallback, 1);381 lua_settable (state, -3);382 }383 END_LUA_CHECK384 385 }386 387 }388 389 390 Scriptable* LuaScript::getScriptableByReference(int scrptblRef)391 {392 393 290 handleReturns (virtualMachine, functionName); 291 lua_pop ((lua_State *) virtualMachine, nReturns); 292 } 293 294 return fSuccess; 295 } 296 297 298 /** 299 * @brief This function adds an object to a script so that the object is accessable from within the luascript. 300 * 301 * @param scriptable the scriptable object to add. 302 * @param strObjName the name that the object goes by in the script. 303 * @param luaScript the script to which the scrtiptable is added 304 * 305 * @return a lua reference to the added object 306 * 307 * 308 * 309 */ 310 311 int LuaScript::addScriptableToScript(Scriptable* scriptable, const std::string& strObjName) 312 { 313 314 lua_State *state = (lua_State *) (this->virtualMachine); 315 316 if(strObjName.compare(std::string("this")) != 0) 317 { 318 if (virtualMachine.isOk ()) 319 { 320 /*create object table*/ 321 // Create a reference to the "object" table and set a name for the reference. Each reference is unique 322 323 lua_newtable (state); 324 int objRef = luaL_ref (state, LUA_REGISTRYINDEX); 325 lua_rawgeti (state, LUA_REGISTRYINDEX, objRef); 326 lua_setglobal (state, strObjName.c_str()); 327 328 329 // Save the "object" table to index 0 of the "object" table 330 LuaRestoreStack rs(virtualMachine); 331 lua_rawgeti (state, LUA_REGISTRYINDEX, objRef); 332 lua_pushlightuserdata (state, scriptable); 333 lua_rawseti (state, -2, 0); 334 335 if(! addScriptableToList(scriptable,objRef)) 336 std::cout<<"scriptable not added"<<std::endl; 337 if(!(scriptable->scriptableAdded(this,thisReference,objRef))) 338 std::cout<<"scriptableAdded returned false"<<std::endl; 339 340 return objRef; 341 } 342 } 343 344 return -1; 345 346 } 347 348 349 350 /** 351 * @brief Add the function to a scriptable in the Script 352 * @param strFuncName name of the function by which it goes by in lua 353 * @param toScriptable reference to the scriptable the function should be associated with 354 * @param methodIndex index of the last function. 355 * 356 * @return the pseudoindex of the function, -1 on failure 357 */ 358 359 int LuaScript::addFunctionToScriptable(const std::string& strFuncName, int toScriptable, int lastMethodIndex) 360 { 361 // assert (strFuncName != NULL && "LuaScript::registerFunction -> strFuncName == NULL"); 362 assert (virtualMachine.isOk () && "VM Not OK"); 363 364 365 //get the last method index from the Script 366 Scriptable* scriptable = getScriptableByReference(toScriptable); 367 int iMethodIdx = -1; 368 369 if(scriptable) 370 { 371 LuaRestoreStack rs (virtualMachine); 372 373 BEGIN_LUA_CHECK (virtualMachine) 374 // Register a function with the lua script. Added it to the "toScrtiptable" table 375 lua_rawgeti (state, LUA_REGISTRYINDEX, toScriptable); 376 377 if (lua_istable (state, 1)) 378 { 379 iMethodIdx = ++lastMethodIndex; 380 381 // Push the function and parameters 382 lua_pushstring (state, strFuncName.c_str()); 383 lua_pushnumber (state, (lua_Number) iMethodIdx); 384 lua_pushcclosure (state, luaCallback, 1); 385 lua_settable (state, -3); 386 } 387 END_LUA_CHECK 388 389 } 390 return iMethodIdx; 391 } 392 393 394 Scriptable* LuaScript::getScriptableByReference(int scrptblRef) 395 { 396 397 bool notFound = true; 394 398 std::list<Scrptbl>::iterator it = scriptableList.begin(); 395 399 … … 406 410 407 411 if(notFound) 408 return NULL;409 410 }411 412 int LuaScript::getReferenceByScriptable(Scriptable* scrptbl)413 {414 bool notFound = true;412 return NULL; 413 414 } 415 416 int LuaScript::getReferenceByScriptable(Scriptable* scrptbl) 417 { 418 bool notFound = true; 415 419 416 420 std::list<Scrptbl>::iterator it = scriptableList.begin(); … … 424 428 } 425 429 it++; 426 } 427 if(notFound) 428 return -1; 430 } 431 if(notFound) 432 return -1; 433 } 434 435 bool LuaScript::addScriptableToList(Scriptable* scrptbl, int scriptableRef) 436 { 437 if(scrptbl) 438 { 439 if(getReferenceByScriptable(scrptbl) == -1) // Script isn't there yet 440 { 441 Scrptbl scriptableTmp; 442 scriptableTmp.scriptable = scrptbl; 443 scriptableTmp.scriptableRef = scriptableRef; 444 scriptableList.push_back(scriptableTmp); 445 return true; 446 } 447 } 448 449 return false; 450 451 } 452 453 bool LuaScript::removeScriptableFromList(Scriptable* toRemove) 454 { 455 if(toRemove) 456 { 457 int scrptbl = getReferenceByScriptable(toRemove); 458 459 if(scrptbl != -1)// if the scriptable is on the list 460 { 461 std::list<Scrptbl>::iterator it = scriptableList.begin(); 462 463 while((*it).scriptable != toRemove && it != scriptableList.end() ) 464 { 465 it++; 466 } 467 468 if(it != scriptableList.end()) 469 { 470 scriptableList.erase(it); 471 return true; 472 } 473 } 474 } 475 return false; 476 } 477 478 bool LuaScript::removeScriptableFromList(int scriptable) 479 { 480 return removeScriptableFromList(getScriptableByReference(scriptable)); 481 } 482 483 484 char LuaScript::whatIsThis() 485 { 486 char result = 'l'; 487 return result; 488 } 429 489 } 430 490 431 bool LuaScript::addScriptableToList(Scriptable* scrptbl, int scriptableRef)432 {433 if(scrptbl)434 {435 if(getReferenceByScriptable(scrptbl) == -1) // Script isn't there yet436 {437 Scrptbl scriptableTmp;438 scriptableTmp.scriptable = scrptbl;439 scriptableTmp.scriptableRef = scriptableRef;440 scriptableList.push_back(scriptableTmp);441 return true;442 }443 }444 445 return false;446 447 }448 449 bool LuaScript::removeScriptableFromList(Scriptable* toRemove)450 {451 if(toRemove)452 {453 int scrptbl = getReferenceByScriptable(toRemove);454 455 if(scrptbl != -1)// if the scriptable is on the list456 {457 std::list<Scrptbl>::iterator it = scriptableList.begin();458 459 while((*it).scriptable != toRemove && it != scriptableList.end() )460 {461 it++;462 }463 464 if(it != scriptableList.end())465 {466 scriptableList.erase(it);467 return true;468 }469 }470 }471 return false;472 }473 474 bool LuaScript::removeScriptableFromList(int scriptable)475 {476 return removeScriptableFromList(getScriptableByReference(scriptable));477 }478 479 480 char LuaScript::whatIsThis()481 {482 char result = 'l';483 return result;484 }485 -
branches/script_engine/src/lib/script_engine/Script.h
r7645 r7653 8 8 #include "scriptable.h" 9 9 10 namespace OrxScript 11 { 10 12 11 struct Scrptbl12 {13 Scriptable* scriptable;14 int scriptableRef;15 };13 struct Scrptbl 14 { 15 Scriptable* scriptable; 16 int scriptableRef; 17 }; 16 18 17 class LuaScript18 {19 class LuaScript 20 { 19 21 public: 20 22 LuaScript (); … … 26 28 /* ------------------ Script related Functions ------------------ */ 27 29 28 // Compile script into Virtual Machine30 // Compile script into Virtual Machine 29 31 bool compileFile (const std::string& strFilename); 30 32 bool compileBuffer (unsigned char *pbBuffer, size_t szLen); 31 33 32 // Register function with Lua in the this table34 // Register function with Lua in the this table 33 35 int registerFunction (const std::string& strFuncName); 34 36 35 37 36 // Selects a Lua Script function to call38 // Selects a Lua Script function to call 37 39 bool selectScriptFunction (const std::string& strFuncName); 38 40 void addParam (int iInt); … … 40 42 void addParam (char *string); 41 43 42 // Runs the loaded script44 // Runs the loaded script 43 45 bool run (int nReturns = 0); 44 46 45 // Checks on Virtual Machine script47 // Checks on Virtual Machine script 46 48 bool scriptHasFunction (const std::string& strScriptName); 47 49 48 // Method indexing check50 // Method indexing check 49 51 int methods (void) { return methodCount; } 50 52 51 53 52 // When the script calls a class method, this is called54 // When the script calls a class method, this is called 53 55 virtual int scriptCalling (LuaVirtualMachine& vm, int iFunctionNumber) = 0; 54 56 55 // When the script function has returns57 // When the script function has returns 56 58 virtual void handleReturns (LuaVirtualMachine& vm, const std::string& strFunc) = 0; 57 59 … … 60 62 /* ------------------- Handle external Objects ------------------ */ 61 63 62 void removeFromScript(int referenceToScriptable){}63 int addScriptableToScript(Scriptable* scriptbl,const std::string& name); // name= name the scriptable goes by in lua64 int addFunctionToScriptable(const std::string& strFuncName, int toScriptable, int lastMethodIndex);64 void removeFromScript(int referenceToScriptable){} 65 int addScriptableToScript(Scriptable* scriptbl,const std::string& name); // name= name the scriptable goes by in lua 66 int addFunctionToScriptable(const std::string& strFuncName, int toScriptable, int lastMethodIndex); 65 67 66 //Handle the Scriptable List67 Scriptable* getScriptableByReference(int scrptblRef);68 int getReferenceByScriptable(Scriptable* scriptable);69 bool addScriptableToList(Scriptable* scriptbl, int scriptableRef);70 bool removeScriptableFromList(Scriptable* scriptable);71 bool removeScriptableFromList(int scriptable);68 //Handle the Scriptable List 69 Scriptable* getScriptableByReference(int scrptblRef); 70 int getReferenceByScriptable(Scriptable* scriptable); 71 bool addScriptableToList(Scriptable* scriptbl, int scriptableRef); 72 bool removeScriptableFromList(Scriptable* scriptable); 73 bool removeScriptableFromList(int scriptable); 72 74 73 75 … … 85 87 std::string functionName; 86 88 std::list<Scrptbl> scriptableList; 87 };89 }; 88 90 91 } 89 92 90 93 #endif // __LUA_SCRIPT_BASE_H__ -
branches/script_engine/src/lib/script_engine/This.h
r7645 r7653 6 6 7 7 // Sets the "this" global table that scripts use 8 namespace OrxScript 9 { 8 10 9 class LuaThis10 {11 class LuaThis 12 { 11 13 public: 12 14 LuaThis (LuaVirtualMachine& vm, int iRef) : oldReference (0), virtualMachine (vm) … … 15 17 if (vm.isOk ()) 16 18 { 17 19 // Save the old "this" table 18 20 lua_getglobal (state, "this"); 19 21 oldReference = luaL_ref (state, LUA_REGISTRYINDEX); 20 22 21 23 // replace it with our new one 22 24 lua_rawgeti(state, LUA_REGISTRYINDEX, iRef); 23 25 lua_setglobal (state, "this"); … … 30 32 if (oldReference > 0 && virtualMachine.isOk ()) 31 33 { 32 34 // Replace the old "this" table 33 35 lua_rawgeti(state, LUA_REGISTRYINDEX, oldReference); 34 36 lua_setglobal (state, "this"); … … 41 43 int oldReference; 42 44 LuaVirtualMachine& virtualMachine; 43 };44 45 }; 46 } 45 47 #endif // __THIS_H__ -
branches/script_engine/src/lib/script_engine/VirtualMachine.cc
r7645 r7653 5 5 #include "luaincl.h" 6 6 #include "VirtualMachine.h" 7 // --------------------------------------------------------------------------- 8 9 10 //============================================================================ 11 // int printMessage 12 //--------------------------------------------------------------------------- 13 // Prints a message to the console 14 // 15 // Parameter Dir Description 16 // --------- --- ----------- 17 // lua IN State variable 18 // 19 // Return 20 // ------ 21 // Number of return varaibles on the stack 22 // 23 //============================================================================ 24 static int printMessage (lua_State *lua) 7 namespace OrxScript 25 8 { 26 assert (lua_isstring (lua,1)); 27 28 const char *msg = lua_tostring (lua, 1); 29 30 // get caller 31 lua_Debug ar; 32 memset (&ar, 0, sizeof(ar)); 33 lua_getstack (lua, 1, &ar); 34 lua_getinfo (lua, "Snl", &ar); 35 36 // debug output 37 const char *str = ar.source; 38 printf ("script: %s -- at %s(%d)\n", msg, str, ar.currentline); 39 return 0; 9 // --------------------------------------------------------------------------- 10 11 12 //============================================================================ 13 // int printMessage 14 //--------------------------------------------------------------------------- 15 // Prints a message to the console 16 // 17 // Parameter Dir Description 18 // --------- --- ----------- 19 // lua IN State variable 20 // 21 // Return 22 // ------ 23 // Number of return varaibles on the stack 24 // 25 //============================================================================ 26 static int printMessage (lua_State *lua) 27 { 28 assert (lua_isstring (lua,1)); 29 30 const char *msg = lua_tostring (lua, 1); 31 32 // get caller 33 lua_Debug ar; 34 memset (&ar, 0, sizeof(ar)); 35 lua_getstack (lua, 1, &ar); 36 lua_getinfo (lua, "Snl", &ar); 37 38 // debug output 39 const char *str = ar.source; 40 printf ("script: %s -- at %s(%d)\n", msg, str, ar.currentline); 41 return 0; 42 } 43 44 //============================================================================ 45 // LuaVirtualMachine::LuaVirtualMachine 46 //--------------------------------------------------------------------------- 47 // Constructor. Setups the default VM state 48 // 49 // Parameter Dir Description 50 // --------- --- ----------- 51 // 52 // 53 // Return 54 // ------ 55 // None. 56 // 57 //============================================================================ 58 LuaVirtualMachine::LuaVirtualMachine (void) : luaState (NULL) 59 { 60 machineIsOk = false; 61 } 62 63 //============================================================================ 64 // LuaVirtualMachine::LuaVirtualMachine 65 //--------------------------------------------------------------------------- 66 // Destructor. Closes the VM 67 // 68 // Parameter Dir Description 69 // --------- --- ----------- 70 // 71 // 72 // Return 73 // ------ 74 // None. 75 // 76 //============================================================================ 77 LuaVirtualMachine::~LuaVirtualMachine (void) 78 { 79 if (luaState != NULL) 80 { 81 lua_close (luaState); 82 } 83 } 84 85 //============================================================================ 86 // LuaVirtualMachine::Panic 87 //--------------------------------------------------------------------------- 88 // When things in Lua go wrong (ever called in protected mode??) 89 // 90 // Parameter Dir Description 91 // --------- --- ----------- 92 // lua IN State variable 93 // 94 // Return 95 // ------ 96 // None. 97 // 98 //============================================================================ 99 void LuaVirtualMachine::panic (lua_State *lua) 100 {} 101 102 //============================================================================ 103 // bool LuaVirtualMachine::init 104 //--------------------------------------------------------------------------- 105 // Initialises the VM, open lua, makes sure things are OK 106 // 107 // Parameter Dir Description 108 // --------- --- ----------- 109 // None. 110 // 111 // Return 112 // ------ 113 // Success. 114 // 115 //============================================================================ 116 bool LuaVirtualMachine::init (void) 117 { 118 // Open Lua! 119 if (isOk ()) destroy (); 120 121 luaState = lua_open (); 122 123 if (luaState) 124 { 125 machineIsOk = true; 126 127 // Load util libs into lua 128 luaopen_base (luaState); 129 luaopen_table (luaState); 130 luaopen_string (luaState); 131 luaopen_math (luaState); 132 luaopen_debug (luaState); 133 luaopen_io (luaState); 134 luaopen_loadlib (luaState); 135 136 // setup global printing (trace) 137 lua_pushcclosure (luaState, printMessage, 0); 138 lua_setglobal (luaState, "trace"); 139 140 lua_atpanic (luaState, (lua_CFunction) LuaVirtualMachine::panic); 141 142 return true; 143 } 144 145 return false; 146 } 147 148 //============================================================================ 149 // bool LuaVirtualMachine::destroy 150 //--------------------------------------------------------------------------- 151 // Clears the current Lua state 152 // 153 // Parameter Dir Description 154 // --------- --- ----------- 155 // None. 156 // 157 // Return 158 // ------ 159 // Success. 160 // 161 //============================================================================ 162 bool LuaVirtualMachine::destroy (void) 163 { 164 if (luaState) 165 { 166 lua_close (luaState); 167 luaState = NULL; 168 machineIsOk = false; 169 } 170 return true; 171 } 172 173 174 //============================================================================ 175 // bool LuaVirtualMachine::runFile 176 //--------------------------------------------------------------------------- 177 // Compiles and runs a lua script file 178 // 179 // Parameter Dir Description 180 // --------- --- ----------- 181 // strFilename IN Filename to compile and run 182 // 183 // Return 184 // ------ 185 // Success. 186 // 187 //============================================================================ 188 bool LuaVirtualMachine::runFile (const std::string& strFilename) 189 { 190 bool fSuccess = false; 191 int iErr = 0; 192 193 if ((iErr = luaL_loadfile (luaState, strFilename.c_str())) == 0) 194 { 195 // Call main... 196 if ((iErr = lua_pcall (luaState, 0, LUA_MULTRET, 0)) == 0) 197 { 198 fSuccess = true; 199 } 200 } 201 202 /* if (fSuccess == false) 203 { 204 if (m_pDbg != NULL) m_pDbg->ErrorRun (iErr); 205 } 206 */ 207 return fSuccess; 208 } 209 210 //============================================================================ 211 // bool LuaVirtualMachine::runBuffer 212 //--------------------------------------------------------------------------- 213 // Compiles and runs a pre-compiled data buffer 214 // 215 // Parameter Dir Description 216 // --------- --- ----------- 217 // pbBuffer IN Buffer to run 218 // szLen IN Length of buffer 219 // strName IN Name of Buffer 220 // 221 // Return 222 // ------ 223 // Success. 224 // 225 //============================================================================ 226 bool LuaVirtualMachine::runBuffer (const unsigned char *pbBuffer, size_t szLen, const char *strName /* = NULL */) 227 { 228 bool fSuccess = false; 229 int iErr = 0; 230 231 if (strName == NULL) 232 { 233 strName = "Temp"; 234 } 235 236 if ((iErr = luaL_loadbuffer (luaState, (const char *) pbBuffer, szLen, strName)) == 0) 237 { 238 // Call main... 239 if ((iErr = lua_pcall (luaState, 0, LUA_MULTRET, 0)) == 0) 240 { 241 fSuccess = true; 242 } 243 } 244 245 /* if (fSuccess == false) 246 { 247 if (m_pDbg != NULL) m_pDbg->ErrorRun (iErr); 248 } 249 */ 250 return fSuccess; 251 252 } 253 254 //============================================================================ 255 // LuaVirtualMachine::callFunction 256 //--------------------------------------------------------------------------- 257 // Calls a function that is already on the stack 258 // 259 // Parameter Dir Description 260 // --------- --- ----------- 261 // nArgs IN Args that are aleady on the stack 262 // nReturns IN Number of expected returns (will be on the stack) 263 // 264 // Return 265 // ------ 266 // Success. 267 // 268 //============================================================================ 269 bool LuaVirtualMachine::callFunction (int nArgs, int nReturns /* = 0 */) 270 { 271 bool fSuccess = false; 272 273 if (lua_isfunction (luaState, -nArgs-1)) 274 { 275 int iErr = 0; 276 iErr = lua_pcall (luaState, nArgs, nReturns, 0); 277 278 if (iErr == 0) 279 { 280 fSuccess = true; 281 } 282 /*else 283 { 284 if (m_pDbg != NULL) m_pDbg->ErrorRun (iErr); 285 } 286 */ 287 } 288 289 return fSuccess; 290 } 40 291 } 41 42 //============================================================================43 // LuaVirtualMachine::LuaVirtualMachine44 //---------------------------------------------------------------------------45 // Constructor. Setups the default VM state46 //47 // Parameter Dir Description48 // --------- --- -----------49 //50 //51 // Return52 // ------53 // None.54 //55 //============================================================================56 LuaVirtualMachine::LuaVirtualMachine (void) : luaState (NULL)57 {58 machineIsOk = false;59 }60 61 //============================================================================62 // LuaVirtualMachine::LuaVirtualMachine63 //---------------------------------------------------------------------------64 // Destructor. Closes the VM65 //66 // Parameter Dir Description67 // --------- --- -----------68 //69 //70 // Return71 // ------72 // None.73 //74 //============================================================================75 LuaVirtualMachine::~LuaVirtualMachine (void)76 {77 if (luaState != NULL)78 {79 lua_close (luaState);80 }81 }82 83 //============================================================================84 // LuaVirtualMachine::Panic85 //---------------------------------------------------------------------------86 // When things in Lua go wrong (ever called in protected mode??)87 //88 // Parameter Dir Description89 // --------- --- -----------90 // lua IN State variable91 //92 // Return93 // ------94 // None.95 //96 //============================================================================97 void LuaVirtualMachine::panic (lua_State *lua)98 {99 }100 101 //============================================================================102 // bool LuaVirtualMachine::init103 //---------------------------------------------------------------------------104 // Initialises the VM, open lua, makes sure things are OK105 //106 // Parameter Dir Description107 // --------- --- -----------108 // None.109 //110 // Return111 // ------112 // Success.113 //114 //============================================================================115 bool LuaVirtualMachine::init (void)116 {117 // Open Lua!118 if (isOk ()) destroy ();119 120 luaState = lua_open ();121 122 if (luaState)123 {124 machineIsOk = true;125 126 // Load util libs into lua127 luaopen_base (luaState);128 luaopen_table (luaState);129 luaopen_string (luaState);130 luaopen_math (luaState);131 luaopen_debug (luaState);132 luaopen_io (luaState);133 luaopen_loadlib (luaState);134 135 // setup global printing (trace)136 lua_pushcclosure (luaState, printMessage, 0);137 lua_setglobal (luaState, "trace");138 139 lua_atpanic (luaState, (lua_CFunction) LuaVirtualMachine::panic);140 141 return true;142 }143 144 return false;145 }146 147 //============================================================================148 // bool LuaVirtualMachine::destroy149 //---------------------------------------------------------------------------150 // Clears the current Lua state151 //152 // Parameter Dir Description153 // --------- --- -----------154 // None.155 //156 // Return157 // ------158 // Success.159 //160 //============================================================================161 bool LuaVirtualMachine::destroy (void)162 {163 if (luaState)164 {165 lua_close (luaState);166 luaState = NULL;167 machineIsOk = false;168 }169 return true;170 }171 172 173 //============================================================================174 // bool LuaVirtualMachine::runFile175 //---------------------------------------------------------------------------176 // Compiles and runs a lua script file177 //178 // Parameter Dir Description179 // --------- --- -----------180 // strFilename IN Filename to compile and run181 //182 // Return183 // ------184 // Success.185 //186 //============================================================================187 bool LuaVirtualMachine::runFile (const std::string& strFilename)188 {189 bool fSuccess = false;190 int iErr = 0;191 192 if ((iErr = luaL_loadfile (luaState, strFilename.c_str())) == 0)193 {194 // Call main...195 if ((iErr = lua_pcall (luaState, 0, LUA_MULTRET, 0)) == 0)196 {197 fSuccess = true;198 }199 }200 201 /* if (fSuccess == false)202 {203 if (m_pDbg != NULL) m_pDbg->ErrorRun (iErr);204 }205 */206 return fSuccess;207 }208 209 //============================================================================210 // bool LuaVirtualMachine::runBuffer211 //---------------------------------------------------------------------------212 // Compiles and runs a pre-compiled data buffer213 //214 // Parameter Dir Description215 // --------- --- -----------216 // pbBuffer IN Buffer to run217 // szLen IN Length of buffer218 // strName IN Name of Buffer219 //220 // Return221 // ------222 // Success.223 //224 //============================================================================225 bool LuaVirtualMachine::runBuffer (const unsigned char *pbBuffer, size_t szLen, const char *strName /* = NULL */)226 {227 bool fSuccess = false;228 int iErr = 0;229 230 if (strName == NULL)231 {232 strName = "Temp";233 }234 235 if ((iErr = luaL_loadbuffer (luaState, (const char *) pbBuffer, szLen, strName)) == 0)236 {237 // Call main...238 if ((iErr = lua_pcall (luaState, 0, LUA_MULTRET, 0)) == 0)239 {240 fSuccess = true;241 }242 }243 244 /* if (fSuccess == false)245 {246 if (m_pDbg != NULL) m_pDbg->ErrorRun (iErr);247 }248 */249 return fSuccess;250 251 }252 253 //============================================================================254 // LuaVirtualMachine::callFunction255 //---------------------------------------------------------------------------256 // Calls a function that is already on the stack257 //258 // Parameter Dir Description259 // --------- --- -----------260 // nArgs IN Args that are aleady on the stack261 // nReturns IN Number of expected returns (will be on the stack)262 //263 // Return264 // ------265 // Success.266 //267 //============================================================================268 bool LuaVirtualMachine::callFunction (int nArgs, int nReturns /* = 0 */)269 {270 bool fSuccess = false;271 272 if (lua_isfunction (luaState, -nArgs-1))273 {274 int iErr = 0;275 iErr = lua_pcall (luaState, nArgs, nReturns, 0);276 277 if (iErr == 0)278 {279 fSuccess = true;280 }281 /*else282 {283 if (m_pDbg != NULL) m_pDbg->ErrorRun (iErr);284 }285 */286 }287 288 return fSuccess;289 } -
branches/script_engine/src/lib/script_engine/VirtualMachine.h
r7645 r7653 5 5 6 6 #include "luaincl.h" 7 8 class LuaVirtualMachine 7 namespace OrxScript 9 8 { 9 class LuaVirtualMachine 10 { 10 11 public: 11 12 LuaVirtualMachine (void); … … 15 16 bool destroy (void); 16 17 17 // Load and run script elements18 // Load and run script elements 18 19 bool runFile (const std::string& strFilename); 19 20 bool runBuffer (const unsigned char *pbBuffer, size_t szLen, const char *strName = NULL); 20 21 21 // C-Api into script22 // C-Api into script 22 23 bool callFunction (int nArgs, int nReturns = 0); 23 24 24 // Get the state of the lua stack (use the cast operator)25 //lua_State *GetState (void) { return luaState; }25 // Get the state of the lua stack (use the cast operator) 26 //lua_State *GetState (void) { return luaState; } 26 27 operator lua_State *(void) { return luaState; } 27 28 28 29 static void panic (lua_State *lua); 29 30 30 // Check if the VM is OK and can be used still31 // Check if the VM is OK and can be used still 31 32 virtual bool isOk (void) { return machineIsOk; } 32 33 33 // For debugging34 // For debugging 34 35 //void AttachDebugger (CLuaDebugger *dbg) { m_pDbg = dbg; } 35 36 … … 37 38 lua_State* luaState; 38 39 bool machineIsOk; 39 // CLuaDebugger *m_pDbg; 40 }; 40 // CLuaDebugger *m_pDbg; 41 }; 42 } 41 43 #endif -
branches/script_engine/src/lib/script_engine/main.cc
r7645 r7653 13 13 14 14 15 15 using namespace OrxScript; 16 16 17 17 //HACK !!! -
branches/script_engine/src/lib/script_engine/scriptable.cc
r7645 r7653 9 9 10 10 // --------------------------------------------------------------------------- 11 12 /** 13 * @brief Constructor 14 * 15 */ 16 Scriptable::Scriptable () 11 namespace OrxScript 17 12 { 18 19 } 20 21 /** 22 * @brief Deconstructor 23 * 24 * The Deconstructor tells all the scripts, that it is part of, that it is deleted. 25 * 26 */ 27 Scriptable::~Scriptable (void) 28 { 29 std::list<Script>::iterator it; 30 for(it = scriptList.begin();it != scriptList.end(); it++) 31 { 32 (*it).script->removeFromScript((*it).thisReference); 33 } 34 35 } 36 37 38 //Method indexing check 39 int Scriptable::methods (LuaVirtualMachine& virtualMachine) 40 { 41 LuaScript* script =(getScriptByVirtualMachine(virtualMachine))->script; 13 /** 14 * @brief Constructor 15 * 16 */ 17 Scriptable::Scriptable () 18 { 19 } 20 21 /** 22 * @brief Deconstructor 23 * 24 * The Deconstructor tells all the scripts, that it is part of, that it is deleted. 25 * 26 */ 27 Scriptable::~Scriptable (void) 28 { 29 std::list<Script>::iterator it; 30 for(it = scriptList.begin();it != scriptList.end(); it++) 31 { 32 (*it).script->removeFromScript((*it).thisReference); 33 } 34 35 } 36 37 38 //Method indexing check 39 int Scriptable::methods (LuaVirtualMachine& virtualMachine) 40 { 41 LuaScript* script =(getScriptByVirtualMachine(virtualMachine))->script; 42 if(script) 43 { 44 int lastMethod = getLastMethodIndexByPointer(script); 45 if(lastMethod != -1) 46 return lastMethod; 47 } 48 49 return -1; 50 } 51 52 53 /** 54 * @brief Tells the scriptable that it got added to a script 55 * @param toScript a pointer to the script the object got added 56 * @param 57 * @param reference a reference to the scriptable in that partilular script 58 * 59 * The scriptable will register all its functions to the table at "reference" 60 * with the script. 61 * 62 */ 63 64 bool Scriptable::scriptableAdded(LuaScript* toScript, int toScriptRef, int reference) 65 { 66 67 bool success = true ; 68 if(!scriptIsInScriptList(toScript))// look if the scriptable isn't already added. 69 if(toScript) 70 { 71 Script newScript; 72 newScript.script = toScript; 73 newScript.scriptReference = toScriptRef; 74 newScript.thisReference = reference; 75 newScript.lastMethodIndex = -1; 76 newScript.methodBase = -1; 77 78 scriptList.push_back(newScript); 79 80 int methodIndex; 81 Script* tmpScript = getScriptByPointer(toScript); 82 83 //add all the functions to the script 84 std::list<std::string>::const_iterator it; 85 86 for(it = functionList.begin();it != functionList.end(); it++) 87 { 88 89 if(tmpScript) 90 { 91 methodIndex = toScript->addFunctionToScriptable(*it, tmpScript->thisReference, tmpScript->lastMethodIndex); 92 93 94 if(newScript.methodBase = -1) 95 { 96 if(methodIndex != -1) 97 { 98 std::cout<<"methodIndex is "<<methodIndex<<std::endl; 99 tmpScript->methodBase= methodIndex; 100 tmpScript->lastMethodIndex= methodIndex; 101 tmpScript->functionMap[newScript.methodBase] = *it; 102 } 103 else{success = false; break;} 104 } 105 106 else if(methodIndex != -1) 107 { 108 109 tmpScript->lastMethodIndex = methodIndex; 110 tmpScript->functionMap[newScript.lastMethodIndex] = *it; 111 } 112 else{success= false;break;} 113 114 } 115 } 116 117 118 119 } 120 else 121 { 122 success = false; 123 } 124 125 return success; 126 127 } 128 129 130 131 /** 132 * @brief Register a function with the scriptable 133 * @param functionName function name 134 * 135 * 136 */ 137 138 void Scriptable::registerFunction(std::string functionName) 139 { 140 //check whether the function is already registered 141 std::list<std::string>::iterator it; 142 for(it = functionList.begin();it != functionList.end(); it++) 143 { 144 if((*it).compare(functionName) == 0) 145 { 146 break; 147 } 148 149 } 150 151 if(it == functionList.end()) // if the functoin wasn't found 152 functionList.push_back(functionName); 153 } 154 155 156 /** 157 * @brief Get the function name of the function at index 158 * @param index 159 * 160 * @return the function name on success. 161 * 162 * This function is used in the ScriptCalling function 163 */ 164 std::string Scriptable::getFunctionAtIndex(int index, LuaVirtualMachine& virtualMachine) 165 { 166 lua_State * luaState = (lua_State* ) virtualMachine; 167 168 if(virtualMachine.isOk()) 169 { 170 lua_getglobal (luaState, "this"); 171 172 if (lua_istable (luaState, 1)) 173 { 174 // Found the "this" table. The object pointer is at the index 0 175 lua_rawgeti (luaState, 1, 0); 176 177 if (lua_islightuserdata (luaState, -1)) 178 { 179 // Found the pointer, need to cast it 180 LuaScript* thisPointer = (LuaScript *) lua_touserdata (luaState, -1); 181 182 if(thisPointer != NULL) 183 { 184 Script* script = getScriptByPointer(thisPointer); 185 if( script != NULL) 186 { 187 std::map<int, std::string>::const_iterator it = script->functionMap.find(index); 188 if(it != script->functionMap.end())//if found 189 return script->functionMap[index]; 190 } 191 192 } 193 } 194 } 195 } 196 197 } 198 199 200 /** 201 * @brief Gets the lastMethod index associated with the LuaScript 202 * @param the luaScript 203 * 204 * @return A lua reference to the last function of the Scriptable 205 * 206 * 207 */ 208 209 int Scriptable::getLastMethodIndexByPointer(LuaScript* luaScript) 210 { 211 if( luaScript ) 212 { 213 Script* script = (getScriptByPointer(luaScript)); 42 214 if(script) 43 215 { 44 int lastMethod = getLastMethodIndexByPointer(script); 45 if(lastMethod != -1) 46 return lastMethod; 47 } 48 49 return -1; 50 } 51 52 53 /** 54 * @brief Tells the scriptable that it got added to a script 55 * @param toScript a pointer to the script the object got added 56 * @param 57 * @param reference a reference to the scriptable in that partilular script 58 * 59 * The scriptable will register all its functions to the table at "reference" 60 * with the script. 61 * 62 */ 63 64 bool Scriptable::scriptableAdded(LuaScript* toScript, int toScriptRef, int reference) 65 { 66 67 bool success = true ; 68 if(!scriptIsInScriptList(toScript))// look if the scriptable isn't already added. 69 if(toScript) 70 { 71 Script newScript; 72 newScript.script = toScript; 73 newScript.scriptReference = toScriptRef; 74 newScript.thisReference = reference; 75 newScript.lastMethodIndex = -1; 76 newScript.methodBase = -1; 77 78 scriptList.push_back(newScript); 79 80 int methodIndex; 81 Script* tmpScript = getScriptByPointer(toScript); 82 83 //add all the functions to the script 84 std::list<std::string>::const_iterator it; 85 86 for(it = functionList.begin();it != functionList.end(); it++) 87 { 88 89 if(tmpScript) 90 { 91 methodIndex = toScript->addFunctionToScriptable(*it, tmpScript->thisReference, tmpScript->lastMethodIndex); 92 93 94 if(newScript.methodBase = -1) 95 { 96 if(methodIndex != -1) 97 { 98 std::cout<<"methodIndex is "<<methodIndex<<std::endl; 99 tmpScript->methodBase= methodIndex; 100 tmpScript->lastMethodIndex= methodIndex; 101 tmpScript->functionMap[newScript.methodBase] = *it; 102 } 103 else{success = false; break;} 104 } 105 106 else if(methodIndex != -1) 107 { 108 109 tmpScript->lastMethodIndex = methodIndex; 110 tmpScript->functionMap[newScript.lastMethodIndex] = *it; 111 } 112 else{success= false;break;} 113 114 } 115 } 116 117 118 119 } 120 else 121 { 122 success = false; 123 } 124 125 return success; 126 127 } 128 129 130 131 /** 132 * @brief Register a function with the scriptable 133 * @param functionName function name 134 * 135 * 136 */ 137 138 void Scriptable::registerFunction(std::string functionName) 139 { 140 //check whether the function is already registered 141 std::list<std::string>::iterator it; 142 for(it = functionList.begin();it != functionList.end(); it++) 143 { 144 if((*it).compare(functionName) == 0) 145 { 146 break; 147 } 148 149 } 150 151 if(it == functionList.end()) // if the functoin wasn't found 152 functionList.push_back(functionName); 153 } 154 155 156 /** 157 * @brief Get the function name of the function at index 158 * @param index 159 * 160 * @return the function name on success. 161 * 162 * This function is used in the ScriptCalling function 163 */ 164 std::string Scriptable::getFunctionAtIndex(int index, LuaVirtualMachine& virtualMachine) 165 { 166 lua_State * luaState = (lua_State* ) virtualMachine; 167 168 if(virtualMachine.isOk()) 169 { 170 lua_getglobal (luaState, "this"); 171 172 if (lua_istable (luaState, 1)) 173 { 174 // Found the "this" table. The object pointer is at the index 0 175 lua_rawgeti (luaState, 1, 0); 176 177 if (lua_islightuserdata (luaState, -1)) 178 { 179 // Found the pointer, need to cast it 180 LuaScript* thisPointer = (LuaScript *) lua_touserdata (luaState, -1); 181 182 if(thisPointer != NULL) 183 { 184 Script* script = getScriptByPointer(thisPointer); 185 if( script != NULL) 186 { 187 std::map<int, std::string>::const_iterator it = script->functionMap.find(index); 188 if(it != script->functionMap.end())//if found 189 return script->functionMap[index]; 190 } 191 192 } 193 } 194 } 195 } 196 197 } 198 199 200 /** 201 * @brief Gets the lastMethod index associated with the LuaScript 202 * @param the luaScript 203 * 204 * @return A lua reference to the last function of the Scriptable 205 * 206 * 207 */ 208 209 int Scriptable::getLastMethodIndexByPointer(LuaScript* luaScript) 210 { 211 if( luaScript ) 212 { 213 Script* script = (getScriptByPointer(luaScript)); 214 if(script) 215 { 216 return (script->lastMethodIndex); 217 } 218 } 219 220 return -1; 216 return (script->lastMethodIndex); 217 } 218 } 219 220 return -1; 221 221 } 222 222 … … 231 231 */ 232 232 233 std::map<int, std::string>* Scriptable::getFunctionMapByPointer(LuaScript* scriptPointer) 234 { 235 bool notFound = true; 236 if(scriptPointer) 237 { 238 std::list<Script>::iterator it = scriptList.begin(); 239 240 241 while(notFound && it !=scriptList.end() ) 242 { 243 if((*it).script == scriptPointer) 244 { 245 notFound = false; 246 return &(it->functionMap); 247 } 248 it++; 249 } 250 } 251 252 if(notFound) 253 return NULL; 254 255 } 256 257 258 /** 259 * @brief Gets the internal representation of a LuaScript by its pointer. 260 * @param script the LuaScript 261 * 262 * @return returns the script if it was found, NULL else. 263 * 264 * 265 */ 266 267 Script* Scriptable::getScriptByPointer(LuaScript* script) 268 { 269 bool notFound = true; 270 271 if(script) 272 { 273 std::list<Script>::iterator it = scriptList.begin(); 274 275 while(notFound && it != scriptList.end() ) 276 { 277 if((*it).script == script) 278 { 279 notFound = false; 280 return &(*it); 281 } 282 it++; 283 } 284 285 } 286 if(notFound) 287 return NULL; 288 289 } 290 291 292 /** 293 * @brief Extracts the Script out of the virtual machine 294 * @param virtualMachine the virtualMachine to search for the script 295 * 296 * @return The Script. If there was an error it returns NULL 297 * 298 * 299 */ 300 Script* Scriptable::getScriptByVirtualMachine(LuaVirtualMachine& virtualMachine) 301 { 302 303 if(virtualMachine.isOk()) 304 { 305 lua_State * luaState = (lua_State* ) virtualMachine; 306 lua_getglobal (luaState, "this"); 307 308 if (lua_istable (luaState, 1)) 309 { 310 // Found the "this" table. The object pointer is at the index 0 311 lua_rawgeti (luaState, 1, 0); 312 313 if (lua_islightuserdata (luaState, -1)) 314 { 315 // Found the pointer, need to cast it 316 LuaScript* thisPointer = (LuaScript *) lua_touserdata (luaState, -1); 317 Script* script = getScriptByPointer(thisPointer); 318 319 if(script) 320 return script; 321 else 322 return NULL; 323 } 324 } 325 } 326 327 328 } 329 330 331 /** 332 * @brief Checks if "this" Scriptable is already registred with a LuaScript 333 * @param script The LuaScript 334 * 335 * @return true when the Scriptable is alreads registered with that script, flase else. 336 * 337 * 338 */ 339 bool Scriptable::scriptIsInScriptList(LuaScript* script) 340 { 341 bool notFound = true; 342 343 if(script) 344 { 345 std::list<Script>::iterator it = scriptList.begin(); 346 347 348 while( notFound && it !=scriptList.end() ) 349 { 350 if((*it).script == script) 351 { 352 notFound = false; 353 break; 354 } 355 it++; 356 } 357 358 } 359 return !notFound; 360 361 } 362 363 364 /** 365 * @brief Removes a LuaScript from the scriptList 366 * @param deleted LuaScript that is about to be deleted 367 * 368 * This function has to be called int the destructor of the LuaScript. 369 * 370 * 371 */ 372 373 void Scriptable::scriptDeleted(LuaScript* deleted) 374 { 375 if(deleted) 376 { 377 Script* script = getScriptByPointer(deleted); 233 std::map<int, std::string>* Scriptable::getFunctionMapByPointer(LuaScript* scriptPointer) 234 { 235 bool notFound = true; 236 if(scriptPointer) 237 { 238 std::list<Script>::iterator it = scriptList.begin(); 239 240 241 while(notFound && it !=scriptList.end() ) 242 { 243 if((*it).script == scriptPointer) 244 { 245 notFound = false; 246 return &(it->functionMap); 247 } 248 it++; 249 } 250 } 251 252 if(notFound) 253 return NULL; 254 255 } 256 257 258 /** 259 * @brief Gets the internal representation of a LuaScript by its pointer. 260 * @param script the LuaScript 261 * 262 * @return returns the script if it was found, NULL else. 263 * 264 * 265 */ 266 267 Script* Scriptable::getScriptByPointer(LuaScript* script) 268 { 269 bool notFound = true; 270 378 271 if(script) 379 { 380 std::list<Script>::iterator it = scriptList.begin(); 381 382 383 while((*it).script != deleted && it != scriptList.end() ) 384 { 385 it++; 386 } 387 388 if(it != scriptList.end()) 272 { 273 std::list<Script>::iterator it = scriptList.begin(); 274 275 while(notFound && it != scriptList.end() ) 276 { 277 if((*it).script == script) 278 { 279 notFound = false; 280 return &(*it); 281 } 282 it++; 283 } 284 285 } 286 if(notFound) 287 return NULL; 288 289 } 290 291 292 /** 293 * @brief Extracts the Script out of the virtual machine 294 * @param virtualMachine the virtualMachine to search for the script 295 * 296 * @return The Script. If there was an error it returns NULL 297 * 298 * 299 */ 300 Script* Scriptable::getScriptByVirtualMachine(LuaVirtualMachine& virtualMachine) 301 { 302 303 if(virtualMachine.isOk()) 304 { 305 lua_State * luaState = (lua_State* ) virtualMachine; 306 lua_getglobal (luaState, "this"); 307 308 if (lua_istable (luaState, 1)) 309 { 310 // Found the "this" table. The object pointer is at the index 0 311 lua_rawgeti (luaState, 1, 0); 312 313 if (lua_islightuserdata (luaState, -1)) 314 { 315 // Found the pointer, need to cast it 316 LuaScript* thisPointer = (LuaScript *) lua_touserdata (luaState, -1); 317 Script* script = getScriptByPointer(thisPointer); 318 319 if(script) 320 return script; 321 else 322 return NULL; 323 } 324 } 325 } 326 327 328 } 329 330 331 /** 332 * @brief Checks if "this" Scriptable is already registred with a LuaScript 333 * @param script The LuaScript 334 * 335 * @return true when the Scriptable is alreads registered with that script, flase else. 336 * 337 * 338 */ 339 bool Scriptable::scriptIsInScriptList(LuaScript* script) 340 { 341 bool notFound = true; 342 343 if(script) 344 { 345 std::list<Script>::iterator it = scriptList.begin(); 346 347 348 while( notFound && it !=scriptList.end() ) 349 { 350 if((*it).script == script) 351 { 352 notFound = false; 353 break; 354 } 355 it++; 356 } 357 358 } 359 return !notFound; 360 361 } 362 363 364 /** 365 * @brief Removes a LuaScript from the scriptList 366 * @param deleted LuaScript that is about to be deleted 367 * 368 * This function has to be called int the destructor of the LuaScript. 369 * 370 * 371 */ 372 373 void Scriptable::scriptDeleted(LuaScript* deleted) 374 { 375 if(deleted) 376 { 377 Script* script = getScriptByPointer(deleted); 378 if(script) 379 { 380 std::list<Script>::iterator it = scriptList.begin(); 381 382 383 while((*it).script != deleted && it != scriptList.end() ) 384 { 385 it++; 386 } 387 388 if(it != scriptList.end()) 389 389 { 390 390 scriptList.erase(it); … … 392 392 393 393 394 } 395 } 396 394 } 395 } 396 397 } 398 399 400 401 char Scriptable::whatIsThis() 402 { 403 char result = 's'; 404 return result; 405 } 397 406 } 398 399 400 401 char Scriptable::whatIsThis()402 {403 char result = 's';404 return result;405 } -
branches/script_engine/src/lib/script_engine/scriptable.h
r7645 r7653 9 9 #include "luaincl.h" 10 10 11 class LuaScript; 11 namespace OrxScript 12 { 13 class LuaScript; 12 14 13 //internal representation of a LuaScript14 struct Script15 //internal representation of a LuaScript 16 struct Script 15 17 { 16 18 int lastMethodIndex; … … 22 24 }; 23 25 24 class Scriptable25 {26 class Scriptable 27 { 26 28 public: 27 29 Scriptable (void); 28 30 virtual ~Scriptable (void); 29 31 30 // Method indexing check31 int methods (LuaVirtualMachine& virtualMachine);32 // Method indexing check 33 int methods (LuaVirtualMachine& virtualMachine); 32 34 //int methods(){;return 1;} //BAD BAD HACK HACK HACK !!!!!!!!!!!!!! 33 35 34 36 char whatIsThis(); 35 37 36 // When the script calls a class method, this is called38 // When the script calls a class method, this is called 37 39 virtual int scriptCalling (LuaVirtualMachine& vm, std::string functionName) = 0; 38 40 39 // When the script function has returns41 // When the script function has returns 40 42 virtual void handleReturns (LuaVirtualMachine& vm, const std::string& strFunc) = 0; 41 43 … … 45 47 void registerFunction(std::string functionName);//Adds a function to the internal function list 46 48 private: 47 bool scriptableAdded(LuaScript* script, int scriptRef, int reference);48 //void scriptableFunctionAdded(LuaScript* script, int reference);49 bool scriptableAdded(LuaScript* script, int scriptRef, int reference); 50 //void scriptableFunctionAdded(LuaScript* script, int reference); 49 51 50 52 51 Script* getScriptByPointer(LuaScript* script);52 Script* getScriptByVirtualMachine(LuaVirtualMachine& virtualMachine);53 std::map<int, std::string>* getFunctionMapByPointer(LuaScript* scriptPointer);54 int getLastMethodIndexByPointer(LuaScript* script);53 Script* getScriptByPointer(LuaScript* script); 54 Script* getScriptByVirtualMachine(LuaVirtualMachine& virtualMachine); 55 std::map<int, std::string>* getFunctionMapByPointer(LuaScript* scriptPointer); 56 int getLastMethodIndexByPointer(LuaScript* script); 55 57 56 58 57 bool scriptIsInScriptList(LuaScript* script);59 bool scriptIsInScriptList(LuaScript* script); 58 60 59 void scriptDeleted(LuaScript* deleted);61 void scriptDeleted(LuaScript* deleted); 60 62 61 63 62 friend class LuaScript;64 friend class LuaScript; 63 65 64 66 std::list<std::string> functionList; 65 67 std::list<Script> scriptList; 66 };68 }; 67 69 70 } 68 71 69 72 #endif // __SCRIPTABLE_H__
Note: See TracChangeset
for help on using the changeset viewer.