[Scummvm-cvs-logs] scummvm master -> 38098a0d0cf659ad6fa592528827e524e18c42f9

wjp wjp at usecode.org
Sat Dec 3 14:03:11 CET 2011


This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
ebc3ff5b92 DREAMWEB: Turn Segment into a class, make members private
91c9ecf7e1 DREAMWEB: Simplify SegmentRef class
b2fdf79c4a DREAMWEB: Make SegmentRef "immutable", add MutableSegmentRef subclass
38098a0d0c DREAMWEB: Make SegmentRef::operator= protected for extra immutability


Commit: ebc3ff5b929cdd90a3b086d173a034cf7f4de758
    https://github.com/scummvm/scummvm/commit/ebc3ff5b929cdd90a3b086d173a034cf7f4de758
Author: Max Horn (max at quendi.de)
Date: 2011-12-03T04:58:32-08:00

Commit Message:
DREAMWEB: Turn Segment into a class, make members private

Changed paths:
    engines/dreamweb/runtime.h



diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h
index cd171a0..21d6c43 100644
--- a/engines/dreamweb/runtime.h
+++ b/engines/dreamweb/runtime.h
@@ -117,9 +117,15 @@ public:
 	}
 };
 
-struct Segment {
+class Segment {
 	Common::Array<uint8> data;
 
+public:
+	Segment(uint size = 0) {
+		if (size > 0)
+			data.resize(size);
+	}
+
 	inline void assign(const uint8 *b, const uint8 *e) {
 		data.assign(b, e);
 	}
@@ -276,8 +282,7 @@ public:
 			_freeSegments.pop_front();
 		}
 		assert(!_segments.contains(id));
-		SegmentPtr seg(new Segment());
-		seg->data.resize(size);
+		SegmentPtr seg(new Segment(size));
 		_segments[id] = seg;
 		return SegmentRef(this, id, seg);
 	}


Commit: 91c9ecf7e1e335230cff6bebfa9f2a24e9f688cf
    https://github.com/scummvm/scummvm/commit/91c9ecf7e1e335230cff6bebfa9f2a24e9f688cf
Author: Max Horn (max at quendi.de)
Date: 2011-12-03T04:58:34-08:00

Commit Message:
DREAMWEB: Simplify SegmentRef class

Changed paths:
    engines/dreamweb/runtime.h



diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h
index 21d6c43..3fab4ec 100644
--- a/engines/dreamweb/runtime.h
+++ b/engines/dreamweb/runtime.h
@@ -158,19 +158,7 @@ public:
 	SegmentRef(Context *ctx, uint16 value = 0, SegmentPtr segment = SegmentPtr()): _context(ctx), _value(value), _segment(segment) {
 	}
 
-	inline void reset(uint16 value);
-
-	inline SegmentRef& operator=(const uint16 id) {
-		reset(id);
-		return *this;
-	}
-
-	inline SegmentRef& operator=(const SegmentRef &ref) {
-		_context = ref._context;
-		_value = ref._value;
-		_segment = ref._segment;
-		return *this;
-	}
+	inline SegmentRef& operator=(const uint16 id);
 
 	inline uint8 &byte(unsigned index) {
 		assert(_segment != 0);
@@ -259,10 +247,10 @@ public:
 	inline Context(): engine(0), al(ax), ah(ax), bl(bx), bh(bx), cl(cx), ch(cx), dl(dx), dh(dx),
 		cs(this), ds(this), es(this), data(this) {
 		_segments[kDefaultDataSegment] = SegmentPtr(new Segment());
-		cs.reset(kDefaultDataSegment);
-		ds.reset(kDefaultDataSegment);
-		es.reset(kDefaultDataSegment);
-		data.reset(kDefaultDataSegment);
+		cs = kDefaultDataSegment;
+		ds = kDefaultDataSegment;
+		es = kDefaultDataSegment;
+		data = kDefaultDataSegment;
 	}
 
 	SegmentRef getSegment(uint16 value) {
@@ -565,8 +553,9 @@ public:
 	}
 };
 
