aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/vm.h
diff options
context:
space:
mode:
authormd52011-03-26 02:37:10 +0200
committermd52011-03-26 02:37:10 +0200
commitcc074b013f36338d070699b9e5916debe6b93ff8 (patch)
tree19e45fc4f6f1f5aa572fe20c704dafb5b462edd9 /engines/sci/engine/vm.h
parent68908773ac0ef335f491a257473358269616ab69 (diff)
downloadscummvm-rg350-cc074b013f36338d070699b9e5916debe6b93ff8.tar.gz
scummvm-rg350-cc074b013f36338d070699b9e5916debe6b93ff8.tar.bz2
scummvm-rg350-cc074b013f36338d070699b9e5916debe6b93ff8.zip
SCI: Refactored and cleaned up the VM call stack handling code
- Removed the CallsStruct intermediate stack. Calls are inserted directly in the execution stack - Added a constructor for the ExecStack struct and removed add_exec_stack_varselector() and add_exec_stack_entry()
Diffstat (limited to 'engines/sci/engine/vm.h')
-rw-r--r--engines/sci/engine/vm.h26
1 files changed, 25 insertions, 1 deletions
diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h
index ee22e03310..9ff332d23b 100644
--- a/engines/sci/engine/vm.h
+++ b/engines/sci/engine/vm.h
@@ -92,9 +92,10 @@ struct ExecStack {
StackPtr fp; // Frame pointer
StackPtr sp; // Stack pointer
- int argc;
+ int argc;
StackPtr variables_argp; // Argument pointer
+
SegmentId local_segment; // local variables etc
Selector debugSelector; // The selector which was used to call or -1 if not applicable
@@ -104,6 +105,29 @@ struct ExecStack {
ExecStackType type;
reg_t* getVarPointer(SegManager *segMan) const;
+
+ ExecStack(reg_t objp_, reg_t sendp_, StackPtr sp_, int argc_, StackPtr argp_,
+ SegmentId localsSegment_, reg_t pc_, Selector debugSelector_,
+ int debugExportId_, int debugLocalCallOffset_, int debugOrigin_,
+ ExecStackType type_) {
+ objp = objp_;
+ sendp = sendp_;
+ // varp is set separately for varselector calls
+ addr.pc = pc_;
+ fp = sp = sp_;
+ argc = argc_;
+ variables_argp = argp_;
+ *variables_argp = make_reg(0, argc); // The first argument is argc
+ if (localsSegment_ != 0xFFFF)
+ local_segment = localsSegment_;
+ else
+ local_segment = pc_.segment;
+ debugSelector = debugSelector_;
+ debugExportId = debugExportId_;
+ debugLocalCallOffset = debugLocalCallOffset_;
+ debugOrigin = debugOrigin_;
+ type = type_;
+ }
};
enum {