Claude Brisson resolved VELOCITY-752.
       Resolution: Fixed
         Assignee: Claude Brisson
    Fix Version/s: 2.x

Fixed by the patch from VELOCITY-841 (commit 1753788).

> Evaluation of macro arguments
> -----------------------------
>                 Key: VELOCITY-752
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-752
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 1.6.2
>         Environment: Windows XP SP2, Java 1.5
>            Reporter: Steve O'Hara
>            Assignee: Claude Brisson
>            Priority: Minor
>             Fix For: 2.x
> I've just come across a little gotcha that has taken a few hours to track 
> down which might help other people.
> An example;
> #macro(myMacro $FieldName)
>     #foreach ($Name in $FieldList)
>         #if ($FieldName=="empty")
>             #set ($tmp=$FieldsFound.put($FieldName,$velocityCount))
>         #end
>     #end
> #end
> #foreach ($X in $MyFields)
>     #myMacro("Field$velocityCount")
> #end
> All looks OK doesn't it, but........
> The problem is one of when arguments are evaluated or in fact to be more 
> precise, are not evaluated at all.
> Once you bear that in mind you can see the logical problem above - the use of 
> $velocityCount (or indeed any variable) in the argument list of myMacro i.e. 
> #myMacro("Field$velocityCount")
> This sort of usage is dangerous because in effect, what is happening is that 
> the macro argument literal is being placed within the macro body without 
> being evaluated first.
> So, the body of the macro becomes this;
>     #foreach ($Name in $FieldList)
>         #if ("Field$velocityCount"=="empty")
>             #set ($tmp=$FieldsFound.put("Field$velocityCount",$velocityCount)
>         #end
>     #end
> Not what you intended at all and depending on the names of your variables, 
> could cause all kinds of mayhem with values coming into scope that you hadn't 
> intended.
> The workaround is to set a variable before the call to the macro and send 
> that instead e.g.
> #foreach ($X in $MyFields)
>     #set ($tmp="Field$velocityCount")
>     #myMacro($tmp)
> #end

This message was sent by Atlassian JIRA

To unsubscribe, e-mail: dev-unsubscr...@velocity.apache.org
For additional commands, e-mail: dev-h...@velocity.apache.org

Reply via email to