aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-02-13 17:14:34 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-02-13 17:14:34 +0200
commit659becd6e989883ebe7c401366d72a5ae1eabf92 (patch)
treea4c7d8055b081efddacd7fbea60981903c6f086f
parent2414c47a24323cf3e34a744bdaa3429b42310357 (diff)
Treat types with polymorphic elements as recursive
-rw-r--r--xsde/cxx/hybrid/tree-size-processor.cxx40
1 files changed, 29 insertions, 11 deletions
diff --git a/xsde/cxx/hybrid/tree-size-processor.cxx b/xsde/cxx/hybrid/tree-size-processor.cxx
index 6aa05b2..6b3b978 100644
--- a/xsde/cxx/hybrid/tree-size-processor.cxx
+++ b/xsde/cxx/hybrid/tree-size-processor.cxx
@@ -62,8 +62,10 @@ namespace CXX
//
struct Particle: Traversal::Element
{
- Particle (Boolean& fixed, Traversal::NodeBase& type_traverser)
- : fixed_ (fixed), type_traverser_ (type_traverser)
+ Particle (Boolean& fixed,
+ Boolean& poly,
+ Traversal::NodeBase& type_traverser)
+ : fixed_ (fixed), poly_ (poly), type_traverser_ (type_traverser)
{
}
@@ -76,6 +78,9 @@ namespace CXX
SemanticGraph::Type& t (e.type ());
type_traverser_.dispatch (t);
+ if (t.context ().count ("polymorphic"))
+ poly_ = true;
+
if (fixed_)
{
if (e.max () != 1)
@@ -98,6 +103,7 @@ namespace CXX
private:
Boolean& fixed_;
+ Boolean& poly_;
Traversal::NodeBase& type_traverser_;
};
@@ -105,8 +111,10 @@ namespace CXX
Traversal::Choice,
Traversal::Sequence
{
- Compositor (Boolean& fixed, Traversal::NodeBase& type_traverser)
- : fixed_ (fixed), type_traverser_ (type_traverser)
+ Compositor (Boolean& fixed,
+ Boolean& poly,
+ Traversal::NodeBase& type_traverser)
+ : fixed_ (fixed), poly_ (poly), type_traverser_ (type_traverser)
{
}
@@ -122,7 +130,7 @@ namespace CXX
Boolean fixed = true;
{
- Particle particle (fixed, type_traverser_);
+ Particle particle (fixed, poly_, type_traverser_);
Traversal::ContainsParticle contains_particle;
contains_particle >> particle;
@@ -148,8 +156,8 @@ namespace CXX
Boolean fixed = true;
{
- Particle particle (fixed, type_traverser_);
- Compositor compositor (fixed, type_traverser_);
+ Particle particle (fixed, poly_, type_traverser_);
+ Compositor compositor (fixed, poly_, type_traverser_);
Traversal::ContainsParticle contains_particle;
contains_particle >> compositor >> contains_particle;
@@ -173,8 +181,8 @@ namespace CXX
Boolean fixed = true;
{
- Particle particle (fixed, type_traverser_);
- Compositor compositor (fixed, type_traverser_);
+ Particle particle (fixed, poly_, type_traverser_);
+ Compositor compositor (fixed, poly_, type_traverser_);
Traversal::ContainsParticle contains_particle;
contains_particle >> compositor >> contains_particle;
@@ -191,6 +199,7 @@ namespace CXX
private:
Boolean& fixed_;
+ Boolean& poly_;
Traversal::NodeBase& type_traverser_;
};
@@ -364,8 +373,10 @@ namespace CXX
//
if (c.contains_compositor_p ())
{
- Particle particle (fixed, *this);
- Compositor compositor (fixed, *this);
+ Boolean poly (false);
+
+ Particle particle (fixed, poly, *this);
+ Compositor compositor (fixed, poly, *this);
Traversal::ContainsCompositor contains_compositor;
Traversal::ContainsParticle contains_particle;
@@ -375,6 +386,13 @@ namespace CXX
contains_particle >> particle;
Complex::contains_compositor (c, contains_compositor);
+
+ // If this element's type is polymorphic then mark this type as
+ // recursive. The set of derived types is open-ended and one of
+ // them may create a cycle involving this type.
+ //
+ if (poly)
+ ctx.set ("recursive", true);
}
// Check attributes.