[Scummvm-cvs-logs] SF.net SVN: scummvm:[40161] scummvm/trunk/engines/sci/engine
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Mon Apr 27 14:31:28 CEST 2009
Revision: 40161
http://scummvm.svn.sourceforge.net/scummvm/?rev=40161&view=rev
Author: fingolfin
Date: 2009-04-27 12:31:27 +0000 (Mon, 27 Apr 2009)
Log Message:
-----------
SCI: Turned classtable into a Common::Array<Class>
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/game.cpp
scummvm/trunk/engines/sci/engine/savegame.cpp
scummvm/trunk/engines/sci/engine/scriptdebug.cpp
scummvm/trunk/engines/sci/engine/seg_manager.cpp
scummvm/trunk/engines/sci/engine/state.cpp
scummvm/trunk/engines/sci/engine/state.h
scummvm/trunk/engines/sci/engine/vm.cpp
Modified: scummvm/trunk/engines/sci/engine/game.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/game.cpp 2009-04-27 12:30:42 UTC (rev 40160)
+++ scummvm/trunk/engines/sci/engine/game.cpp 2009-04-27 12:31:27 UTC (rev 40161)
@@ -268,12 +268,10 @@
Resource *vocab996 = s->resmgr->findResource(kResourceTypeVocab, 996, 1);
if (!vocab996)
- s->classtable_size = 20;
+ s->_classtable.resize(20);
else
- s->classtable_size = vocab996->size >> 2;
+ s->_classtable.resize(vocab996->size >> 2);
- s->classtable = (Class*)sci_calloc(sizeof(Class), s->classtable_size);
-
for (scriptnr = 0; scriptnr < 1000; scriptnr++) {
Resource *heap = s->resmgr->findResource(kResourceTypeHeap, scriptnr, 0);
@@ -286,23 +284,19 @@
while (READ_LE_UINT16((byte*)seeker_ptr) == SCRIPT_OBJECT_MAGIC_NUMBER) {
if (READ_LE_UINT16((byte*)seeker_ptr + 14) & SCRIPT_INFO_CLASS) {
classnr = READ_LE_UINT16((byte*)seeker_ptr + 10);
- if (classnr >= s->classtable_size) {
+ if (classnr >= (int)s->_classtable.size()) {
if (classnr >= SCRIPT_MAX_CLASSTABLE_SIZE) {
- fprintf(stderr, "Invalid class number 0x%x in script.%d(0x%x), offset %04x\n",
+ warning("Invalid class number 0x%x in script.%d(0x%x), offset %04x\n",
classnr, scriptnr, scriptnr, seeker_offset);
return 1;
}
- s->classtable = (Class*)sci_realloc(s->classtable, sizeof(Class) * (classnr + 1));
- // Clear after resize
- memset(&(s->classtable[s->classtable_size]), 0, sizeof(Class) * (1 + classnr - s->classtable_size));
-
- s->classtable_size = classnr + 1; // Adjust maximum number of entries
+ s->_classtable.resize(classnr + 1); // Adjust maximum number of entries
}
- s->classtable[classnr].reg.offset = seeker_offset;
- s->classtable[classnr].reg.segment = 0;
- s->classtable[classnr].script = scriptnr;
+ s->_classtable[classnr].reg.offset = seeker_offset;
+ s->_classtable[classnr].reg.segment = 0;
+ s->_classtable[classnr].script = scriptnr;
}
seeker_ptr += READ_LE_UINT16((byte*)seeker_ptr + 2) * 2;
@@ -323,12 +317,10 @@
Resource *vocab996 = s->resmgr->findResource(kResourceTypeVocab, 996, 1);
if (!vocab996)
- s->classtable_size = 20;
+ s->_classtable.resize(20);
else
- s->classtable_size = vocab996->size >> 2;
+ s->_classtable.resize(vocab996->size >> 2);
- s->classtable = (Class*)sci_calloc(sizeof(Class), s->classtable_size);
-
for (scriptnr = 0; scriptnr < 1000; scriptnr++) {
int objtype = 0;
Resource *script = s->resmgr->findResource(kResourceTypeScript, scriptnr, 0);
@@ -347,8 +339,8 @@
break;
seeker += (int16)READ_LE_UINT16(script->data + seeker + 2);
if (seeker <= lastseeker) {
- sciprintf("Warning: Script version is invalid.\n");
- free(s->classtable);
+ warning("Script version is invalid");
+ s->_classtable.clear();
return SCI_ERROR_INVALID_SCRIPT_VERSION;
}
}
@@ -359,30 +351,26 @@
seeker -= SCRIPT_OBJECT_MAGIC_OFFSET; // Adjust position; script home is base +8 bytes
classnr = (int16)READ_LE_UINT16(script->data + seeker + 4 + SCRIPT_SPECIES_OFFSET);
- if (classnr >= s->classtable_size) {
+ if (classnr >= (int)s->_classtable.size()) {
if (classnr >= SCRIPT_MAX_CLASSTABLE_SIZE) {
- fprintf(stderr, "Invalid class number 0x%x in script.%d(0x%x), offset %04x\n",
+ warning("Invalid class number 0x%x in script.%d(0x%x), offset %04x\n",
classnr, scriptnr, scriptnr, seeker);
return 1;
}
- s->classtable = (Class*)sci_realloc(s->classtable, sizeof(Class) * (classnr + 1));
- // Clear after resize
- memset(&(s->classtable[s->classtable_size]), 0, sizeof(Class) * (1 + classnr - s->classtable_size));
-
- s->classtable_size = classnr + 1; // Adjust maximum number of entries
+ s->_classtable.resize(classnr + 1); // Adjust maximum number of entries
}
sugg_script = suggested_script(vocab996, classnr);
// First, test whether the script hasn't been claimed, or if it's been claimed by the wrong script
- if (sugg_script == -1 || scriptnr == sugg_script /*|| !s->classtable[classnr].reg.segment*/) {
+ if (sugg_script == -1 || scriptnr == sugg_script /*|| !s->_classtable[classnr].reg.segment*/) {
// Now set the home script of the class
- s->classtable[classnr].reg.offset = seeker + 4 - magic_offset;
- s->classtable[classnr].reg.segment = 0;
- s->classtable[classnr].script = scriptnr;
+ s->_classtable[classnr].reg.offset = seeker + 4 - magic_offset;
+ s->_classtable[classnr].reg.segment = 0;
+ s->_classtable[classnr].script = scriptnr;
}
seeker += SCRIPT_OBJECT_MAGIC_OFFSET; // Re-adjust position
@@ -513,8 +501,7 @@
sciprintf("Freeing VM memory\n");
s->save_dir_copy_buf = NULL;
- free(s->classtable);
- s->classtable = NULL;
+ s->_classtable.clear();
// Close all opened file handles
s->_fileHandles.clear();
Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp 2009-04-27 12:30:42 UTC (rev 40160)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp 2009-04-27 12:31:27 UTC (rev 40161)
@@ -25,6 +25,7 @@
#include "common/stream.h"
#include "common/system.h"
+#include "common/func.h"
#include "common/serializer.h"
#include <time.h> // FIXME: For struct tm
@@ -129,6 +130,22 @@
}
}
+template<typename T>
+void syncArray(Common::Serializer &s, Common::Array<T> &arr, const Common::Functor2<Common::Serializer &, T &, void> &func) {
+ uint len = arr.size();
+ s.syncAsUint32LE(len);
+
+ // Resize the array if loading.
+ if (s.isLoading())
+ arr.resize(len);
+
+ typename Common::Array<T>::iterator i;
+ for (i = arr.begin(); i != arr.end(); ++i) {
+ func(s, *i);
+ }
+}
+
+
void MenuItem::saveLoadWithSerializer(Common::Serializer &s) {
s.syncAsSint32LE(_type);
s.syncString(_keytext);
@@ -241,13 +258,9 @@
sync_SegManagerPtr(s, seg_manager);
- s.syncAsSint32LE(classtable_size);
+ Common::Functor2Fun<Common::Serializer &, Class &, void> tmp(sync_Class);
+ syncArray<Class>(s, _classtable, tmp);
- if (!classtable && classtable_size)
- classtable = (Class *)sci_calloc(classtable_size, sizeof(Class));
- for (int i = 0; i < classtable_size; ++i)
- sync_Class(s, classtable[i]);
-
sync_sfx_state_t(s, sound);
}
Modified: scummvm/trunk/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/scriptdebug.cpp 2009-04-27 12:30:42 UTC (rev 40160)
+++ scummvm/trunk/engines/sci/engine/scriptdebug.cpp 2009-04-27 12:31:27 UTC (rev 40161)
@@ -83,8 +83,8 @@
char inputbuf[256] = "";
#define LOOKUP_SPECIES(species) (\
- (species >= 1000) ? species : *(s->classtable[species].scriptposp) \
- + s->classtable[species].class_offset)
+ (species >= 1000) ? species : *(s->_classtable[species].scriptposp) \
+ + s->_classtable[species].class_offset)
const char *_debug_get_input_default() {
char newinpbuf[256];
@@ -830,17 +830,15 @@
}
int c_classtable(EngineState *s) {
- int i;
-
if (!_debugstate_valid) {
sciprintf("Not in debug state\n");
return 1;
}
sciprintf("Available classes:\n");
- for (i = 0; i < s->classtable_size; i++)
- if (s->classtable[i].reg.segment)
- sciprintf(" Class 0x%x at "PREG" (script 0x%x)\n", i, PRINT_REG(s->classtable[i].reg), s->classtable[i].script);
+ for (uint i = 0; i < s->_classtable.size(); i++)
+ if (s->_classtable[i].reg.segment)
+ sciprintf(" Class 0x%x at "PREG" (script 0x%x)\n", i, PRINT_REG(s->_classtable[i].reg), s->_classtable[i].script);
return 0;
}
Modified: scummvm/trunk/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.cpp 2009-04-27 12:30:42 UTC (rev 40160)
+++ scummvm/trunk/engines/sci/engine/seg_manager.cpp 2009-04-27 12:31:27 UTC (rev 40161)
@@ -1127,16 +1127,16 @@
int classpos = seeker - scr->buf;
int species = READ_LE_UINT16(seeker + 10);
- if (species < 0 || species >= s->classtable_size) {
+ if (species < 0 || species >= (int)s->_classtable.size()) {
sciprintf("Invalid species %d(0x%x) not in interval [0,%d) while instantiating script %d\n",
- species, species, s->classtable_size, scr->nr);
+ species, species, s->_classtable.size(), scr->nr);
script_debug_flag = script_error_flag = 1;
return;
}
- s->classtable[species].script = scr->nr;
- s->classtable[species].reg.segment = seg;
- s->classtable[species].reg.offset = classpos;
+ s->_classtable[species].script = scr->nr;
+ s->_classtable[species].reg.segment = seg;
+ s->_classtable[species].reg.offset = classpos;
}
seeker += READ_LE_UINT16(seeker + 2) * 2;
}
Modified: scummvm/trunk/engines/sci/engine/state.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/state.cpp 2009-04-27 12:30:42 UTC (rev 40160)
+++ scummvm/trunk/engines/sci/engine/state.cpp 2009-04-27 12:31:27 UTC (rev 40161)
@@ -146,9 +146,6 @@
game_obj = NULL_REG;
- classtable_size = 0;
- classtable = 0;
-
seg_manager = 0;
gc_countdown = 0;
Modified: scummvm/trunk/engines/sci/engine/state.h
===================================================================
--- scummvm/trunk/engines/sci/engine/state.h 2009-04-27 12:30:42 UTC (rev 40160)
+++ scummvm/trunk/engines/sci/engine/state.h 2009-04-27 12:31:27 UTC (rev 40161)
@@ -259,8 +259,7 @@
reg_t game_obj; /**< Pointer to the game object */
- int classtable_size; /**< Number of classes in the table- for debugging */
- Class *classtable; /**< Table of all classes */
+ Common::Array<Class> _classtable; /**< Table of all classes */
SegManager *seg_manager;
int gc_countdown; /**< Number of kernel calls until next gc */
Modified: scummvm/trunk/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/vm.cpp 2009-04-27 12:30:42 UTC (rev 40160)
+++ scummvm/trunk/engines/sci/engine/vm.cpp 2009-04-27 12:31:27 UTC (rev 40161)
@@ -199,24 +199,24 @@
#define CORE_ERROR(area, msg) script_error(s, "[" area "] " __FILE__, __LINE__, msg)
reg_t get_class_address(EngineState *s, int classnr, int lock, reg_t caller) {
- Class *the_class = s->classtable + classnr;
if (NULL == s) {
- sciprintf("vm.c: get_class_address(): NULL passed for \"s\"\n");
+ warning("vm.c: get_class_address(): NULL passed for \"s\"");
return NULL_REG;
}
- if (classnr < 0 || s->classtable_size <= classnr || the_class->script < 0) {
- sciprintf("[VM] Attempt to dereference class %x, which doesn't exist (max %x)\n", classnr, s->classtable_size);
+ if (classnr < 0 || (int)s->_classtable.size() <= classnr || s->_classtable[classnr].script < 0) {
+ warning("[VM] Attempt to dereference class %x, which doesn't exist (max %x)", classnr, s->_classtable.size());
script_error_flag = script_debug_flag = 1;
return NULL_REG;
} else {
+ Class *the_class = &s->_classtable[classnr];
if (!the_class->reg.segment) {
script_get_segment(s, the_class->script, lock);
if (!the_class->reg.segment) {
- sciprintf("[VM] Trying to instantiate class %x by instantiating script 0x%x (%03d) failed;"
- " Entering debugger.\n", classnr, the_class->script, the_class->script);
+ warning("[VM] Trying to instantiate class %x by instantiating script 0x%x (%03d) failed;"
+ " Entering debugger.", classnr, the_class->script, the_class->script);
script_error_flag = script_debug_flag = 1;
return NULL_REG;
}
@@ -1811,18 +1811,18 @@
int species;
reg_tmp.offset = addr.offset - SCRIPT_OBJECT_MAGIC_OFFSET;
species = OBJ_SPECIES(s, reg_tmp);
- if (species < 0 || species >= s->classtable_size) {
+ if (species < 0 || species >= (int)s->_classtable.size()) {
sciprintf("Invalid species %d(0x%x) not in interval "
"[0,%d) while instantiating script %d\n",
- species, species, s->classtable_size,
+ species, species, s->_classtable.size(),
script_nr);
script_debug_flag = script_error_flag = 1;
return 1;
}
- s->classtable[species].script = script_nr;
- s->classtable[species].reg = addr;
- s->classtable[species].reg.offset = classpos;
+ s->_classtable[species].script = script_nr;
+ s->_classtable[species].reg = addr;
+ s->_classtable[species].reg.offset = classpos;
// Set technical class position-- into the block allocated for it
}
break;
@@ -1952,7 +1952,7 @@
superclass = OBJ_SUPERCLASS(s, reg); // Get superclass...
if (superclass >= 0) {
- int superclass_script = s->classtable[superclass].script;
+ int superclass_script = s->_classtable[superclass].script;
if (superclass_script == script_nr) {
if (s->seg_manager->getLockers(reg.segment, SEG_ID))
@@ -1972,7 +1972,6 @@
void script_uninstantiate(EngineState *s, int script_nr) {
reg_t reg = make_reg(0, (s->version < SCI_VERSION_FTU_NEW_SCRIPT_HEADER) ? 2 : 0);
- int i;
reg.segment = s->seg_manager->segGet(script_nr);
@@ -1988,9 +1987,9 @@
return;
// Free all classtable references to this script
- for (i = 0; i < s->classtable_size; i++)
- if (s->classtable[i].reg.segment == reg.segment)
- s->classtable[i].reg = NULL_REG;
+ for (uint i = 0; i < s->_classtable.size(); i++)
+ if (s->_classtable[i].reg.segment == reg.segment)
+ s->_classtable[i].reg = NULL_REG;
if (s->version < SCI_VERSION(1, 001, 000))
script_uninstantiate_sci0(s, script_nr, reg.segment);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list