[aspectc-user] where is the mistake ?

Olaf Spinczyk Olaf.Spinczyk at informatik.uni-erlangen.de
Wed Aug 3 18:24:00 CEST 2005


Hi,

I am rather sure that this is a known code generation problem of ac++ 
0.9.3. It happens if an aspect defines an introduction into a class for 
which it also defines code advice (execution and construction in your case).

You can avoid the problem by either using ac++ 0.9.2 or by using the 
joinpoint API to obtain the object reference instead of using the "that" 
pointcut function. By using the joinpoint API you avoid the need include 
setAsTree.h.

The next ac++ version will contain a fix for this problem.

Best regards,

Olaf


MeunS Meunier wrote:
> Hi, i need help to solve this little problem.
> 
> i use this command to weave my aspect : ac++.exe -c main.cc -o 
> weaved-main.cc -p . -a contract.ah
> 
> When i compile weaved-main.cc with cl (Visual .NET 2003), i obtain this 
> error message :
> 
> contract.ah(22) : error C2061: erreur de syntaxe : identificateur 
> 'setAsTree'
> 
> thank's in advance
> 
> Sylvain Meunier
> 
> ------------------------------------------------------- FILES 
> ------------------------------------------------------------
> 
> class header :
> 
> #ifndef __SETASTREE
> #define __SETASTREE
> 
> #include <iostream>
> 
> class setAsTree
> {
> public:
>     setAsTree(int v);
>     setAsTree(const setAsTree& set);
> 
>     virtual ~setAsTree();
> 
>     setAsTree& operator=(const setAsTree& set);
> 
>     void insert(int v);
>     setAsTree remove(int v);
> 
>     int min() const;
>     int max() const;
>     bool contains(int v) const;
> 
>     int val;
>     setAsTree* ltree,* rtree;
> 
>     friend std::ostream& operator<<(std::ostream& stream,const 
> setAsTree& set);
> 
> private:
>     void copy(const setAsTree& set);
>     void destroy();
> };
> 
> std::ostream& operator<<(std::ostream& stream,const setAsTree& set);
> 
> #endif
> 
> class sources :
> #include "./setAsTree.h"
> 
> using namespace std;
> 
> setAsTree::setAsTree(int v)
> {
>     ltree = NULL;
>     rtree = NULL;
>     val = v;
> }
> 
> setAsTree::setAsTree(const setAsTree& set)
> {
>     copy(set);
> }
> 
> setAsTree::~setAsTree()
> {
>     destroy();
> }
> 
> setAsTree& setAsTree::operator=(const setAsTree& set)
> {
>     copy(set);
>     return *this;
> }
> 
> void setAsTree::insert(int v)
> {
>     if(v > val)
>     {
>         if(rtree)
>             rtree->insert(v);
>         else
>             rtree = new setAsTree(v);
>     }
>     else if(v < val)
>     {
>         if(ltree)
>             ltree->insert(v);
>         else
>             ltree = new setAsTree(v);
>     }
> 
> }
> 
> setAsTree setAsTree::remove(int v)
> {
>     return *this;
> }
> 
> int setAsTree::min() const
> {
>     if(ltree)
>         return ltree->max();
>     else
>         return val;
> }
> 
> int setAsTree::max() const
> {
>     if(rtree)
>         return rtree->max();
>     else
>         return val;
> }
> 
> bool setAsTree::contains(int v) const
> {
>     if(val == val)
>         return true;
>     else if(v > val && rtree)
>         return rtree->contains(v);
>     else if(v < val && ltree)
>         return ltree->contains(v);
>     else
>         return false;
> }
> 
> void setAsTree::copy(const setAsTree& set)
> {
>     if(this == &set)
>         return;
> 
>     destroy();
> 
>     if(set.ltree)
>         ltree = new setAsTree(*set.ltree);
>     else
>         ltree = NULL;
> 
>     if(set.rtree)
>         rtree = new setAsTree(*set.rtree);
>     else
>         rtree = NULL;
> 
>     val = set.val;
> }
> 
> void setAsTree::destroy()
> {
>     if(rtree)
>     {
>         delete rtree;
>         rtree = NULL;
>     }
> 
>     if(ltree)
>     {
>         delete ltree;
>         ltree = NULL;
>     }
> }
> 
> std::ostream& operator<<(std::ostream& stream,const setAsTree& set)
> {
>     if(set.ltree)
>         stream << *set.ltree;
> 
>     stream << set.val << " ";
> 
>     if(set.rtree)
>         stream << *set.rtree;
> 
>     return stream;
> }
> 
> the aspect:
> 
> #ifndef __CONTRACT
> #define __CONTRACT
> 
> #include <iostream>
> #include "./setAsTree.h"
> 
> aspect contract
> {
>     pointcut check_invariant(setAsTree& s) =
>         (execution("% setAsTree::%(...)") || construction("setAsTree")) 
> && that(s);
> 
> public:
>     advice check_invariant(s) : after(setAsTree& s)
>     {
> 
>     }
> 
>     advice "setAsTree" : bool invariant() const
>     {
>         return true;
>     }
> };
> 
> #endif
> 
> main file:
> #include "./setAsTree.h"
> #include <iostream>
> 
> using namespace std;
> 
> int main(int argc,char** argv)
> {
>     setAsTree set(4);
> 
>     set.insert(2);
>     set.insert(3);
>     set.insert(1);
>     set.insert(2);
> 
>     cout << set << endl;
> 
>     return 0;
> }
> 
> -------------------------------
> 
> _________________________________________________________________
> Bénéficiez de 250 Mo de stockage avec MSN Hotmail 
> http://g.msn.fr/FR1001/866
> 
> _______________________________________________
> aspectc-user mailing list
> aspectc-user at aspectc.org
> http://www.aspectc.org/mailman/listinfo/aspectc-user




More information about the aspectc-user mailing list