SCI: Cleanup for some SegManager internals
- rename segGet and getSegment to getScriptSegment; the two can be distinguished by the parameter count. - rename type SCRIPT_GET to ScriptLoadType to conform with our code formatting conventions - rename get_class_address to getClassAddress - some cleanup svn-id: r43981
This commit is contained in:
parent
d04b5d2c9b
commit
fdbb167ea3
10 changed files with 51 additions and 51 deletions
|
@ -2844,7 +2844,7 @@ int parse_reg_t(EngineState *s, const char *str, reg_t *dest) { // Returns 0 on
|
|||
if (*endptr)
|
||||
return 1;
|
||||
|
||||
dest->segment = s->segMan->segGet(script_nr);
|
||||
dest->segment = s->segMan->getScriptSegment(script_nr);
|
||||
|
||||
if (!dest->segment) {
|
||||
return 1;
|
||||
|
|
|
@ -326,7 +326,7 @@ int script_init_engine(EngineState *s) {
|
|||
s->segMan = new SegManager(s->resMan);
|
||||
s->gc_countdown = GC_INTERVAL - 1;
|
||||
|
||||
SegmentId script_000_segment = s->segMan->getSegment(0, SCRIPT_GET_LOCK);
|
||||
SegmentId script_000_segment = s->segMan->getScriptSegment(0, SCRIPT_GET_LOCK);
|
||||
|
||||
if (script_000_segment <= 0) {
|
||||
debug(2, "Failed to instantiate script.000");
|
||||
|
|
|
@ -268,7 +268,7 @@ reg_t kScriptID(EngineState *s, int, int argc, reg_t *argv) {
|
|||
if (argv[0].segment)
|
||||
return argv[0];
|
||||
|
||||
SegmentId scriptSeg = s->segMan->getSegment(script, SCRIPT_GET_LOAD);
|
||||
SegmentId scriptSeg = s->segMan->getScriptSegment(script, SCRIPT_GET_LOAD);
|
||||
Script *scr;
|
||||
|
||||
if (!scriptSeg)
|
||||
|
@ -297,7 +297,7 @@ reg_t kDisposeScript(EngineState *s, int, int argc, reg_t *argv) {
|
|||
if (argv[0].segment)
|
||||
return s->r_acc;
|
||||
|
||||
int id = s->segMan->segGet(script);
|
||||
int id = s->segMan->getScriptSegment(script);
|
||||
Script *scr = s->segMan->getScriptIfLoaded(id);
|
||||
if (scr) {
|
||||
if (s->_executionStack.back().addr.pc.segment != id)
|
||||
|
|
|
@ -146,7 +146,7 @@ reg_t kSetSynonyms(EngineState *s, int, int argc, reg_t *argv) {
|
|||
int synonyms_nr = 0;
|
||||
|
||||
script = GET_SEL32V(objpos, number);
|
||||
seg = s->segMan->segGet(script);
|
||||
seg = s->segMan->getScriptSegment(script);
|
||||
|
||||
if (seg >= 0)
|
||||
synonyms_nr = s->segMan->getScript(seg)->getSynonymsNr();
|
||||
|
|
|
@ -319,9 +319,9 @@ void CloneTable::freeAtAddress(SegManager *segMan, reg_t addr) {
|
|||
//-------------------- locals --------------------
|
||||
reg_t LocalVariables::findCanonicAddress(SegManager *segMan, reg_t addr) {
|
||||
// Reference the owning script
|
||||
SegmentId owner_seg = segMan->segGet(script_id);
|
||||
SegmentId owner_seg = segMan->getScriptSegment(script_id);
|
||||
|
||||
assert(owner_seg >= 0);
|
||||
assert(owner_seg > 0);
|
||||
|
||||
return make_reg(owner_seg, 0);
|
||||
}
|
||||
|
|
|
@ -714,7 +714,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
|
|||
reconstruct_scripts(retval, retval->segMan);
|
||||
retval->segMan->reconstructClones();
|
||||
retval->game_obj = s->game_obj;
|
||||
retval->script_000 = retval->segMan->getScript(retval->segMan->getSegment(0, SCRIPT_GET_DONT_LOAD));
|
||||
retval->script_000 = retval->segMan->getScript(retval->segMan->getScriptSegment(0, SCRIPT_GET_DONT_LOAD));
|
||||
retval->gc_countdown = GC_INTERVAL - 1;
|
||||
retval->sys_strings_segment = retval->segMan->findSegmentByType(MEM_OBJ_SYS_STRINGS);
|
||||
retval->sys_strings = (SystemStrings *)GET_SEGMENT(*retval->segMan, retval->sys_strings_segment, MEM_OBJ_SYS_STRINGS);
|
||||
|
|
|
@ -235,7 +235,7 @@ bool SegManager::scriptIsMarkedAsDeleted(SegmentId seg) {
|
|||
|
||||
|
||||
int SegManager::deallocateScript(int script_nr) {
|
||||
SegmentId seg = segGet(script_nr);
|
||||
SegmentId seg = getScriptSegment(script_nr);
|
||||
|
||||
deallocate(seg, true);
|
||||
|
||||
|
@ -262,13 +262,12 @@ MemObject *SegManager::memObjAllocate(SegmentId segid, int hash_id, MemObjectTyp
|
|||
}
|
||||
|
||||
// return the seg if script_id is valid and in the map, else -1
|
||||
SegmentId SegManager::segGet(int script_id) const {
|
||||
SegmentId SegManager::getScriptSegment(int script_id) const {
|
||||
return id_seg_map->lookupKey(script_id);
|
||||
}
|
||||
|
||||
Script *SegManager::getScript(const SegmentId seg) {
|
||||
// FIXME: We accept segment 0, but that is actually an invalid segment...
|
||||
if (seg < 0 || (uint)seg >= _heap.size()) {
|
||||
if (seg <= 0 || (uint)seg >= _heap.size()) {
|
||||
error("SegManager::getScript(): seg id %x out of bounds", seg);
|
||||
}
|
||||
if (!_heap[seg]) {
|
||||
|
@ -282,7 +281,7 @@ Script *SegManager::getScript(const SegmentId seg) {
|
|||
|
||||
Script *SegManager::getScriptIfLoaded(const SegmentId seg) {
|
||||
// FIXME: We accept segment 0, but that is actually an invalid segment...
|
||||
if (seg < 0 || (uint)seg >= _heap.size() || !_heap[seg] || _heap[seg]->getType() != MEM_OBJ_SCRIPT)
|
||||
if (seg <= 0 || (uint)seg >= _heap.size() || !_heap[seg] || _heap[seg]->getType() != MEM_OBJ_SCRIPT)
|
||||
return 0;
|
||||
return (Script *)_heap[seg];
|
||||
}
|
||||
|
@ -299,8 +298,7 @@ SegmentId SegManager::findSegmentByType(int type) {
|
|||
// false - invalid seg
|
||||
// true - valid seg
|
||||
bool SegManager::check(SegmentId seg) {
|
||||
// FIXME: We accept segment 0, but that is actually an invalid segment...
|
||||
if (seg < 0 || (uint)seg >= _heap.size()) {
|
||||
if (seg <= 0 || (uint)seg >= _heap.size()) {
|
||||
return false;
|
||||
}
|
||||
if (!_heap[seg]) {
|
||||
|
@ -443,13 +441,13 @@ void SegManager::heapRelocate(reg_t block) {
|
|||
}
|
||||
}
|
||||
|
||||
SegmentId SegManager::getSegment(int script_nr, SCRIPT_GET load) {
|
||||
SegmentId SegManager::getScriptSegment(int script_nr, ScriptLoadType load) {
|
||||
SegmentId segment;
|
||||
|
||||
if ((load & SCRIPT_GET_LOAD) == SCRIPT_GET_LOAD)
|
||||
script_instantiate(_resMan, this, script_nr);
|
||||
|
||||
segment = segGet(script_nr);
|
||||
segment = getScriptSegment(script_nr);
|
||||
|
||||
if (segment > 0) {
|
||||
if ((load & SCRIPT_GET_LOCK) == SCRIPT_GET_LOCK)
|
||||
|
@ -457,19 +455,19 @@ SegmentId SegManager::getSegment(int script_nr, SCRIPT_GET load) {
|
|||
|
||||
return segment;
|
||||
} else
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define INST_LOOKUP_CLASS(id) ((id == 0xffff) ? NULL_REG : get_class_address(id, SCRIPT_GET_LOCK, NULL_REG))
|
||||
#define INST_LOOKUP_CLASS(id) ((id == 0xffff) ? NULL_REG : getClassAddress(id, SCRIPT_GET_LOCK, NULL_REG))
|
||||
|
||||
reg_t SegManager::get_class_address(int classnr, SCRIPT_GET lock, reg_t caller) {
|
||||
reg_t SegManager::getClassAddress(int classnr, ScriptLoadType lock, reg_t caller) {
|
||||
if (classnr < 0 || (int)_classtable.size() <= classnr || _classtable[classnr].script < 0) {
|
||||
error("[VM] Attempt to dereference class %x, which doesn't exist (max %x)", classnr, _classtable.size());
|
||||
return NULL_REG;
|
||||
} else {
|
||||
Class *the_class = &_classtable[classnr];
|
||||
if (!the_class->reg.segment) {
|
||||
getSegment(the_class->script, lock);
|
||||
getScriptSegment(the_class->script, lock);
|
||||
|
||||
if (!the_class->reg.segment) {
|
||||
error("[VM] Trying to instantiate class %x by instantiating script 0x%x (%03d) failed;"
|
||||
|
|
|
@ -44,24 +44,24 @@ namespace Sci {
|
|||
: NULL): NULL)
|
||||
|
||||
/**
|
||||
* Parameters for getSegment()
|
||||
* Parameters for getScriptSegment().
|
||||
*/
|
||||
typedef enum {
|
||||
enum ScriptLoadType {
|
||||
SCRIPT_GET_DONT_LOAD = 0, /**< Fail if not loaded */
|
||||
SCRIPT_GET_LOAD = 1, /**< Load, if neccessary */
|
||||
SCRIPT_GET_LOCK = 3 /**< Load, if neccessary, and lock */
|
||||
} SCRIPT_GET;
|
||||
};
|
||||
|
||||
|
||||
class SegManager : public Common::Serializable {
|
||||
public:
|
||||
/**
|
||||
* Initialize the segment manager
|
||||
* Initialize the segment manager.
|
||||
*/
|
||||
SegManager(ResourceManager *resMan);
|
||||
|
||||
/**
|
||||
* Deallocate all memory associated with the segment manager
|
||||
* Deallocate all memory associated with the segment manager.
|
||||
*/
|
||||
~SegManager();
|
||||
|
||||
|
@ -70,7 +70,7 @@ public:
|
|||
// 1. Scripts
|
||||
|
||||
/**
|
||||
* Allocate a script into the segment manager
|
||||
* Allocate a script into the segment manager.
|
||||
* @param script_nr The number of the script to load
|
||||
* @param seg_id The segment ID of the newly allocated segment,
|
||||
* on success
|
||||
|
@ -81,7 +81,7 @@ public:
|
|||
// The script must then be initialised; see section (1b.), below.
|
||||
|
||||
/**
|
||||
* Forcefully deallocate a previously allocated script
|
||||
* Forcefully deallocate a previously allocated script.
|
||||
* @param script_nr number of the script to deallocate
|
||||
* @return 1 on success, 0 on failure
|
||||
*/
|
||||
|
@ -95,7 +95,7 @@ public:
|
|||
|
||||
/**
|
||||
* Validate whether the specified public function is exported by
|
||||
* the script in the specified segment
|
||||
* the script in the specified segment.
|
||||
* @param pubfunct Index of the function to validate
|
||||
* @param seg Segment ID of the script the check is to
|
||||
* be performed for
|
||||
|
@ -105,12 +105,23 @@ public:
|
|||
uint16 validateExportFunc(int pubfunct, SegmentId seg);
|
||||
|
||||
/**
|
||||
* Get the segment ID associated with a script number
|
||||
* Determines the segment occupied by a certain script, if any.
|
||||
* @param script_nr Number of the script to look up
|
||||
* @return The associated segment ID, or -1 if no
|
||||
* matching segment exists
|
||||
* @return The script's segment ID, or -1 on failure
|
||||
*/
|
||||
SegmentId segGet(int script_nr) const;
|
||||
SegmentId getScriptSegment(int script_nr) const;
|
||||
|
||||
/**
|
||||
* Determines the segment occupied by a certain script. Optionally
|
||||
* load it, or load & lock it.
|
||||
* @param[in] script_nr Number of the script to look up
|
||||
* @param[in] load flag determining whether to load/lock the script
|
||||
* @return The script's segment ID, or -1 on failure
|
||||
*/
|
||||
SegmentId getScriptSegment(int script_nr, ScriptLoadType load);
|
||||
|
||||
// TODO: document this
|
||||
reg_t getClassAddress(int classnr, ScriptLoadType lock, reg_t caller);
|
||||
|
||||
/**
|
||||
* Return a pointer to the specified script.
|
||||
|
@ -335,15 +346,6 @@ public:
|
|||
*/
|
||||
byte *dereference(reg_t reg, int *size);
|
||||
|
||||
/**
|
||||
* Determines the segment occupied by a certain script
|
||||
* @param[in] script_id The script in question
|
||||
* @param[in] load One of SCRIPT_GET_*
|
||||
* @return The script's segment, or 0 on failure
|
||||
*/
|
||||
SegmentId getSegment(int script_nr, SCRIPT_GET load);
|
||||
reg_t get_class_address(int classnr, SCRIPT_GET lock, reg_t caller);
|
||||
|
||||
|
||||
void heapRelocate(reg_t block);
|
||||
void scriptRelocateExportsSci11(SegmentId seg);
|
||||
|
|
|
@ -204,7 +204,7 @@ static void validate_write_var(reg_t *r, reg_t *stack_base, int type, int max, i
|
|||
#define GET_OP_SIGNED_FLEX() ((opcode & 1)? GET_OP_SIGNED_BYTE() : GET_OP_SIGNED_WORD())
|
||||
|
||||
ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackPtr sp, reg_t calling_obj, uint16 argc, StackPtr argp) {
|
||||
int seg = s->segMan->segGet(script);
|
||||
int seg = s->segMan->getScriptSegment(script);
|
||||
Script *scr = s->segMan->getScriptIfLoaded(seg);
|
||||
|
||||
if (!scr) // Script not present yet?
|
||||
|
@ -212,7 +212,7 @@ ExecStack *execute_method(EngineState *s, uint16 script, uint16 pubfunct, StackP
|
|||
else
|
||||
scr->unmarkDeleted();
|
||||
|
||||
int temp = s->segMan->validateExportFunc(pubfunct, seg);
|
||||
const int temp = s->segMan->validateExportFunc(pubfunct, seg);
|
||||
if (!temp) {
|
||||
error("Request for invalid exported function 0x%x of script 0x%x", pubfunct, script);
|
||||
return NULL;
|
||||
|
@ -1042,7 +1042,7 @@ void run_vm(EngineState *s, int restoring) {
|
|||
break;
|
||||
|
||||
case 0x28: // class
|
||||
s->r_acc = s->segMan->get_class_address((unsigned)opparams[0], SCRIPT_GET_LOCK,
|
||||
s->r_acc = s->segMan->getClassAddress((unsigned)opparams[0], SCRIPT_GET_LOCK,
|
||||
scriptState.xs->addr.pc);
|
||||
break;
|
||||
|
||||
|
@ -1062,7 +1062,7 @@ void run_vm(EngineState *s, int restoring) {
|
|||
break;
|
||||
|
||||
case 0x2b: // super
|
||||
r_temp = s->segMan->get_class_address(opparams[0], SCRIPT_GET_LOAD, scriptState.xs->addr.pc);
|
||||
r_temp = s->segMan->getClassAddress(opparams[0], SCRIPT_GET_LOAD, scriptState.xs->addr.pc);
|
||||
|
||||
if (!r_temp.segment)
|
||||
error("[VM]: Invalid superclass in object");
|
||||
|
@ -1506,11 +1506,11 @@ SelectorType lookup_selector(SegManager *segMan, reg_t obj_location, Selector se
|
|||
}
|
||||
|
||||
reg_t script_lookup_export(SegManager *segMan, int script_nr, int export_index) {
|
||||
SegmentId seg = segMan->getSegment(script_nr, SCRIPT_GET_DONT_LOAD);
|
||||
SegmentId seg = segMan->getScriptSegment(script_nr, SCRIPT_GET_DONT_LOAD);
|
||||
return make_reg(seg, segMan->validateExportFunc(export_index, seg));
|
||||
}
|
||||
|
||||
#define INST_LOOKUP_CLASS(id) ((id == 0xffff)? NULL_REG : segMan->get_class_address(id, SCRIPT_GET_LOCK, reg))
|
||||
#define INST_LOOKUP_CLASS(id) ((id == 0xffff)? NULL_REG : segMan->getClassAddress(id, SCRIPT_GET_LOCK, reg))
|
||||
|
||||
int script_instantiate_common(ResourceManager *resMan, SegManager *segMan, int script_nr, Resource **script, Resource **heap, int *was_new) {
|
||||
int seg_id;
|
||||
|
@ -1533,7 +1533,7 @@ int script_instantiate_common(ResourceManager *resMan, SegManager *segMan, int s
|
|||
return 0;
|
||||
}
|
||||
|
||||
seg_id = segMan->segGet(script_nr);
|
||||
seg_id = segMan->getScriptSegment(script_nr);
|
||||
Script *scr = segMan->getScriptIfLoaded(seg_id);
|
||||
if (scr) {
|
||||
if (!scr->isMarkedAsDeleted()) {
|
||||
|
@ -1821,7 +1821,7 @@ void script_uninstantiate_sci0(SegManager *segMan, int script_nr, SegmentId seg)
|
|||
}
|
||||
|
||||
void script_uninstantiate(SegManager *segMan, int script_nr) {
|
||||
SegmentId segment = segMan->segGet(script_nr);
|
||||
SegmentId segment = segMan->getScriptSegment(script_nr);
|
||||
Script *scr = segMan->getScriptIfLoaded(segment);
|
||||
|
||||
if (!scr) { // Is it already loaded?
|
||||
|
|
|
@ -344,7 +344,7 @@ ExecStack *send_selector(EngineState *s, reg_t send_obj, reg_t work_obj,
|
|||
StackPtr sp, int framesize, StackPtr argp);
|
||||
|
||||
|
||||
#define SCI_XS_CALLEE_LOCALS -1
|
||||
#define SCI_XS_CALLEE_LOCALS ((SegmentId)-1)
|
||||
|
||||
/**
|
||||
* Adds an entry to the top of the execution stack.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue