[
https://issues.apache.org/jira/browse/VELOCITY-752?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
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
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]