From e9e1867f2fe541b5b8ca41e6832e40638d272826 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Thu, 3 Mar 2022 21:05:10 +0100 Subject: [PATCH] FIX: Need to trick the IrElement::setParent to not dereference a nullptr in some cases... --- src/Lib/Script/Ast/IrElement.cc | 19 ++++++++++++++++--- src/Lib/Script/Ast/IrElement.hh | 7 ++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/Lib/Script/Ast/IrElement.cc b/src/Lib/Script/Ast/IrElement.cc index 5dd4c025..ecb036ae 100644 --- a/src/Lib/Script/Ast/IrElement.cc +++ b/src/Lib/Script/Ast/IrElement.cc @@ -7,10 +7,21 @@ namespace Vivy::Script { IrElement::IrElement(IrElement *p) noexcept { + /* + ** Need to trick the setParent or we might dereference a nullptr... Can't + ** think of a cleaner way for now. + */ + + parentRootIsNotInitialized = false; setParent(p); - parentRoot = parent()->irRoot(); - if (parentRoot == nullptr) - parentRoot = dynamic_cast<IrRoot *>(this); + parentRootIsNotInitialized = true; + + if (parent() != nullptr) { + parentRoot = parent()->irRoot(); + parentRootIsNotInitialized = false; + if (parentRoot == nullptr) + parentRoot = dynamic_cast<IrRoot *>(this); + } } IrRoot * @@ -90,6 +101,8 @@ IrElement::setParent(IrElement *p) noexcept parentElement = p; if (parentElement != nullptr) parentElement->addChild(this); + if (parentRootIsNotInitialized) + parentRoot = parent()->irRoot(); } void diff --git a/src/Lib/Script/Ast/IrElement.hh b/src/Lib/Script/Ast/IrElement.hh index 77d353c2..a496188d 100644 --- a/src/Lib/Script/Ast/IrElement.hh +++ b/src/Lib/Script/Ast/IrElement.hh @@ -106,9 +106,10 @@ concept IrElementParsable = std::is_base_of<IrElement, T>::value && requires(T i /* Base class definition: IrElement */ class IrElement { - IrElement *parentElement = nullptr; - IrAttribute *elementAttributes = nullptr; - IrRoot *parentRoot = nullptr; + IrElement *parentElement = nullptr; + IrAttribute *elementAttributes = nullptr; + IrRoot *parentRoot = nullptr; + bool parentRootIsNotInitialized = true; std::vector<IrElement *> childElements; protected: -- GitLab