-inline void SegmentRef::reset(uint16 value) {
-	*this = _context->getSegment(value);
+inline SegmentRef& SegmentRef::operator=(const uint16 id) {
+	*this = _context->getSegment(id);
+	return *this;
 }
 
 class StackChecker {


Commit: b2fdf79c4a7fa1af38642e1435ac2d38a2d6ebad
    https://github.com/scummvm/scummvm/commit/b2fdf79c4a7fa1af38642e1435ac2d38a2d6ebad
Author: Max Horn (max at quendi.de)
Date: 2011-12-03T04:58:53-08:00

Commit Message:
DREAMWEB: Make SegmentRef "immutable", add MutableSegmentRef subclass

This way, the cs and data segment "pointers" can be clearly seen to be
invariant and equal. Moreover, SegmentRef instances no longer needs to
carry a pointer to the context object.

Changed paths:
    engines/dreamweb/runtime.h
    engines/dreamweb/stubs.cpp



diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h
index 3fab4ec..e700d29 100644
--- a/engines/dreamweb/runtime.h
+++ b/engines/dreamweb/runtime.h
@@ -150,16 +150,14 @@ typedef Common::SharedPtr<Segment> SegmentPtr;
 class Context;
 
 class SegmentRef {
-	Context		*_context;
 	uint16		_value;
 	SegmentPtr	_segment;
 
 public:
-	SegmentRef(Context *ctx, uint16 value = 0, SegmentPtr segment = SegmentPtr()): _context(ctx), _value(value), _segment(segment) {
+	SegmentRef(uint16 value = 0, SegmentPtr segment = SegmentPtr())
+	: _value(value), _segment(segment) {
 	}
 
-	inline SegmentRef& operator=(const uint16 id);
-
 	inline uint8 &byte(unsigned index) {
 		assert(_segment != 0);
 		return _segment->byte(index);
@@ -186,6 +184,19 @@ public:
 	}
 };
 
+class MutableSegmentRef : public SegmentRef {
+protected:
+	Context		*_context;
+
+public:
+	MutableSegmentRef(Context *ctx, uint16 value = 0, SegmentPtr segment = SegmentPtr())
+	: _context(ctx), SegmentRef(value, segment) {
+	}
+
+	inline MutableSegmentRef& operator=(const uint16 id);
+
+};
+
 struct Flags {
 	bool _z, _c, _s, _o;
 	inline Flags(): _z(true), _c(false), _s(false), _o(false) {}
@@ -240,25 +251,29 @@ public:
 	LowPartOfRegister	dl;
 	HighPartOfRegister	dh;
 
-	SegmentRef cs, ds, es, data;
-	//data == fake segment register always pointing to data segment
+	SegmentPtr _realData;	///< the primary data segment, points to a huge blob of binary data
+	SegmentRef cs;
+	MutableSegmentRef ds;
+	MutableSegmentRef es;
+	SegmentRef data;	///< fake segment register always pointing to data segment
 	Flags flags;
 
 	inline Context(): engine(0), al(ax), ah(ax), bl(bx), bh(bx), cl(cx), ch(cx), dl(dx), dh(dx),
-		cs(this), ds(this), es(this), data(this) {
-		_segments[kDefaultDataSegment] = SegmentPtr(new Segment());
-		cs = kDefaultDataSegment;
-		ds = kDefaultDataSegment;
-		es = kDefaultDataSegment;
-		data = kDefaultDataSegment;
+		_realData(new Segment()),
+		cs(kDefaultDataSegment, _realData),
+		ds(this, kDefaultDataSegment, _realData),
+		es(this, kDefaultDataSegment, _realData),
+		data(kDefaultDataSegment, _realData) {
+
+		_segments[kDefaultDataSegment] = _realData;
 	}
 
 	SegmentRef getSegment(uint16 value) {
 		SegmentMap::iterator i = _segments.find(value);
 		if (i != _segments.end())
-			return SegmentRef(this, value, i->_value);
+			return SegmentRef(value, i->_value);
 		else
-			return SegmentRef(this, value);
+			return SegmentRef(value);
 	}
 
 	SegmentRef allocateSegment(uint size) {
@@ -272,7 +287,7 @@ public:
 		assert(!_segments.contains(id));
 		SegmentPtr seg(new Segment(size));
 		_segments[id] = seg;
-		return SegmentRef(this, id, seg);
+		return SegmentRef(id, seg);
 	}
 
 	void deallocateSegment(uint16 id) {
@@ -553,8 +568,8 @@ public:
 	}
 };
 
-inline SegmentRef& SegmentRef::operator=(const uint16 id) {
-	*this = _context->getSegment(id);
+inline MutableSegmentRef& MutableSegmentRef::operator=(const uint16 id) {
+	SegmentRef::operator=(_context->getSegment(id));
 	return *this;
 }
 
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index a642858..bfd766c 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -632,7 +632,7 @@ void DreamGenContext::deallocateMem(uint16 segment) {
 	uint16 bseg = data.word(kBuffers);
 	if (!bseg)
 		return;
-	SegmentRef buffers(this);
+	MutableSegmentRef buffers(this);
 	buffers = bseg;
 	uint8 *ptr = buffers.ptr(kSpritetable, tsize);
 	for(uint i = 0; i < tsize; i += 32) {


Commit: 38098a0d0cf659ad6fa592528827e524e18c42f9
    https://github.com/scummvm/scummvm/commit/38098a0d0cf659ad6fa592528827e524e18c42f9
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-03T04:59:40-08:00

Commit Message:
DREAMWEB: Make SegmentRef::operator= protected for extra immutability

Changed paths:
    engines/dreamweb/runtime.h



diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h
index e700d29..002f2ab 100644
--- a/engines/dreamweb/runtime.h
+++ b/engines/dreamweb/runtime.h
@@ -182,6 +182,14 @@ public:
 		assert(_segment != 0);
 		return _segment->ptr(index, size);
 	}
+
+protected:
+	SegmentRef &operator=(const SegmentRef &seg) {
+		_value = seg._value;
+		_segment = seg._segment;
+		return *this;
+	}
+
 };
 
 class MutableSegmentRef : public SegmentRef {






More information about the Scummvm-git-logs mailing list