[aspectc-user] Any way to 'Declare error'
Mike Mortensen
mike-mortensen at comcast.net
Sun Jan 8 15:40:13 CET 2006
Daniel's solution worked great -- thank you!
-Mike
----- Original Message -----
From: "Olaf Spinczyk" <Olaf.Spinczyk at informatik.uni-erlangen.de>
To: <aspectc-user at aspectc.org>
Sent: Sunday, January 08, 2006 3:20 AM
Subject: Re: [aspectc-user] Any way to 'Declare error'
> this is a message from Daniel Lohmann, which was automatically discarded
> by mailman, because of a wrong reply address in the mail header.
> Therefore, I post this reply on his behalf.
>
> - Olaf
>
> ==>
>
> Hi Mike,
>
>> I also tried another C++ trick, you can declare a template with a name
>> that indicates the issue:
>>
>> template <bool> struct DirectCallOf__StartTimer;
>> template <> struct DirectCallOf__StartTimer<true> {};
>>
>> and then instantiate it in the advice body with the unspecialized
>> (unimplemented) flavor:
>>
>> DirectCallOf__StartTimer<false>;
>>
>> But this doesn't work either, because then the instantiation of
>> DirectCallOf__StartTimer<false> is
>> in the Aspect body in the generated C++ code, and the template
>> instantiation fails (as expected), but it fails regardless of whether or
>> not the any code uses the join point since the aspect itself is
>> (correctly) created in the generated code regardless of whether or not
>> its advise is actually 'called' from anywhere that matches the joinpoint.
>>
> This is because the compiler knows everything to fully instantiate the
> template when parsing the advice body - and so, with accordance to the C++
> standard, it does. You need just to add another template parameter and
> pass some joinpoint-specific type for it:
>
> template <typename JP, bool> struct DirectCallOf__StartTimer;
> template <typename JP> struct DirectCallOf__StartTimer<JP, true> {};
>
> aspect Test {
> advice call("% foo()") : before() {
> DirectCallOf__StartTimer< JoinPoint, false >();
> }
> };
>
> void foo() {}
>
> int main() {
> // if uncommented, compile-time error is thrown
> // foo();
> }
>
> As the advice code now uses the static joinpoint API, ac++ transform the
> advice code into a template method that is instantiated with the actual
> joinpoint information. If the pointcut does not match any joinpoint, the
> advice template and in turn the DirectCallOf__XXX template is never
> instantiated.
>
>
>
> Hope that helps
>
> Daniel
> _______________________________________________
> 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