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());
}
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()
@ -202,19 +229,29 @@ namespace Interpreter
{
assert (codeSize>=4);
mRuntime.configure (code, codeSize, context);
begin();
int opcodes = static_cast<int> (code[0]);
try
{
mRuntime.configure (code, codeSize, context);
const Type_Code *codeBlock = code + 4;
int opcodes = static_cast<int> (code[0]);
while (mRuntime.getPC()>=0 && mRuntime.getPC()<opcodes)
const Type_Code *codeBlock = code + 4;
while (mRuntime.getPC()>=0 && mRuntime.getPC()<opcodes)
{
Type_Code code = codeBlock[mRuntime.getPC()];
mRuntime.setPC (mRuntime.getPC()+1);
execute (code);
}
}
catch (...)
{
Type_Code code = codeBlock[mRuntime.getPC()];
mRuntime.setPC (mRuntime.getPC()+1);
execute (code);
end();
throw;
}
mRuntime.clear();
end();
}
}

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

Loading…
Cancel
Save