[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