kern: fix bug in up/downcasting of scoped auto objects

This commit is contained in:
Michael Scire 2020-07-16 20:40:59 -07:00 committed by SciresM
parent 8d507aa5a1
commit fae2daf77c
2 changed files with 12 additions and 15 deletions

View File

@ -204,15 +204,20 @@ namespace ams::kern {
this->obj = nullptr;
}
template<typename U>
template<typename U> requires (std::derived_from<T, U> || std::derived_from<U, T>)
constexpr ALWAYS_INLINE KScopedAutoObject(KScopedAutoObject<U> &&rhs) {
if constexpr (std::same_as<T, U>) {
if constexpr (std::derived_from<U, T>) {
/* Upcast. */
this->obj = rhs.obj;
rhs.obj = nullptr;
} else {
T *derived = rhs.obj->template DynamicCast<T *>();
if (derived == nullptr) {
rhs.obj->Close();
/* Downcast. */
T *derived = nullptr;
if (rhs.obj != nullptr) {
derived = rhs.obj->template DynamicCast<T *>();
if (derived == nullptr) {
rhs.obj->Close();
}
}
this->obj = derived;
@ -220,16 +225,7 @@ namespace ams::kern {
}
}
template<typename U>
constexpr ALWAYS_INLINE KScopedAutoObject &operator=(KScopedAutoObject<U> &&rhs) {
if constexpr (!std::same_as<T, U>) {
T *derived = rhs.obj->template DynamicCast<T *>();
if (derived == nullptr) {
rhs.obj->Close();
}
rhs.obj = nullptr;
}
constexpr ALWAYS_INLINE KScopedAutoObject<T> &operator=(KScopedAutoObject<T> &&rhs) {
rhs.Swap(*this);
return *this;
}

View File

@ -252,6 +252,7 @@ namespace ams::kern {
/* Switch the current process, if we're switching processes. */
if (KProcess *next_process = next_thread->GetOwnerProcess(); next_process != cur_process) {
MESOSPHERE_LOG("!!! PROCESS SWITCH !!! %s -> %s\n", cur_process != nullptr ? cur_process->GetName() : nullptr, next_process != nullptr ? next_process->GetName() : nullptr);
KProcess::Switch(cur_process, next_process);
}