[ 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: dev-unsubscr...@velocity.apache.org For additional commands, e-mail: dev-h...@velocity.apache.org