mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 02:26:38 +00:00 
			
		
		
		
	Merge branch 'master' of git://github.com/zinnschlag/openmw
This commit is contained in:
		
						commit
						22862617d8
					
				
					 2 changed files with 33 additions and 15 deletions
				
			
		|  | @ -140,25 +140,42 @@ namespace MWScript | ||||||
| 
 | 
 | ||||||
|     Compiler::Locals& ScriptManager::getLocals (const std::string& name) |     Compiler::Locals& ScriptManager::getLocals (const std::string& name) | ||||||
|     { |     { | ||||||
|         ScriptCollection::iterator iter = mScripts.find (name); |  | ||||||
| 
 |  | ||||||
|         if (iter==mScripts.end()) |  | ||||||
|         { |         { | ||||||
|             if (!compile (name)) |             ScriptCollection::iterator iter = mScripts.find (name); | ||||||
|             { |  | ||||||
|                 /// \todo Handle case of cyclic member variable access. Currently this could look up
 |  | ||||||
|                 /// the whole application in an endless recursion.
 |  | ||||||
| 
 | 
 | ||||||
|                 // failed -> ignore script from now on.
 |             if (iter!=mScripts.end()) | ||||||
|                 std::vector<Interpreter::Type_Code> empty; |                 return iter->second.second; | ||||||
|                 mScripts.insert (std::make_pair (name, std::make_pair (empty, Compiler::Locals()))); |  | ||||||
|                 throw std::runtime_error ("failed to compile script " + name); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             iter = mScripts.find (name); |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return iter->second.second; |         { | ||||||
|  |             std::map<std::string, Compiler::Locals>::iterator iter = mOtherLocals.find (name); | ||||||
|  | 
 | ||||||
|  |             if (iter!=mOtherLocals.end()) | ||||||
|  |                 return iter->second; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         Compiler::Locals locals; | ||||||
|  | 
 | ||||||
|  |         if (const ESM::Script *script = mStore.get<ESM::Script>().find (name)) | ||||||
|  |         { | ||||||
|  |             int index = 0; | ||||||
|  | 
 | ||||||
|  |             for (int i=0; i<script->mData.mNumShorts; ++i) | ||||||
|  |                 locals.declare ('s', script->mVarNames[index++]); | ||||||
|  | 
 | ||||||
|  |             for (int i=0; i<script->mData.mNumLongs; ++i) | ||||||
|  |                 locals.declare ('l', script->mVarNames[index++]); | ||||||
|  | 
 | ||||||
|  |             for (int i=0; i<script->mData.mNumFloats; ++i) | ||||||
|  |                 locals.declare ('f', script->mVarNames[index++]); | ||||||
|  | 
 | ||||||
|  |             std::map<std::string, Compiler::Locals>::iterator iter = | ||||||
|  |                 mOtherLocals.insert (std::make_pair (name, locals)).first; | ||||||
|  | 
 | ||||||
|  |             return iter->second; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         throw std::logic_error ("script " + name + " does not exist"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     GlobalScripts& ScriptManager::getGlobalScripts() |     GlobalScripts& ScriptManager::getGlobalScripts() | ||||||
|  |  | ||||||
|  | @ -47,6 +47,7 @@ namespace MWScript | ||||||
| 
 | 
 | ||||||
|             ScriptCollection mScripts; |             ScriptCollection mScripts; | ||||||
|             GlobalScripts mGlobalScripts; |             GlobalScripts mGlobalScripts; | ||||||
|  |             std::map<std::string, Compiler::Locals> mOtherLocals; | ||||||
| 
 | 
 | ||||||
|         public: |         public: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue