deal with script execution from within a script (Fixes #2964)

openmw-37
Marc Zinnschlag 9 years ago
parent a134b87e5b
commit 8eb6d337d5

@ -132,7 +132,34 @@ namespace Interpreter
throw std::runtime_error (error.str()); throw std::runtime_error (error.str());
} }
Interpreter::Interpreter() void Interpreter::begin()
{
if (mRunning)
{
mCallstack.push (mRuntime);
mRuntime.clear();
}
else
{
mRunning = true;
}
}
void Interpreter::end()
{
if (mCallstack.empty())
{
mRuntime.clear();
mRunning = false;
}
else
{
mRuntime = mCallstack.top();
mCallstack.pop();
}
}
Interpreter::Interpreter() : mRunning (false)
{} {}
Interpreter::~Interpreter() Interpreter::~Interpreter()
@ -202,6 +229,10 @@ namespace Interpreter
{ {
assert (codeSize>=4); assert (codeSize>=4);
begin();
try
{
mRuntime.configure (code, codeSize, context); mRuntime.configure (code, codeSize, context);
int opcodes = static_cast<int> (code[0]); int opcodes = static_cast<int> (code[0]);
@ -214,7 +245,13 @@ namespace Interpreter
mRuntime.setPC (mRuntime.getPC()+1); mRuntime.setPC (mRuntime.getPC()+1);
execute (code); execute (code);
} }
}
catch (...)
{
end();
throw;
}
mRuntime.clear(); end();
} }
} }

@ -2,6 +2,7 @@
#define INTERPRETER_INTERPRETER_H_INCLUDED #define INTERPRETER_INTERPRETER_H_INCLUDED
#include <map> #include <map>
#include <stack>
#include "runtime.hpp" #include "runtime.hpp"
#include "types.hpp" #include "types.hpp"
@ -14,6 +15,8 @@ namespace Interpreter
class Interpreter class Interpreter
{ {
std::stack<Runtime> mCallstack;
bool mRunning;
Runtime mRuntime; Runtime mRuntime;
std::map<int, Opcode1 *> mSegment0; std::map<int, Opcode1 *> mSegment0;
std::map<int, Opcode2 *> mSegment1; std::map<int, Opcode2 *> mSegment1;
@ -32,6 +35,10 @@ namespace Interpreter
void abortUnknownSegment (Type_Code code); void abortUnknownSegment (Type_Code code);
void begin();
void end();
public: public:
Interpreter(); Interpreter();

Loading…
Cancel
Save