Fixes bug 781. Copy constructor for Expr needed to set the NodeManagerScope.
authorTim King <taking@google.com>
Thu, 16 Mar 2017 21:06:17 +0000 (14:06 -0700)
committerTim King <taking@google.com>
Thu, 16 Mar 2017 21:06:17 +0000 (14:06 -0700)
src/expr/expr_template.cpp
src/expr/type.cpp

index dad437bc641954c40bd8e28892a23fba4a73e2fb..4fbb0cd336a56b34c465b9ab61ca08d3cb4d3f11 100644 (file)
@@ -82,16 +82,22 @@ Expr TypeCheckingException::getExpression() const throw() {
 Expr::Expr() :
   d_node(new Node),
   d_exprManager(NULL) {
+  // We do not need to wrap this in an ExprManagerScope as `new Node` is backed
+  // by NodeValue::null which is a static outside of a NodeManager.
 }
 
 Expr::Expr(ExprManager* em, Node* node) :
   d_node(node),
   d_exprManager(em) {
+  // We do not need to wrap this in an ExprManagerScope as this only initializes
+  // pointers
 }
 
 Expr::Expr(const Expr& e) :
-  d_node(new Node(*e.d_node)),
+  d_node(NULL),
   d_exprManager(e.d_exprManager) {
+  ExprManagerScope ems(*this);
+  d_node = new Node(*e.d_node);
 }
 
 Expr::~Expr() {
index 5f62317eeae2f6cf7cbce95d295d1a7ddd96731c..6ce7b0a183c4d73148062f85c014d084d477b712 100644 (file)
@@ -37,24 +37,25 @@ Type Type::makeType(const TypeNode& typeNode) const {
   return Type(d_nodeManager, new TypeNode(typeNode));
 }
 
-Type::Type(NodeManager* nm, TypeNode* node) :
-  d_typeNode(node),
-  d_nodeManager(nm) {
+Type::Type(NodeManager* nm, TypeNode* node)
+    : d_typeNode(node), d_nodeManager(nm) {
+  // This does not require a NodeManagerScope as this is restricted to be an
+  // internal only pointer initialization call.
 }
 
-Type::~Type() {
-  NodeManagerScope nms(d_nodeManager);
-  delete d_typeNode;
+Type::Type() : d_typeNode(new TypeNode), d_nodeManager(NULL) {
+  // This does not require a NodeManagerScope as `new TypeNode` is backed by a
+  // static expr::NodeValue::null().
 }
 
-Type::Type() :
-  d_typeNode(new TypeNode),
-  d_nodeManager(NULL) {
+Type::Type(const Type& t) : d_typeNode(NULL), d_nodeManager(t.d_nodeManager) {
+  NodeManagerScope nms(d_nodeManager);
+  d_typeNode = new TypeNode(*t.d_typeNode);
 }
 
-Type::Type(const Type& t) :
-  d_typeNode(new TypeNode(*t.d_typeNode)),
-  d_nodeManager(t.d_nodeManager) {
+Type::~Type() {
+  NodeManagerScope nms(d_nodeManager);
+  delete d_typeNode;
 }
 
 bool Type::isNull() const {