From 392fa7a43dba22c79a5dfec064496d0fa2c603d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Mon, 3 Sep 2018 15:30:12 +0200 Subject: [PATCH] [poincare] UninitializedGhost node Needed to look for its parent in replaceWithGhost --- poincare/Makefile | 1 + poincare/include/poincare/ghost_node.h | 2 +- .../poincare/uninitialized_ghost_node.h | 30 +++++++++++++++++++ poincare/src/addition.cpp | 3 +- poincare/src/ghost_node.cpp | 5 ++++ poincare/src/init.cpp | 5 +++- poincare/src/uninitialized_ghost_node.cpp | 10 +++++++ 7 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 poincare/include/poincare/uninitialized_ghost_node.h create mode 100644 poincare/src/uninitialized_ghost_node.cpp diff --git a/poincare/Makefile b/poincare/Makefile index c358a0709..c00337617 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -128,6 +128,7 @@ objs += $(addprefix poincare/src/,\ undefined.o\ uninitialized_evaluation_node.o\ uninitialized_expression_node.o\ + uninitialized_ghost_node.o\ uninitialized_layout_node.o\ variable_context.o\ ) diff --git a/poincare/include/poincare/ghost_node.h b/poincare/include/poincare/ghost_node.h index ac7f4c90f..b2b761f8a 100644 --- a/poincare/include/poincare/ghost_node.h +++ b/poincare/include/poincare/ghost_node.h @@ -22,7 +22,7 @@ public: static GhostNode * FailedAllocationStaticNode(); TreeNode * failedAllocationStaticNode() override { return FailedAllocationStaticNode(); } // Uninitialized - TreeNode * uninitializedStaticNode() const override { assert(false); return nullptr; } + TreeNode * uninitializedStaticNode() const override; }; class AllocationFailedGhostNode : public GhostNode { diff --git a/poincare/include/poincare/uninitialized_ghost_node.h b/poincare/include/poincare/uninitialized_ghost_node.h new file mode 100644 index 000000000..87b0fa521 --- /dev/null +++ b/poincare/include/poincare/uninitialized_ghost_node.h @@ -0,0 +1,30 @@ +#ifndef POINCARE_UNINITIALIZED_GHOST_NODE_H +#define POINCARE_UNINITIALIZED_GHOST_NODE_H + +#include +#include +#include + +namespace Poincare { + +class UninitializedGhostNode : public ExceptionNode { +public: + static UninitializedGhostNode * UninitializedGhostStaticNode(); + static int UninitializedGhostStaticNodeIdentifier() { return -3; } + + // TreeNode + bool isUninitialized() const override { return true; } + /* There is only one static node, that should never be inserted in the pool, + * so no need for an allocation failure. */ + TreeNode * failedAllocationStaticNode() override { assert(false); return nullptr; } + size_t size() const override { return sizeof(UninitializedGhostNode); } +#if POINCARE_TREE_LOG + virtual void logNodeName(std::ostream & stream) const override { + stream << "UninitializedGhost"; + } +#endif +}; + +} + +#endif diff --git a/poincare/src/addition.cpp b/poincare/src/addition.cpp index 67839711a..a146671dc 100644 --- a/poincare/src/addition.cpp +++ b/poincare/src/addition.cpp @@ -244,7 +244,8 @@ Expression Addition::shallowReduce(Context & context, Preferences::AngleUnit ang Expression result = squashUnaryHierarchy(); // Step 6: Last but not least, let's put everything under a common denominator - if (result == *this && parent().type() != ExpressionNode::Type::Addition) { + Expression p = parent(); + if (result == *this && !p.isUninitialized() && p.type() != ExpressionNode::Type::Addition) { // squashUnaryHierarchy didn't do anything: we're not an unary hierarchy result = factorizeOnCommonDenominator(context, angleUnit); } diff --git a/poincare/src/ghost_node.cpp b/poincare/src/ghost_node.cpp index 9853cdcab..20324ed2b 100644 --- a/poincare/src/ghost_node.cpp +++ b/poincare/src/ghost_node.cpp @@ -1,4 +1,5 @@ #include +#include #include namespace Poincare { @@ -9,4 +10,8 @@ GhostNode * GhostNode::FailedAllocationStaticNode() { return &failure; } +TreeNode * GhostNode::uninitializedStaticNode() const { + return UninitializedGhostNode::UninitializedGhostStaticNode(); +} + } diff --git a/poincare/src/init.cpp b/poincare/src/init.cpp index 1a16137e7..86c4186a9 100644 --- a/poincare/src/init.cpp +++ b/poincare/src/init.cpp @@ -1,6 +1,7 @@ #include #include #include +#include namespace Poincare { @@ -13,7 +14,9 @@ void init() { pool.registerStaticNode( UninitializedExpressionNode::UninitializedExpressionStaticNode(), UninitializedExpressionNode::UninitializedExpressionStaticNodeIdentifier()); - + pool.registerStaticNode( + UninitializedGhostNode::UninitializedGhostStaticNode(), + UninitializedGhostNode::UninitializedGhostStaticNodeIdentifier()); } } diff --git a/poincare/src/uninitialized_ghost_node.cpp b/poincare/src/uninitialized_ghost_node.cpp new file mode 100644 index 000000000..65fa893fd --- /dev/null +++ b/poincare/src/uninitialized_ghost_node.cpp @@ -0,0 +1,10 @@ +#include + +namespace Poincare { + +UninitializedGhostNode * UninitializedGhostNode::UninitializedGhostStaticNode() { + static UninitializedGhostNode exception; + return &exception; +} + +}