diff options
| -rw-r--r-- | engines/sci/engine/seg_manager.cpp | 65 | ||||
| -rw-r--r-- | engines/sci/engine/vm.h | 63 | 
2 files changed, 57 insertions, 71 deletions
| diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index 20470b8ebc..eae4bb5590 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -971,71 +971,6 @@ uint16 SegManager::validateExportFunc(int pubfunct, int seg) {  	return offset;  } -template<typename T, int INITIAL, int INCREMENT> -Table<T, INITIAL, INCREMENT>::Table() { -	entries_nr = 0; -	max_entry = 0; -	entries_used = 0; -	first_free = HEAPENTRY_INVALID; -	table = NULL; -} - -template<typename T, int INITIAL, int INCREMENT> -Table<T, INITIAL, INCREMENT>::~Table() { -	// FIXME: Shouldn't we make sure that all table entries are disposed -	// of properly? -	free(table); -	table = NULL; -	entries_nr = max_entry = 0; -} - -template<typename T, int INITIAL, int INCREMENT> -void Table<T, INITIAL, INCREMENT>::initTable() { -	entries_nr = INITIAL; -	max_entry = 0; -	entries_used = 0; -	first_free = HEAPENTRY_INVALID; -	table = (Entry *)calloc(INITIAL, sizeof(Entry)); -} - -template<typename T, int INITIAL, int INCREMENT> -int	Table<T, INITIAL, INCREMENT>::allocEntry() { -	entries_used++; -	if (first_free != HEAPENTRY_INVALID) { -		int oldff = first_free; -		first_free = table[oldff].next_free; - -		table[oldff].next_free = oldff; -		return oldff; -	} else { -		if (max_entry == entries_nr) { -			entries_nr += INCREMENT; - -			table = (Entry *)sci_realloc(table,  sizeof(Entry) * entries_nr); -			memset(&table[entries_nr-INCREMENT], 0, INCREMENT * sizeof(Entry)); -		} -		table[max_entry].next_free = max_entry; /* Tag as 'valid' */ -		return max_entry++; -	} -} - -template<typename T, int INITIAL, int INCREMENT> -void Table<T, INITIAL, INCREMENT>::freeEntry(int idx) { -	if (idx < 0 || idx >= max_entry) { -		error("Table::freeEntry: Attempt to release invalid table index %d", idx); -	} - -	table[idx].next_free = first_free; -	first_free = idx; -	entries_used--; -} - -template<typename T, int INITIAL, int INCREMENT> -bool Table<T, INITIAL, INCREMENT>::isValidEntry(int idx) { -	return idx >= 0 && idx < max_entry && table[idx].next_free == idx; -} - -  void SegManager::free_hunk_entry(reg_t addr) {  	HunkTable *ht = (HunkTable *)GET_SEGMENT(*this, addr.segment, MEM_OBJ_HUNK); diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 49422f23d5..cb08f10cb2 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -32,6 +32,8 @@  #include "sci/scicore/versions.h"	// for sci_version_t  #include "sci/engine/vm_types.h"	// for reg_t +#include "common/util.h" +  namespace Sci {  enum MemObjectType { @@ -408,13 +410,62 @@ struct Table : public MemObject {  	Entry *table;  public: -	Table(); -	~Table(); +	Table() { +		entries_nr = 0; +		max_entry = 0; +		entries_used = 0; +		first_free = HEAPENTRY_INVALID; +		table = NULL; +	} -	void initTable(); -	int	allocEntry(); -	bool isValidEntry(int idx); -	virtual void freeEntry(int idx); +	~Table() { +		// FIXME: Shouldn't we make sure that all table entries are disposed +		// of properly? +		free(table); +		table = NULL; +		entries_nr = max_entry = 0; +	} + +	void initTable() { +		entries_nr = INITIAL; +		max_entry = 0; +		entries_used = 0; +		first_free = HEAPENTRY_INVALID; +		table = (Entry *)calloc(INITIAL, sizeof(Entry)); +	} + +	int allocEntry() { +		entries_used++; +		if (first_free != HEAPENTRY_INVALID) { +			int oldff = first_free; +			first_free = table[oldff].next_free; + +			table[oldff].next_free = oldff; +			return oldff; +		} else { +			if (max_entry == entries_nr) { +				entries_nr += INCREMENT; + +				table = (Entry *)sci_realloc(table,  sizeof(Entry) * entries_nr); +				memset(&table[entries_nr-INCREMENT], 0, INCREMENT * sizeof(Entry)); +			} +			table[max_entry].next_free = max_entry; /* Tag as 'valid' */ +			return max_entry++; +		} +	} + +	bool isValidEntry(int idx) { +		return idx >= 0 && idx < max_entry && table[idx].next_free == idx; +	} + +	virtual void freeEntry(int idx) { +		if (idx < 0 || idx >= max_entry) +			::error("Table::freeEntry: Attempt to release invalid table index %d", idx); + +		table[idx].next_free = first_free; +		first_free = idx; +		entries_used--; +	}  //	virtual void saveLoadWithSerializer(Common::Serializer &ser);  }; | 
