[Scummvm-git-logs] scummvm master -> 95faebd5da03519df0618a03711fdfe9d54bd287

elasota noreply at scummvm.org
Wed Jan 3 05:52:36 UTC 2024


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

Summary:
3a006729bc MTROPOLIS: Fix unintended pass-by-value
95faebd5da MTROPOLIS: Fix DynamicValue constructing same-type objects instead of assigning


Commit: 3a006729bc186d6794bee53427eb29da9be9fb12
    https://github.com/scummvm/scummvm/commit/3a006729bc186d6794bee53427eb29da9be9fb12
Author: elasota (1137273+elasota at users.noreply.github.com)
Date: 2024-01-02T23:52:28-05:00

Commit Message:
MTROPOLIS: Fix unintended pass-by-value

Changed paths:
    engines/mtropolis/runtime.h


diff --git a/engines/mtropolis/runtime.h b/engines/mtropolis/runtime.h
index f8b360c17de..14bad5c0995 100644
--- a/engines/mtropolis/runtime.h
+++ b/engines/mtropolis/runtime.h
@@ -434,7 +434,7 @@ struct ObjectReference {
 	inline ObjectReference() {
 	}
 
-	inline explicit ObjectReference(const Common::WeakPtr<RuntimeObject> objectPtr) : object(objectPtr) {
+	inline explicit ObjectReference(const Common::WeakPtr<RuntimeObject> &objectPtr) : object(objectPtr) {
 	}
 
 	inline bool operator==(const ObjectReference &other) const {


Commit: 95faebd5da03519df0618a03711fdfe9d54bd287
    https://github.com/scummvm/scummvm/commit/95faebd5da03519df0618a03711fdfe9d54bd287
Author: elasota (1137273+elasota at users.noreply.github.com)
Date: 2024-01-03T00:52:05-05:00

Commit Message:
MTROPOLIS: Fix DynamicValue constructing same-type objects instead of assigning

Changed paths:
    engines/mtropolis/runtime.cpp
    engines/mtropolis/runtime.h


diff --git a/engines/mtropolis/runtime.cpp b/engines/mtropolis/runtime.cpp
index 61a46fd392f..1228e22e179 100644
--- a/engines/mtropolis/runtime.cpp
+++ b/engines/mtropolis/runtime.cpp
@@ -1127,6 +1127,18 @@ void DynamicValue::ValueUnion::construct(T &&value) {
 	new (field) T(static_cast<T&&>(value));
 }
 
+template<class T, T(DynamicValue::ValueUnion::*TMember)>
+void DynamicValue::ValueUnion::assign(const T &value) {
+	T *field = &(this->*TMember);
+	*field = value;
+}
+
+template<class T, T(DynamicValue::ValueUnion::*TMember)>
+void DynamicValue::ValueUnion::assign(T &&value) {
+	T *field = &(this->*TMember);
+	*field = static_cast<T &&>(value);
+}
+
 template<class T, T(DynamicValue::ValueUnion::*TMember)>
 void DynamicValue::ValueUnion::destruct() {
 	T *field = &(this->*TMember);
@@ -1311,81 +1323,114 @@ const DynamicValueWriteProxy &DynamicValue::getWriteProxy() const {
 }
 
 void DynamicValue::setInt(int32 value) {
-	if (_type != DynamicValueTypes::kInteger)
+	if (_type != DynamicValueTypes::kInteger) {
 		clear();
-	_type = DynamicValueTypes::kInteger;
-	_value.construct<int32, &ValueUnion::asInt>(value);
+		_type = DynamicValueTypes::kInteger;
+		_value.construct<int32, &ValueUnion::asInt>(value);
+	} else {
+		_value.assign<int32, &ValueUnion::asInt>(value);
+	}
 }
 
 void DynamicValue::setFloat(double value) {
-	if (_type != DynamicValueTypes::kFloat)
+	if (_type != DynamicValueTypes::kFloat) {
 		clear();
-	_type = DynamicValueTypes::kFloat;
-	_value.construct<double, &ValueUnion::asFloat>(value);
+		_type = DynamicValueTypes::kFloat;
+		_value.construct<double, &ValueUnion::asFloat>(value);
+	} else {
+		_value.assign<double, &ValueUnion::asFloat>(value);
+	}
 }
 
 void DynamicValue::setPoint(const Common::Point &value) {
-	if (_type != DynamicValueTypes::kPoint)
+	if (_type != DynamicValueTypes::kPoint) {
 		clear();
-	_type = DynamicValueTypes::kPoint;
-	_value.construct<Common::Point, &ValueUnion::asPoint>(value);
+		_type = DynamicValueTypes::kPoint;
+		_value.construct<Common::Point, &ValueUnion::asPoint>(value);
+	} else {
+		_value.assign<Common::Point, &ValueUnion::asPoint>(value);
+	}
 }
 
 void DynamicValue::setIntRange(const IntRange &value) {
-	if (_type != DynamicValueTypes::kIntegerRange)
+	if (_type != DynamicValueTypes::kIntegerRange) {
 		clear();
-	_type = DynamicValueTypes::kIntegerRange;
-	_value.construct<IntRange, &ValueUnion::asIntRange>(value);
+		_type = DynamicValueTypes::kIntegerRange;
+		_value.construct<IntRange, &ValueUnion::asIntRange>(value);
+	} else {
+		_value.assign<IntRange, &ValueUnion::asIntRange>(value);
+	}
 }
 
 void DynamicValue::setVector(const AngleMagVector &value) {
-	if (_type != DynamicValueTypes::kVector)
+	if (_type != DynamicValueTypes::kVector) {
 		clear();
-	_type = DynamicValueTypes::kVector;
-	_value.construct<AngleMagVector, &ValueUnion::asVector>(value);
+		_type = DynamicValueTypes::kVector;
+		_value.construct<AngleMagVector, &ValueUnion::asVector>(value);
+	} else {
+		_value.assign<AngleMagVector, &ValueUnion::asVector>(value);
+	}
 }
 
 void DynamicValue::setLabel(const Label &value) {
-	if (_type != DynamicValueTypes::kLabel)
+	if (_type != DynamicValueTypes::kLabel) {
 		clear();
-	_type = DynamicValueTypes::kLabel;
-	_value.construct<Label, &ValueUnion::asLabel>(value);
+		_type = DynamicValueTypes::kLabel;
+		_value.construct<Label, &ValueUnion::asLabel>(value);
+	} else {
+		_value.assign<Label, &ValueUnion::asLabel>(value);
+	}
 }
 
 void DynamicValue::setEvent(const Event &value) {
-	if (_type != DynamicValueTypes::kEvent)
+	if (_type != DynamicValueTypes::kEvent) {
 		clear();
-	_type = DynamicValueTypes::kEvent;
-	_value.construct<Event, &ValueUnion::asEvent>(value);
+		_type = DynamicValueTypes::kEvent;
+		_value.construct<Event, &ValueUnion::asEvent>(value);
+	} else {
+		_value.assign<Event, &ValueUnion::asEvent>(value);
+	}
 }
 
 void DynamicValue::setString(const Common::String &value) {
-	if (_type != DynamicValueTypes::kString)
+	if (_type != DynamicValueTypes::kString) {
 		clear();
-	_type = DynamicValueTypes::kString;
-	_value.construct<Common::String, &ValueUnion::asString>(value);
+		_type = DynamicValueTypes::kString;
+		_value.construct<Common::String, &ValueUnion::asString>(value);
+	} else {
+		_value.assign<Common::String, &ValueUnion::asString>(value);
+	}
 }
 
 void DynamicValue::setBool(bool value) {
-	if (_type != DynamicValueTypes::kBoolean)
+	if (_type != DynamicValueTypes::kBoolean) {
 		clear();
-	_type = DynamicValueTypes::kBoolean;
-	_value.construct<bool, &ValueUnion::asBool>(value);
+		_type = DynamicValueTypes::kBoolean;
+		_value.construct<bool, &ValueUnion::asBool>(value);
+	} else {
+		_value.assign<bool, &ValueUnion::asBool>(value);
+	}
 }
 
 void DynamicValue::setList(const Common::SharedPtr<DynamicList> &value) {
-	if (_type != DynamicValueTypes::kList)
+	if (_type != DynamicValueTypes::kList) {
 		clear();
-	_type = DynamicValueTypes::kList;
-	_value.construct<Common::SharedPtr<DynamicList>, &ValueUnion::asList>(value);
+		_type = DynamicValueTypes::kList;
+		_value.construct<Common::SharedPtr<DynamicList>, &ValueUnion::asList>(value);
+	} else {
+		_value.assign<Common::SharedPtr<DynamicList>, &ValueUnion::asList>(value);
+	}
 }
 
 void DynamicValue::setWriteProxy(const DynamicValueWriteProxy &writeProxy) {
 	Common::SharedPtr<DynamicList> listRef = writeProxy.containerList; // Back up list ref in case this is a self-assign
-	if (_type != DynamicValueTypes::kWriteProxy)
+	if (_type != DynamicValueTypes::kWriteProxy) {
 		clear();
-	_type = DynamicValueTypes::kWriteProxy;
-	_value.construct<DynamicValueWriteProxy, &ValueUnion::asWriteProxy>(writeProxy);
+		_type = DynamicValueTypes::kWriteProxy;
+		_value.construct<DynamicValueWriteProxy, &ValueUnion::asWriteProxy>(writeProxy);
+	} else {
+		_value.assign<DynamicValueWriteProxy, &ValueUnion::asWriteProxy>(writeProxy);
+	}
 }
 
 bool DynamicValue::roundToInt(int32 &outInt) const {
@@ -1476,10 +1521,13 @@ bool DynamicValue::convertToTypeNoDereference(DynamicValueTypes::DynamicValueTyp
 }
 
 void DynamicValue::setObject(const ObjectReference &value) {
-	if (_type != DynamicValueTypes::kObject)
+	if (_type != DynamicValueTypes::kObject) {
 		clear();
-	_type = DynamicValueTypes::kObject;
-	_value.construct<ObjectReference, &ValueUnion::asObj>(value);
+		_type = DynamicValueTypes::kObject;
+		_value.construct<ObjectReference, &ValueUnion::asObj>(value);
+	} else {
+		_value.assign<ObjectReference, &ValueUnion::asObj>(value);
+	}
 }
 
 void DynamicValue::setObject(const Common::WeakPtr<RuntimeObject> &value) {
diff --git a/engines/mtropolis/runtime.h b/engines/mtropolis/runtime.h
index 14bad5c0995..034daae98e3 100644
--- a/engines/mtropolis/runtime.h
+++ b/engines/mtropolis/runtime.h
@@ -904,6 +904,12 @@ private:
 		template<class T, T(ValueUnion::*TMember)>
 		void construct(T &&value);
 
+		template<class T, T(ValueUnion::*TMember)>
+		void assign(const T &value);
+
+		template<class T, T(ValueUnion::*TMember)>
+		void assign(T &&value);
+
 		template<class T, T(ValueUnion::*TMember)>
 		void destruct();
 	};




More information about the Scummvm-git-logs mailing list