From 0690c1c9c01dd5889dbfccf2da6cb99f5c4e151b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 3 Nov 2003 20:30:40 +0000 Subject: * Work around problems with the ATerm library. The ATerm library doesn't search the heap for pointers to ATerms when garbage collecting. As a result, C++ containers such as `map' will cause pointer to be hidden from the garbage collector, causing crashes. Instead, we now use ATermTables. --- src/fix-ng/fix-expr.hh | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) (limited to 'src/fix-ng/fix-expr.hh') diff --git a/src/fix-ng/fix-expr.hh b/src/fix-ng/fix-expr.hh index 700f7beca906..93a010abeda6 100644 --- a/src/fix-ng/fix-expr.hh +++ b/src/fix-ng/fix-expr.hh @@ -14,6 +14,38 @@ typedef ATerm Expr; +/* Mappings from ATerms to ATerms. This is just a wrapper around + ATerm tables. */ +class ATermMap +{ +private: + unsigned int maxLoadPct; + ATermTable table; + +public: + ATermMap(unsigned int initialSize = 16, unsigned int maxLoadPct = 75); + ATermMap(const ATermMap & map); + ~ATermMap(); + + void set(ATerm key, ATerm value); + void set(const string & key, ATerm value); + + ATerm get(ATerm key) const; + ATerm get(const string & key) const; + + void remove(ATerm key); + void remove(const string & key); + + ATermList keys() const; +}; + + +/* Convert a string to an ATerm (i.e., a quoted nullary function + applicaton). */ +ATerm string2ATerm(const string & s); +string aterm2String(ATerm t); + + /* Generic bottomup traversal over ATerms. The traversal first recursively descends into subterms, and then applies the given term function to the resulting term. */ @@ -25,19 +57,17 @@ ATerm bottomupRewrite(TermFun & f, ATerm e); /* Query all attributes in an attribute set expression. The expression must be in normal form. */ -typedef map Attrs; -void queryAllAttrs(Expr e, Attrs & attrs); +void queryAllAttrs(Expr e, ATermMap & attrs); /* Query a specific attribute from an attribute set expression. The expression must be in normal form. */ Expr queryAttr(Expr e, const string & name); /* Create an attribute set expression from an Attrs value. */ -Expr makeAttrs(const Attrs & attrs); +Expr makeAttrs(const ATermMap & attrs); /* Perform a set of substitutions on an expression. */ -typedef map Subs; -ATerm substitute(Subs & subs, ATerm e); +Expr substitute(const ATermMap & subs, Expr e); #endif /* !__FIXEXPR_H */ -- cgit 1.4.1