[aspectc-user] one more bug (private classes)
Olaf Spinczyk
os at aspectc.org
Thu Dec 4 12:56:30 CET 2008
Hi Leandro,
thanks for reporting this problem. I have filed it under Bugzilla ID 368
and will look into it ASAP.
- Olaf
Leandro Costa wrote:
> Now I have problems with private classes:
> * C is my main class;
> * D is a private class declared inside C;
> * if, inside a method of class C, I declare an object of class D and
> use it as parameter for another method, AspectC++ will generate
> invalid source code.
>
> The problem is that AspectC++ generates a procedure to be called
> inside the first method, and this procedure can't access the private
> class D:
>
> __attribute__((always_inline)) inline void __call__ZN1C3fooEv_0_0 (::C
> *srcthis, void (::C::* fptr)(::C::D *), ::C *dstthis, ::C::D * arg0){
> AC::invoke_AspC_AspC_a0_before ();
> (dstthis->*fptr)(arg0);
> }
>
> ---
>
> The workaround is don't include methods that receive private classes
> as paremeters in your pointcuts:
> ...
> pointcut methods () = call ("% C::%(...)" && ! "void C::foo (C::D*)");
> ...
>
> ---
>
> leandro.costa at hydrus:~/personal/aspects/bug2> more C.h C.cc C.ah
> ::::::::::::::
> C.h
> ::::::::::::::
> #ifndef _C_H_
> #define _C_H_
>
> class C
> {
> private:
> class D { };
>
> void foo ();
> void foo (D *pD);
> };
>
> #endif
> ::::::::::::::
> C.cc
> ::::::::::::::
> #include "C.h"
>
> void C::foo ()
> {
> D d;
> foo (&d);
> }
>
> void C::foo (D *pD) { }
> ::::::::::::::
> C.ah
> ::::::::::::::
> #ifndef _C_AH_
> #define _C_AH_
>
> aspect AspC
> {
> public:
> pointcut methods () = call ("% C::%(...)");
>
> advice methods () : before () { }
> };
>
> #endif
> leandro.costa at hydrus:~/personal/aspects/bug2> ac++ -v1 -k -p .
> --config puma.config -c C.cc -o C.acc -a C.ah
> * Running ac++ 1.0pre4 svn
> * Handling Translation Unit `C.cc'.
> * Inserting unit pro- and epilogues
> * Updating #line directives of generated code fragments
> * Saving
> * Done
> leandro.costa at hydrus:~/personal/aspects/bug2> g++ -O -x c++ -g -Wall
> -Werror -c C.acc -o C.o
> C.h: In function `void __call__ZN1C3fooEv_0_0(C*, void (C::*)(C::D*), C*,
> C::D*)':
> C.h:7: error: `class C::D' is private
> C.acc:134: error: within this context
> C.h:7: error: `class C::D' is private
> C.acc:134: error: within this context
> leandro.costa at hydrus:~/personal/aspects/bug2>
>
>
>
> --
> _____________________________________________
>
> Leandro Souza Costa
>
> "A vitória se encastela em jardins encantadores,
> mas para se chegar a ela não há caminho de flores"
> _____________________________________________
> ------------------------------------------------------------------------
>
> _______________________________________________
> 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