DIRECTOR: Lingo: Start of script execution trace code
This commit is contained in:
parent
09138c9e9f
commit
289d10c26b
3 changed files with 42 additions and 2 deletions
|
@ -136,6 +136,8 @@ void Lingo::initBuiltIns() {
|
||||||
sym->u.bltin = blt->func;
|
sym->u.bltin = blt->func;
|
||||||
|
|
||||||
_handlers[blt->name] = sym;
|
_handlers[blt->name] = sym;
|
||||||
|
|
||||||
|
_functions[(void *)sym->u.s] = new FuncDesc(blt->name, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,17 +53,28 @@ namespace Director {
|
||||||
|
|
||||||
void Lingo::execute(int pc) {
|
void Lingo::execute(int pc) {
|
||||||
for(_pc = pc; (*_currentScript)[_pc] != STOP && !_returning;) {
|
for(_pc = pc; (*_currentScript)[_pc] != STOP && !_returning;) {
|
||||||
|
Common::String instr = decodeInstruction(_pc);
|
||||||
|
|
||||||
|
debugC(1, kDebugLingoExec, "%s", instr.c_str());
|
||||||
|
|
||||||
for (uint i = 0; i < _stack.size(); i++) {
|
for (uint i = 0; i < _stack.size(); i++) {
|
||||||
debugN(5, "%d ", _stack[i].u.i);
|
debugCN(5, kDebugLingoExec, "%d ", _stack[i].u.i);
|
||||||
}
|
}
|
||||||
debug(5, "%s", "");
|
debugCN(5, kDebugLingoExec, "%s", "");
|
||||||
|
|
||||||
_pc++;
|
_pc++;
|
||||||
(*((*_currentScript)[_pc - 1]))();
|
(*((*_currentScript)[_pc - 1]))();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Common::String Lingo::decodeInstruction(int pc) {
|
||||||
|
if (_functions.contains((void *)(*_currentScript)[pc])) {
|
||||||
|
return _functions[(void *)(*_currentScript)[pc]]->name;
|
||||||
|
} else {
|
||||||
|
return "<unknown>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Symbol *Lingo::lookupVar(const char *name, bool create, bool putInGlobalList) {
|
Symbol *Lingo::lookupVar(const char *name, bool create, bool putInGlobalList) {
|
||||||
Symbol *sym;
|
Symbol *sym;
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,30 @@ typedef void (*inst)(void);
|
||||||
typedef Common::Array<inst> ScriptData;
|
typedef Common::Array<inst> ScriptData;
|
||||||
typedef Common::Array<double> FloatArray;
|
typedef Common::Array<double> FloatArray;
|
||||||
|
|
||||||
|
struct FuncDesc {
|
||||||
|
Common::String name;
|
||||||
|
const char *proto;
|
||||||
|
|
||||||
|
FuncDesc(Common::String n, const char *p) { name = n; proto = p; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Pointer_EqualTo {
|
||||||
|
bool operator()(const void *x, const void *y) const { return x == y; }
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Pointer_Hash {
|
||||||
|
uint operator()(const void *x) const {
|
||||||
|
#ifdef SCUMM_64BITS
|
||||||
|
uint64 v = (uint64)x;
|
||||||
|
return (v >> 32) ^ (v & 0xffffffff);
|
||||||
|
#else
|
||||||
|
return (uint)x;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Common::HashMap<void *, FuncDesc *, Pointer_Hash, Pointer_EqualTo> FuncHash;
|
||||||
|
|
||||||
struct Symbol { /* symbol table entry */
|
struct Symbol { /* symbol table entry */
|
||||||
char *name;
|
char *name;
|
||||||
int type;
|
int type;
|
||||||
|
@ -156,6 +180,7 @@ public:
|
||||||
|
|
||||||
void addCode(const char *code, ScriptType type, uint16 id);
|
void addCode(const char *code, ScriptType type, uint16 id);
|
||||||
void executeScript(ScriptType type, uint16 id);
|
void executeScript(ScriptType type, uint16 id);
|
||||||
|
Common::String decodeInstruction(int pc);
|
||||||
|
|
||||||
void processEvent(LEvent event, int entityId);
|
void processEvent(LEvent event, int entityId);
|
||||||
|
|
||||||
|
@ -403,6 +428,8 @@ private:
|
||||||
SymbolHash _globalvars;
|
SymbolHash _globalvars;
|
||||||
SymbolHash *_localvars;
|
SymbolHash *_localvars;
|
||||||
|
|
||||||
|
FuncHash _functions;
|
||||||
|
|
||||||
int _pc;
|
int _pc;
|
||||||
|
|
||||||
StackData _stack;
|
StackData _stack;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue