diff options
author | Christopher L. Conway <christopherleeconway@gmail.com> | 2010-07-28 22:57:36 +0000 |
---|---|---|
committer | Christopher L. Conway <christopherleeconway@gmail.com> | 2010-07-28 22:57:36 +0000 |
commit | 88766918615793536224bf50d0bb70ec9f9efd93 (patch) | |
tree | 5a038bb2c17199f43d7a422063751bc3839b7388 /src/expr/node_manager.h | |
parent | d2787f41e72184fbdf2619d3c0466bed9b6211be (diff) |
Forcing a type check on Node construction in debug mode (Fixes: #188)
NOTE: mkNode/mkExpr/parsing functions can now throw type checking exceptions
Diffstat (limited to 'src/expr/node_manager.h')
-rw-r--r-- | src/expr/node_manager.h | 70 |
1 files changed, 55 insertions, 15 deletions
diff --git a/src/expr/node_manager.h b/src/expr/node_manager.h index 7a53cabfc..b7c7f871e 100644 --- a/src/expr/node_manager.h +++ b/src/expr/node_manager.h @@ -242,6 +242,12 @@ class NodeManager { // bool containsDecision(TNode); // is "atomic" // bool properlyContainsDecision(TNode); // all children are atomic + template <unsigned nchild_thresh> + Node doMkNode(NodeBuilder<nchild_thresh>&); + + template <unsigned nchild_thresh> + Node* doMkNodePtr(NodeBuilder<nchild_thresh>&); + public: NodeManager(context::Context* ctxt); @@ -779,61 +785,91 @@ inline TypeNode NodeManager::mkSort(const std::string& name) { return type; } +template <unsigned nchild_thresh> +inline Node NodeManager::doMkNode(NodeBuilder<nchild_thresh>& nb) { + Node n = nb.constructNode(); + if( Configuration::isDebugBuild() ) { + // force an immediate type check + getType(n,true); + } + return n; +} + +template <unsigned nchild_thresh> +inline Node* NodeManager::doMkNodePtr(NodeBuilder<nchild_thresh>& nb) { + Node* np = nb.constructNodePtr(); + if( Configuration::isDebugBuild() ) { + // force an immediate type check + getType(*np,true); + } + return np; +} + + inline Node NodeManager::mkNode(Kind kind, TNode child1) { - return NodeBuilder<1>(this, kind) << child1; + NodeBuilder<1> nb(this, kind); + nb << child1; + return doMkNode(nb); } inline Node* NodeManager::mkNodePtr(Kind kind, TNode child1) { NodeBuilder<1> nb(this, kind); nb << child1; - return nb.constructNodePtr(); + return doMkNodePtr(nb); } inline Node NodeManager::mkNode(Kind kind, TNode child1, TNode child2) { - return NodeBuilder<2>(this, kind) << child1 << child2; + NodeBuilder<2> nb(this, kind); + nb << child1 << child2; + return doMkNode(nb); } inline Node* NodeManager::mkNodePtr(Kind kind, TNode child1, TNode child2) { NodeBuilder<2> nb(this, kind); nb << child1 << child2; - return nb.constructNodePtr(); + return doMkNodePtr(nb); } inline Node NodeManager::mkNode(Kind kind, TNode child1, TNode child2, TNode child3) { - return NodeBuilder<3>(this, kind) << child1 << child2 << child3; + NodeBuilder<3> nb(this, kind); + nb << child1 << child2 << child3; + return doMkNode(nb); } inline Node* NodeManager::mkNodePtr(Kind kind, TNode child1, TNode child2, TNode child3) { NodeBuilder<3> nb(this, kind); nb << child1 << child2 << child3; - return nb.constructNodePtr(); + return doMkNodePtr(nb); } inline Node NodeManager::mkNode(Kind kind, TNode child1, TNode child2, TNode child3, TNode child4) { - return NodeBuilder<4>(this, kind) << child1 << child2 << child3 << child4; + NodeBuilder<4> nb(this, kind); + nb << child1 << child2 << child3 << child4; + return doMkNode(nb); } inline Node* NodeManager::mkNodePtr(Kind kind, TNode child1, TNode child2, TNode child3, TNode child4) { NodeBuilder<4> nb(this, kind); nb << child1 << child2 << child3 << child4; - return nb.constructNodePtr(); + return doMkNodePtr(nb); } inline Node NodeManager::mkNode(Kind kind, TNode child1, TNode child2, TNode child3, TNode child4, TNode child5) { - return NodeBuilder<5>(this, kind) << child1 << child2 << child3 << child4 - << child5; + NodeBuilder<5> nb(this, kind); + nb << child1 << child2 << child3 << child4 << child5; + return doMkNode(nb); } inline Node* NodeManager::mkNodePtr(Kind kind, TNode child1, TNode child2, TNode child3, TNode child4, TNode child5) { NodeBuilder<5> nb(this, kind); nb << child1 << child2 << child3 << child4 << child5; - return nb.constructNodePtr(); + return doMkNodePtr(nb); } // N-ary version @@ -841,14 +877,18 @@ template <bool ref_count> inline Node NodeManager::mkNode(Kind kind, const std::vector<NodeTemplate<ref_count> >& children) { - return NodeBuilder<>(this, kind).append(children); + NodeBuilder<> nb(this, kind); + nb.append(children); + return doMkNode(nb); } template <bool ref_count> inline Node* NodeManager::mkNodePtr(Kind kind, const std::vector<NodeTemplate<ref_count> >& children) { - return NodeBuilder<>(this, kind).append(children).constructNodePtr(); + NodeBuilder<> nb(this, kind); + nb.append(children); + return doMkNodePtr(nb); } // N-ary version for operators @@ -860,7 +900,7 @@ inline Node NodeManager::mkNode(TNode opNode, NodeBuilder<> nb(this, kind::operatorKindToKind(opNode.getKind())); nb << opNode; nb.append(children); - return nb; + return doMkNode(nb); } template <bool ref_count> @@ -870,7 +910,7 @@ inline Node* NodeManager::mkNodePtr(TNode opNode, NodeBuilder<> nb(this, kind::operatorKindToKind(opNode.getKind())); nb << opNode; nb.append(children); - return nb.constructNodePtr(); + return doMkNodePtr(nb); } |